Java 中多个项目同时执行,如何避免同时扫描到同一条数据

2020-05-23 15:08:36 +08:00
 Saurichthys

各位大佬,项目是这样子的 存在多个定时处理数据的项目,项目是一样的,只是端口不一样,实现效果是对相同的一个库的一张表进行查询与修改操作(每次都是取最新时间的十条数据),但是这样子好像数据又会冲突,如何避免这种情况

4801 次点击
所在节点    Java
30 条回复
Saurichthys
2020-05-23 23:04:11 +08:00
@fewok 你好,一个任务扫出来,那就需要在创建一个项目来做这个事情了, 然后你原来项目的业务逻辑都要改了,之前是针对数据库,现在要针对这个任务转为接收数据执行业务逻辑。
目前综合各位大佬的意见,我觉得分布式锁 Redis 的方案可能会比较好一点,任务启动,执行的数据 key 锁住 + expireTime,其他任务并发任务执行到这条数据 有 key 就跳过!!!
gtexpanse
2020-05-23 23:16:31 +08:00
分布式锁太麻烦了吧,db 加一列 runhost,大家都同时去 update runhost is null 的,然后再去查询一下就拿到只属于自己的任务了
wujieyuan
2020-05-23 23:22:50 +08:00
上面回答什么分布锁啊, 消息队列啊都太麻烦了, 其实有个非常简单的方法, 也无需修改代码,可以读指定路径下的文件, 如果有就执行,没有就不执行, 想让哪台机器执行任务就在那台机器上放上指定的文件,其他机器就不会执行啦, 日后不管怎么换服务器都不用修改代码
fewok
2020-05-23 23:27:33 +08:00
@Saurichthys 为啥要创建服务,所有服务的 ip 挨个发送下消息等结果,不就完事了。可以用中间件的话,直接扔 MQ 。。。
micean
2020-05-23 23:34:59 +08:00
为什么要分布式锁啊……数据库开事务锁呗
xyjincan
2020-05-23 23:37:13 +08:00
把代码改改,写操作抽象出来,单独部署
laball
2020-05-24 00:08:06 +08:00
这个设计方案感觉有问题啊,建议使用下次队列+多个消费者的模式,每次增加一条记录,即往 MQ 中放入一个任务,然后,让多个消费者去处理,这样,每条数据,都能处理到,描述中关于取最新时间的 10 条数据,逻辑上是存在问题的,因为有可能会出现有数据没有被取到的情况,这样就有些数据处理了,有些数据没有处理,存在不一致的情况;
abcbuzhiming
2020-05-24 14:43:23 +08:00
@Saurichthys 你为什么觉得低?你的数据真多到了一个线程跑不够的地步?那你首先要考虑的是需要一个生产者模型来分配任务,为了保证任务不重复,你生产的时候是要加锁的,加锁后性能也就那样。你觉得你到了这一步了吗?
lidlesseye11
2020-05-24 17:01:23 +08:00
什么叫“每次都是取最新时间的十条数据”。。
比如现在表里一共 20 条,A 取了 10 条最新的,这时候 B 进来是和 A 抢锁?还是取剩下的 10 条?还是等新的 10 条进来?
Saurichthys
2020-05-24 21:55:42 +08:00
@lidlesseye11 是和 A 抢锁的呀, 都是处理最新的十条数据, 但是这十条可能 A 处理 也有 B 加载到需要处理呀,这不就很矛盾了吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674673

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX