多个微服务做定时任务,如何做负载均衡

部署多个微服务,业务逻辑都是一样的,就是做定时任务。在spring cloud中如何均匀的让每个微服务都做定时任务,互相不冲突

阅读 10.1k
6 个回答

一个办法就是用任务队列,将任务发布到队列里,然后让空闲的微服务自动去领取。这样就不会有冲突了。

是负载均衡的每个节点都要运行定时任务,还是要确保有且只有一个节点执行任务?
如果是前者的话,直接VM里单起一条线程就OK了啊

  1. 发延迟消息

  2. 设置互斥锁,例如给 redis 设置一个 nx 的 key

  3. 采用 zookeeper 的选举机制做定时任务,springcloud 的话 eureka 应该也会有类似的机制吧

新手上路,请多包涵

不复杂的情况,可以使用数据库来简单实现。
像mysql有内置的程序锁函数:
get_lock() // 获取锁
release_lock() // 释放锁

具体的函数使用可以查看mysql的函数介绍
使用这种方式来控制分布式任务切换有个注意事项,这个锁的获取和释放是和数据库连接相关,一个连接创建的锁只能这个连接自己释放,这就需要在数据库连接池做改动,不过最简单还是直接原生jdbc获取数据库连接,不使用连接池来获取连接,拿到锁,执行该微服务的任务,任务完成后使用该连接释放锁。做小数量分布式任务切换没问题,大数量就得考虑复杂的切换框架了……

新手上路,请多包涵

可以尝试将定时任务做成一个微服务,然后外部使用诸如elastic job之类的调度框架去定时调用微服务

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏