xuxueli / xxl-job

A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
http://www.xuxueli.com/xxl-job/
GNU General Public License v3.0
27.62k stars 10.93k forks source link

任务重复执行 #1886

Open Kang-shen opened 4 years ago

Kang-shen commented 4 years ago

先贴几张图,看看效果: image image image image

环境和版本说明:xxl-job版本为2.1.2;调度器和执行器都是通过k8s部署了3个节点 如图一所示,同一个任务在同一时间执行了3次,分别由不同的调度器调度,因为路由策略选的是一致性HASH,所以同一个任务的执行器是在同一个机器执行。

想问下,这种情况升级到最新版本能解决吗?还是说可以通过其他设置能避免这种问题? @xuxueli 因为我们对这个框架做了比较多的自定义开发,升级版本的成本要高一些,还请告知一下,谢谢!

jipeigong commented 4 years ago

我也出现同样的问题 20200821112355 20200821112419 20200821112412

Kang-shen commented 4 years ago

我目前线上暂时只用了一个调度中心。测试环境部署多个就会概率性出现这种问题,而且概率还不低,无奈只能这样。作者也没有说法,很尴尬。

jipeigong commented 4 years ago

我这边出现的概率奇高接近90%,再研究一段时间,降低版本再试试,一直无法解决只能放弃了,生产环境重复任务太致命了,目前我也是只保留了一台调度中心

jipeigong commented 4 years ago

问题已解决:问题是批量执行sql脚本时此INSERT INTO xxl_job_lock ( lock_name) VALUES ( 'schedule_lock');脚本没生效,导致DB锁未生效

Kang-shen commented 4 years ago

谢谢反馈。那我的问题可能和你还不太一样,我测试环境这个数据是有的。我这边压测出现的概率是比较低的,一万次调度差不多有20-30笔重复执行的。

jipeigong commented 4 years ago

少量重复建议做个redis锁和幂等

sshzhang commented 4 years ago

@jipeigong 能详细讲一下如何解决的吗?

kkliuxin commented 4 years ago

我也遇到这个问题,看代码xxl_job_lock这个表感觉没用,有人解决吗

stormsend commented 2 years ago

xxl_job_lock这个是排它锁,会阻塞,如果持有锁的线程释放了,会出现重复执行

itwujt commented 2 months ago

如果持有锁的线程释放了,会出现重复执行

问题是 select for update 锁完表之后,调度线程会修改了任务下次触发的时候再 commit。commit 之后令一个节点才能获取到锁再去执行任务的查询。 所以持有锁的线程释放是指?第一个 commit 了?那就不应该重复执行啊。 我现在也遇到这个问题了,看上去像是没锁住,但是我用两个 session 分别去读数据,发现确实是上锁了。