1 zhady009 2021-12-01 11:26:18 +08:00 用一个 BlockingQueue 的分布式实现 比如 Redisson 里的 线程池用这个队列来创建 |
![]() | 2 jmperdev 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 用户任务表与对应的独占队列. 先拿不存在执行时间点的锁(按顺序遍历立马返回),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, 就是一个消息一个消息串行消费了 |