之前面试被问到,延迟消息是怎么实现的,kafka 是不支持延迟的,当时答的不好,面试官建议我下来以后了解下延迟消息的实现算法 我发现用 Thread.sleep 不就能很简单的实现延迟的执行一个消息吗,可能存在的问题就是当需要延迟的消息过多的时候,可能会创造过多的线程导致栈溢出,现存的几个延迟消息的实现有时间轮算法,有基于 delayQueue 的 sheduleThreadPool ,大家怎么看这个问题呢
之前面试被问到,延迟消息是怎么实现的,kafka 是不支持延迟的,当时答的不好,面试官建议我下来以后了解下延迟消息的实现算法 我发现用 Thread.sleep 不就能很简单的实现延迟的执行一个消息吗,可能存在的问题就是当需要延迟的消息过多的时候,可能会创造过多的线程导致栈溢出,现存的几个延迟消息的实现有时间轮算法,有基于 delayQueue 的 sheduleThreadPool ,大家怎么看这个问题呢
1
viosey Sep 10, 2022 via iPhone
有一种方案是创建一个 delay topic ,等到延时时间到了再转发给业务 topic
|
2
documentzhangx66 Sep 10, 2022
你用 Thread.sleep 实现延迟,程序崩了或系统宕机,数据就丢了。
生产系统一般是用数据库来实现延迟并保证数据不丢失。 |
3
Ayanokouji Sep 10, 2022
如果延迟一天或一个月呢,中间服务重启了呢
|
4
javapythongo Sep 10, 2022
可以看下 RocketMQ 的延迟消息实现
|
5
xmh51 Sep 10, 2022
其实估计面试官想问怎么用 kafka 的分片有序的特性来实现延迟消息。。
|
6
dushixiang Sep 10, 2022 via iPhone
|
7
BBCCBB Sep 10, 2022 要考虑的是如何支持大量, 任意延时时间的延时消息. 你这些 delayQueue 什么的都只是在内存里.
rocketmq 开源的延时消息实现也不好. 目前开源这块实现最好的是去哪儿开源的 qmq. https://github.com/qunarcorp/qmq 原理参见这个文章: https://github.com/qunarcorp/qmq, 按时间段存文件, 加在最近一段时间的消息存储文件. 然后再用 delayQUeue/时间轮之类的来跑. |
8
BBCCBB Sep 10, 2022
|
9
Scarb Sep 10, 2022
|
10
sodulty Sep 10, 2022
RabbitMQ 有延迟队列插件,小数据量的系统可以直接用
|
11
luoqeng Sep 10, 2022
pulsar 支持
|
13
chenshun00 Sep 11, 2022
时间轮算法
|
14
raaaaaar Sep 11, 2022
延时消息 -> 定时消息?
|
15
night98 Sep 12, 2022
目前主流的就是时间轮,多重时间轮,秒级分段(类似 zset ),还是要和面试官确认一下具体的提问点,或者具体讨论一下
|