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

rabbitMQ 的 topic 模式下,如何实现有 N 个订阅者,发布一条消息后,当 N 个消费者都拿到这个消息后将该消息销毁(确认消费)

  •  
  •   zzNaLOGIC · 2020-09-15 21:35:28 +08:00 · 3318 次点击
    这是一个创建于 1507 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2020-09-16 09:44:24 +08:00
    已考虑中解决方案:
    1.使用 fanout 模式广播,同时每个消费者单独监听一个队列,将需要的队列全部绑定到 fanout 交换机,每个消费者在自己的队列里拿到消息就直接确认消费。fanout 模式可以保证所有消费者都拿到,目前 topic 方案的问题在于,所有消费者都监听一个队列,同时只有一个消费者可以拿到消息,如果拿到就确认后面的消费者就拿不到消息了,如果不确认无法知道所有消费者都拿到消息了,最终销毁消息无法实现。而 fanout 方案可以保证所有人都拿到消息且所有人都可以拿到消息就确认,实现单条消息向所有消费者都推送一次。缺点是每个消费者都需要一个队列。
    第 2 条附言  ·  2020-09-16 10:10:57 +08:00
    2.改用 redis 的发布订阅,redis 的发布订阅只会向所有订阅者推送一次随后就自动丢弃。可以实现这个场景。但 redis 的发布订阅问题在于消息可靠性不高。无法持久化,这就得考虑业务对消息丢失的容忍度。以我目前这个场景容忍度是符合要求的
    6 条回复    2020-09-16 13:51:40 +08:00
    xiaodoudou
        1
    xiaodoudou  
       2020-09-15 22:20:50 +08:00
    广播消费应该可以,可以保证消息至少被每个消费者消费一次。文档 https://help.aliyun.com/document_detail/43163.html?spm=a2c4g.11186623.4.3.30603702RP4NlR
    zzNaLOGIC
        2
    zzNaLOGIC  
    OP
       2020-09-15 22:34:34 +08:00 via Android
    @xiaodoudou rabbitmq 好像是没有类似的方法的,topic 类型虽然是可以实现每个消费者都接受到,但没办法做到每个消费者消费一次就销毁
    npe
        3
    npe  
       2020-09-16 00:57:34 +08:00 via iPhone
    只知道 Kafka 有 consumer group
    zzNaLOGIC
        4
    zzNaLOGIC  
    OP
       2020-09-16 01:03:17 +08:00 via Android
    @npe 可惜现在没这条件再布一个
    zzNaLOGIC
        6
    zzNaLOGIC  
    OP
       2020-09-16 13:51:40 +08:00
    @scnace 这是个好方案!学习了 虽然现在生产上来不及重新规划了,暂时确定用 redis 先让程序跑起来。但可以学习下,日后改进的时候用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1128 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:54 · PVG 06:54 · LAX 15:54 · JFK 18:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.