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

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

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

4582 次点击
所在节点    Java
30 条回复
xuanbg
2020-05-23 15:35:50 +08:00
分布式锁是唯一解决方案
yc8332
2020-05-23 15:40:39 +08:00
搞个 redis 锁。或者把数据维护到 redis,只保留 10 条数据。。每次直接从 redis 取
huhu3312
2020-05-23 15:42:11 +08:00
这种跑一个定时任务不就好了
Saurichthys
2020-05-23 15:51:23 +08:00
@huhu3312 一个定时任务效率太低了呀- -
coder2019
2020-05-23 17:14:46 +08:00
@Saurichthys 感觉没啥意义,操作的是同个库同个表,修改数据会加锁,瓶颈在数据库上,跑多个定时任务有啥效率提升吗
skypyb
2020-05-23 17:30:21 +08:00
。。。 就分布式锁就完事了呗
jugelizi
2020-05-23 18:06:58 +08:00
...上消息队列吧
yjxjn
2020-05-23 18:10:45 +08:00
悲观锁?
ak78
2020-05-23 18:12:29 +08:00
1 、分布式锁(推荐) 2 、通过数据库乐观锁加上更新条件,条件不满足自然更新不到。3 、不同的机器粉笔通过相关表 id%取模来达到取到不同的数据(不推荐)
huntcool001
2020-05-23 18:16:26 +08:00
redisson 里有包装好的 redis 客户端

或者用 xxl-job 一类的分布式框架, 有一台机子执行就行了
fmumu
2020-05-23 18:19:31 +08:00
查询修改?乐观锁行吧
xizismile
2020-05-23 18:51:20 +08:00
@huntcool001 +1,用 xxl-job
luckyrayyy
2020-05-23 19:10:00 +08:00
分布式锁,或者十个并发并不大,数据库加个 version 字段乐观锁
luozic
2020-05-23 19:36:17 +08:00
最简单的令牌桶,漏斗,麻烦点,消息队列。
vchat
2020-05-23 19:49:20 +08:00
可以这样, 多台机器 启动通过争抢的方式获取 leader 用来作为调度器 负责将来取数据库数据到缓存队列中,其他机器从缓存中获取数据处理更新数据表
lyyhello
2020-05-23 22:00:57 +08:00
xxl-job-gateway 投递-mq-应用系统消费(多几个消费端 多几个消费线程) 完美解决
lyyhello
2020-05-23 22:01:24 +08:00
xxl-job>gateway 投递>mq>应用系统消费(多几个消费端 多几个消费线程) 完美解决
lyyhello
2020-05-23 22:09:52 +08:00
方案二(垃圾方案 但是对你来说可能是改动最小的 主机名注册到一张表里面 server_config 配置处理序号 ),再从业务表里面挑出一个唯一字段 选取任务的时候进行 hash 然后取模 命中配置处理序号的,就有本台主机处理。 优点就是不加锁不用中间件 缺点就是主机挂了。有部分数据处理不到。只有等主机上线了。 有需要可以找我私聊。帮助大佬是我的美德
aaahhh123
2020-05-23 22:47:25 +08:00
666
fewok
2020-05-23 22:49:06 +08:00
本质就是错的,为啥不一个定时任务扫出来,再发给其他机器协同处理呢??

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

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

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

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

© 2021 V2EX