V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
badboy17
V2EX  ›  Java

关于消息队列的延迟消息

  •  
  •   badboy17 · 2022-09-10 00:07:07 +08:00 · 4004 次点击
    这是一个创建于 838 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前面试被问到,延迟消息是怎么实现的,kafka 是不支持延迟的,当时答的不好,面试官建议我下来以后了解下延迟消息的实现算法 我发现用 Thread.sleep 不就能很简单的实现延迟的执行一个消息吗,可能存在的问题就是当需要延迟的消息过多的时候,可能会创造过多的线程导致栈溢出,现存的几个延迟消息的实现有时间轮算法,有基于 delayQueue 的 sheduleThreadPool ,大家怎么看这个问题呢

    15 条回复    2022-09-12 00:43:58 +08:00
    viosey
        1
    viosey  
       2022-09-10 00:26:01 +08:00 via iPhone
    有一种方案是创建一个 delay topic ,等到延时时间到了再转发给业务 topic
    documentzhangx66
        2
    documentzhangx66  
       2022-09-10 00:29:39 +08:00
    你用 Thread.sleep 实现延迟,程序崩了或系统宕机,数据就丢了。

    生产系统一般是用数据库来实现延迟并保证数据不丢失。
    Ayanokouji
        3
    Ayanokouji  
       2022-09-10 00:30:26 +08:00
    如果延迟一天或一个月呢,中间服务重启了呢
    javapythongo
        4
    javapythongo  
       2022-09-10 00:47:30 +08:00
    可以看下 RocketMQ 的延迟消息实现
    xmh51
        5
    xmh51  
       2022-09-10 00:48:57 +08:00
    其实估计面试官想问怎么用 kafka 的分片有序的特性来实现延迟消息。。
    FreeEx
        6
    FreeEx  
       2022-09-10 09:46:50 +08:00 via iPhone
    以前写过一篇文章介绍如何使用 kafka 实现消息队列。

    https://typesafe.cn/posts/kafka-delay-queue/
    BBCCBB
        7
    BBCCBB  
       2022-09-10 11:43:41 +08:00   ❤️ 1
    要考虑的是如何支持大量, 任意延时时间的延时消息. 你这些 delayQueue 什么的都只是在内存里.

    rocketmq 开源的延时消息实现也不好. 目前开源这块实现最好的是去哪儿开源的 qmq.

    https://github.com/qunarcorp/qmq

    原理参见这个文章:

    https://github.com/qunarcorp/qmq,

    按时间段存文件, 加在最近一段时间的消息存储文件. 然后再用 delayQUeue/时间轮之类的来跑.
    BBCCBB
        8
    BBCCBB  
       2022-09-10 11:45:03 +08:00
    Scarb
        9
    Scarb  
       2022-09-10 17:05:08 +08:00
    sodulty
        10
    sodulty  
       2022-09-10 20:29:12 +08:00
    RabbitMQ 有延迟队列插件,小数据量的系统可以直接用
    luoqeng
        11
    luoqeng  
       2022-09-10 23:16:08 +08:00
    pulsar 支持
    badboy17
        12
    badboy17  
    OP
       2022-09-11 12:56:59 +08:00
    @BBCCBB 点赞,我其实就是去哪儿出来的哈哈哈,用 qmq 的时候没注意,原来延时消息其实是不那么好实现的
    chenshun00
        13
    chenshun00  
       2022-09-11 14:01:01 +08:00
    时间轮算法
    raaaaaar
        14
    raaaaaar  
       2022-09-11 19:37:44 +08:00
    延时消息 -> 定时消息?
    night98
        15
    night98  
       2022-09-12 00:43:58 +08:00
    目前主流的就是时间轮,多重时间轮,秒级分段(类似 zset ),还是要和面试官确认一下具体的提问点,或者具体讨论一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5643 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 03:32 · PVG 11:32 · LAX 19:32 · JFK 22:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.