rabbitmq 消费者和生产者模型中,生产者如何确认消费者消费了消息呢 - V2EX
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 8491 次点击
    这是一个创建于 2160 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    &nbp;   32
    Acoolda  
    OP
       2019-11-14 10:11:02 +08:00 via iPhone
    @lihongjie0209 嗯,谢谢提醒,具体各种其他问题我还没想透彻
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3492 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 04:59 PVG 12:59 LAX 21:59 JFK 00:59
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86