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 · 2603 次点击
    这是一个创建于 2748 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想请问下各位能否实现一个队列的消息被许多消费者取到,消费模式是需要 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   ·   实用小工具   ·   5521 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:51 · PVG 16:51 · LAX 00:51 · JFK 03:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.