V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Acoolda
V2EX  ›  Python

rabbitmq 消费者和生产者模型中,生产者如何确认消费者消费了消息呢

  •  
  •   Acoolda · 2019-11-13 16:36:25 +08:00 · 8003 次点击
    这是一个创建于 1837 天前的主题,其中的信息可能已经有所发展或是发生改变。
    rabbitmq 中有 ack 确认,但是这只是让 rabbitmq 知道自己队列的消息被消费,生产者好像没办法知道,目前我自己用比较土的办法实现的,有没有 rabbitmq 自带的机制实现
    我用的 pika
    32 条回复    2019-11-14 10:11:02 +08:00
    jyounn
        1
    jyounn  
       2019-11-13 16:45:27 +08:00
    RocketMQ 的话,消费者会把消费结果返回给 broker,broker 会转给生产者.当然这个是异步的.rabbitmq 没用过.
    Acoolda
        2
    Acoolda  
    OP
       2019-11-13 17:05:06 +08:00
    OK,应该是有类似的机制,我再查查,thank you
    Acoolda
        3
    Acoolda  
    OP
       2019-11-13 17:05:32 +08:00
    OK,应该是有类似的机制,我再查查,thank you

    @jyounn
    BBCCBB
        4
    BBCCBB  
       2019-11-13 17:13:56 +08:00
    消费者消费后调生产者的接口告诉他你已经消费了?
    learnzpk
        5
    learnzpk  
       2019-11-13 17:20:18 +08:00
    消费者消费后后写 redis,生产者如果想知道是否消费拿消息 id 去 redis 里查。
    lostinyou
        6
    lostinyou  
       2019-11-13 17:35:14 +08:00
    生产者生产时消息数据入库,并进行状态标记,如:未消费,消费者进行消费以后标记为已消费,消费失败,标记为消费失败,然后可以有定时器查找入库的消息数据,消费失败的数据重新再次进行生产,也可以对数据进行消费失败次数限制,假如失败 5 次以后,就不再对这条消息进行生产了,然后可以通知管理人员,检查该数据,消费失败原因,如有需要手动进行生产
    lhx2008
        7
    lhx2008  
       2019-11-13 17:38:00 +08:00 via Android
    消费者再推一条信息上去不就行啦。。
    Vegetable
        8
    Vegetable  
       2019-11-13 17:44:21 +08:00
    这逻辑有点奇怪
    消费者为什么一定要知道消息消费完成呢?消费完成后的逻辑按理说应该设计成和生产者逻辑隔离的,生产者不关注消息消费才对。如果需要在消费之后做其他的事情,也可以像#7 说的再发一条通知,其他的消费者继续处理,形成一个链路。
    lihongjie0209
        9
    lihongjie0209  
       2019-11-13 17:46:19 +08:00
    fire and forget
    coer
        10
    coer  
       2019-11-13 17:56:22 +08:00 via Android
    rabbit mq 应该不自带这种机制,我当时就也是用的楼上的方法,消息入库标记状态
    braveheart7854
        11
    braveheart7854  
       2019-11-13 18:51:13 +08:00   ❤️ 1
    你看下 rabbitmq 的 rqc 能否解决你的问题
    Raymon111111
        12
    Raymon111111  
       2019-11-13 19:02:13 +08:00
    感觉你想要的是 rpc 而不是 mq
    lalalla
        13
    lalalla  
       2019-11-13 23:19:54 +08:00   ❤️ 1
    可以用 rabbitmq 实现 RPC,实时回调
    lalalla
        14
    lalalla  
       2019-11-13 23:21:08 +08:00
    @lalalla 写错了,不是实时回调。。。实时得到结果。。。
    xuanbg
        15
    xuanbg  
       2019-11-14 07:14:34 +08:00
    消费完推一个数据到另一个队列里面让生产者去消费不就行了吗
    AngryMagikarp
        16
    AngryMagikarp  
       2019-11-14 07:16:17 +08:00   ❤️ 1
    生产者一般不需要知道这个吧,如果要知道用 RPC 调用不是更好吗。

    如果要知道处理结果,又不想同步调用,那可以在业务层做处理。比如处理了一个订单数据,订单的状态会变,在某个时刻生产者去检查订单状态就好了。
    Aruforce
        17
    Aruforce  
       2019-11-14 08:29:13 +08:00 via Android
    感觉你说的像是事务消息…这个消息是否消费成功也是由来 broker 回调生产者来通知的…
    Aruforce
        18
    Aruforce  
       2019-11-14 08:31:22 +08:00 via Android
    @Aruforce 但是生产者不应该知道这个结果…
    Acoolda
        19
    Acoolda  
    OP
       2019-11-14 08:33:05 +08:00 via iPhone
    发送邮件这一类业务无需知道结果如何,但是我们这边这个业务是,任务很费时,但用户也希望知道结果,前端会一直展示一个任务执行进度条给用户
    Acoolda
        20
    Acoolda  
    OP
       2019-11-14 08:36:20 +08:00 via iPhone
    @BBCCBB 我目前是这么做的,每消费完一次任务,消费者就发一条消费完成通知给生产者,方便生产线知晓目前任务执行进度
    Acoolda
        21
    Acoolda  
    OP
       2019-11-14 08:37:35 +08:00 via iPhone
    @lalalla 感谢,我去尝试一下
    Acoolda
        22
    Acoolda  
    OP
       2019-11-14 08:39:17 +08:00 via iPhone
    @xuanbg 可以可以
    Acoolda
        23
    Acoolda  
    OP
       2019-11-14 08:43:23 +08:00 via iPhone
    @AngryMagikarp 理论上生产者是不需要关心,工厂里的工人不需要知道自己生产的东西市场上卖的怎样,但是老板需要知道啊,工人就是生产者,老板就是整体应用
    chengxy
        24
    chengxy  
       2019-11-14 09:04:55 +08:00
    C137 更新了
    Acoolda
        25
    Acoolda  
    OP
       2019-11-14 09:05:03 +08:00 via iPhone
    @Vegetable 鞋子工厂对外面买鞋子的消费者来说是生产者,但是工厂里面只有流水线工人才是正真的生产者,工厂里面还有老板,流水线工人不用关心市场上鞋子卖的怎么样,但是老板需要及时知道鞋子在市场上卖的怎么样?买鞋的人怎么评价这个鞋子
    p1094358629
        26
    p1094358629  
       2019-11-14 09:11:47 +08:00
    可以再封装,其实就是 消费者放出一个回调函数,我司基于这个原理封装了框架
    kkkkkrua
        27
    kkkkkrua  
       2019-11-14 09:19:21 +08:00
    其实就是 rpc..只是这个过程异步化了
    min
        28
    min  
       2019-11-14 09:26:50 +08:00   ❤️ 1
    lihongjie0209
        29
    lihongjie0209  
       2019-11-14 09:27:58 +08:00
    @Acoolda #23 消费者单独写一张进度表不就好了
    Acoolda
        30
    Acoolda  
    OP
       2019-11-14 09:35:33 +08:00
    @kkkkkrua 嗯,感谢
    @lihongjie0209 也可以吧,我的想法是如果能直接反馈可能会更好些吧
    @min 明白了
    lihongjie0209
        31
    lihongjie0209  
       2019-11-14 09:42:49 +08:00   ❤️ 1
    @Acoolda #30 直接反馈不现实,
    因为你不知道消费者的需要多长时间来消费,
    那么你的前端连接就需要一直保持
    那么一定存在一些任务, 直到连接超时都没能完成, 你直接反馈的数据就会丢失(假如你不写入进度表)
    如果用户想再次查看当前任务的进度, 那你就没有数据用于显示了

    如果你直接反馈之后写入进度表防止连接超时, 那么这个动作最好的消费者那端进行, 没必要再回调生产者了
    Acoolda
        32
    Acoolda  
    OP
       2019-11-14 10:11:02 +08:00 via iPhone
    @lihongjie0209 嗯,谢谢提醒,具体各种其他问题我还没想透彻
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2651 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:19 · PVG 18:19 · LAX 02:19 · JFK 05:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.