1
zhady009 2021-12-01 11:26:18 +08:00
用一个 BlockingQueue 的分布式实现 比如 Redisson 里的
线程池用这个队列来创建 |
2
BigBrother1024 2021-12-01 13:39:40 +08:00 via iPhone
用 actor 模型
|
3
Saxton 2021-12-01 13:43:25 +08:00
这不就是典型的队列吗
|
5
teem 2021-12-01 14:09:48 +08:00
TDMQ
|
6
Itoktsnhc 2021-12-01 17:09:02 +08:00
很像是 kafka 的一套东西
多条队列(或者队列内分区)(q1,q2,q3) 1. 消息在队列内的分布上需要考虑同一个 UserId 的消息有 FIFO 的顺序。(UserId Hash 保证落到同一个队列 /分区内) 2. 每一个队列(分区)的接收者需要做绑定,用类似锁的机制处理 receive 的断链和补位 q1->r1 |
7
siweipancc 2021-12-01 18:24:26 +08:00 via iPhone
用户任务表与对应的独占队列. 先拿不存在执行时间点的锁(按顺序遍历立马返回),pop 任务,写执行时间点到任务表。任务完成做行移除。视业务重要程度需要一个守护线程做失败任务重新提交
|
8
wqhui 2021-12-01 19:22:01 +08:00
@keshao 为什么要空转,redis 里面一个用户一个 list (里面放这个用户要执行的导入任务,比如文件名),当你一个线程要提交任务的时候,先去查一下 redis 有没这个 list ,把执行任务需要的参数加到这个 list 末尾,如果原本没有这个 list ,代表现在这个用户没有执行着的任务,启动一个工作线程去执行,工作线程完成当前任务后,检查下自己这个用户的 list 是不是空的,空的就删除这个 list 结束工作线程,不空就在这 list 取下一个任务执行。参考下 netty
|
9
night98 2021-12-01 20:42:03 +08:00
rocketmq 顺序消息,用户 id 做 msg id ,完事,其他的就是楼上说的,手动实现单用户队列,创建线程处理
|
10
Jooooooooo 2021-12-01 20:55:37 +08:00
你了解下消息队列
要处理的任务统一往队列发 然后消费线程设置成 1, 就是一个消息一个消息串行消费了 |