老师你好,worker如果同时跑两个,同一时间段任务可能会执行两次,这样会不会有问题?

来源:8-10 监听etcd中的强杀任务通知

hehehei

2019-02-17

如果两个worker同时运行,当执行同一个任务时,会有两种情况。如果当前woker的任务正在执行,另一个woker执行相同任务会因为有锁而执行失败,也就是说一个任务只在一个worker中执行成功;当一个woker执行完后另一个woker才执行这个任务,同一个任务在两个worker中都能执行成功。所以目前worker的逻辑是否不严谨?
目前目前任务的执行信息都是在当前worker的内存中,这样只能防止当前worker不去重复执行自己的任务,而不能防止其他worker执行同样任务。woker的执行状态是否也需要放到etcd中进行维护?

写回答

1回答

小鱼儿老师

2019-02-21

同学好,防止并发的思路就是上锁,现在无非是N个worker抢一把分布式锁。


因为所有机器的时钟基本一样,所以同一时刻拉起任务只有一个worker能成功,其他的worker需要等待下次调度。


特殊场景是,job瞬间退出,那么因为时钟的差异,可能会多个worker出现接连的执行,但这种场景对于遵循幂等性的实现来说不是问题。


另外一种调度任务的架构,就是master管理调度,在etcd指派任务到worker,由单个worker来负责某个任务,这种可以避免抢占。

0
1
weixin_慕设计0100580
老师好,关于您说的这个特殊场景,如果一个worker的时钟比较快,先拿到了锁,但是job瞬间推出了,那么其他时钟比较慢的节点可能刚好到达这个job执行的时间,会造成job被重复执行的情况, 我理解咱们这种架构是解决不了这个问题的对吗?
2022-08-19
共1条回复

Go语言开发分布式任务调度 轻松搞定高性能Crontab

分布式系统设计+高并发细节处理,一次性让你“晋级”到位

1136 学习 · 177 问题

查看课程