这次想问一个关于 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
NaVient
V2EX    Python

这次想问一个关于 rabbitmq 的问题

  •  
  •   NaVient 2017-05-22 09:34:48 +08:00 2963 次点击
    这是一个创建于 3115 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想请问下各位能否实现一个队列的消息被许多消费者取到,消费模式是需要 ACK.
    如果能,请问该如何设置这个队列?
    第 1 条附言    2017-05-22 10:07:13 +08:00
    可能上面描述不太清楚,我需要的是一个队列的一个消息能同时被多个消费者,然后让其中一个消费者 ACK 这条消息,类似于订阅 /发布的模式,但是是单队列
    13 条回复    2017-05-23 01:18:33 +08:00
    WangYanjie
        1
    WangYanjie  
       2017-05-22 09:38:26 +08:00
    https://www.rabbitmq.com/getstarted.html 很多时候这种基础的不能再基础的问题问出来,你的个人形象就完了
    NaVient
        2
    NaVient  
    OP
       2017-05-22 10:00:38 +08:00   1
    @WangYanjie 您可能没懂我的意思,我想要的是类似于广播方式的消费者,就是消费者能同时取到消息,但是又需要在一条队列里
    NaVient
        3
    NaVient  
    OP
       2017-05-22 10:01:29 +08:00
    @WangYanjie 如果按照 MQ 的设计,我一个消费者取到了这条队列的消息,其他消费者必须等待这个消费者释放了这条消息才能取到
    rrfeng
        4
    rrfeng  
       2017-05-22 10:12:14 +08:00
    很多时候这种基础的不能再基础的问题问出来,你的个人形象就完了。

    用消息队列之前,请先看消息队列的消息模型设计。
    GOOD21
        5
    GOOD21  
       2017-05-22 10:21:16 +08:00   1
    pub/sub 模型 在 Broker 端应该是无状态的,所以跟没没办法 ack,因为 broker 根本不关心你是否已经消费过了。

    你看看文档就会发现,fanout 其实每次是重新生成一个随机名称的队列的,在消费完直接把这个随机队列干掉。

    进一步理解一下你的需求,可能是要在高并发的情况下(队列里在一瞬间进入多条重复消息),consumer 只处理一次。
    这种情况就需要在 consumer 里面加个锁(比如 memcache 的 key,设定一个几秒的阈值过期,如果 val 存在就直接 return 不消费...)
    GOOD21
        6
    GOOD21  
       2017-05-22 10:25:28 +08:00
    没看到你的附言,如果想要有顺序执行的 pub/sub 的话,可能是你需要再 pub/sub 之前在加一个单队列。
    NaVient
        7
    NaVient  
    OP
       2017-05-22 10:26:13 +08:00
    @GOOD21 感谢大佬,回复的很详细了,我去试试
    dangyuluo
        8
    dangyuluo  
       2017-05-22 12:05:37 +08:00
    rabbitMQ 真是不错的队列服务,不过对延时任务支持不好,插件也有点满足不了需求,最后还是上了 beanstalkd
    rrfeng
        9
    rrfeng  
       2017-05-22 13:06:35 +08:00
    『多个消费者同时消费,其中一个来 ACK 』根本就是一个伪需求。
    我觉得需要搞清楚 2 个问题:
    1. 为什么要多个消费者?是处理不同的逻辑吗?
    2. 为什么只要 1 次 ACK ?消费者之间不是互相独立吗?

    反正我没看懂,但是如果多个消费者之间没有任何关系的话,直接吧消息复制到 N 个 Queue,想要 ACK 的就 ACK,不想 ACK 的就设置不需要 ACK 就行了。

    这么想来感觉题主是想要一个消息 -> N 个消费者处理不同的事情 -> 所有事情处理完 -> 派一个消费者去 ACK ?
    这样一个 Queue 是实现不了的……
    WangYanjie
        10
    WangYanjie  
       2017-05-22 13:16:41 +08:00
    @NaVient 确实我没看仔细
    WangYanjie
        11
    WangYanjie  
       2017-05-22 13:18:28 +08:00
    需求是:一个消息被多个 consumer 消费,任何一个 consumer 确认消费后其他 consumer 就可以不处理了?
    感觉这个设计方案有毒
    zhs227
        12
    zhs227  
       2017-05-22 14:35:14 +08:00
    两个队列,一个采用 work queue 模式,一个采用 fanout 模式。
    一个队列不太可能实现。而且这个模式听起来比较奇怪。
    jiumingmao
        13
    jiumingmao  
       2017-05-23 01:18:33 +08:00
    rabbitmq 估计和 kafka 一样有组的概念
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3098 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 12:21 PVG 20:21 LAX 04:21 JFK 07:21
    Do have faith in what you're doing.
    ubao msn 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