用于 FanOut 消息传递的 RabbitMQ 工作队列
Posted
技术标签:
【中文标题】用于 FanOut 消息传递的 RabbitMQ 工作队列【英文标题】:RabbitMQ Work-Queue for FanOut messaging 【发布时间】:2017-01-15 23:22:24 【问题描述】:我正在尝试扩展 RabbitMQ 消息传递系统。当前系统非常简单 - 生产者向扇出交换器发送消息,消息由多个消费者处理 - 经典扇出路由。
我有来自不同类型的多个消费者(例如:一个打印到屏幕,一个记录到文件,一个保存到数据库,......)。 我的挑战 - 我不确定扩大消费者规模的最佳方式是什么。如果我添加来自同一类型的其他消费者 - 我将在数据库中获得双重日志或双重条目。 ...(想想从同一个扇出交换消费的两个 DB 消费者)。
我想我可以创建一个发布到工作队列的消费者,但我想知道 rabbitmq 中是否有更好的“内置”解决方案。
提前致谢, zf
【问题讨论】:
【参考方案1】:如果您需要扩展消费者以更快地消费来自扇出交换的所有消息,您需要竞争消费;所以你需要更多的消费者连接到绑定到扇出交换的同一个队列。 这样,每个消费者都将独立于其他消费者消费一批消息。批处理中的消息数量由预取计数属性 (http://www.rabbitmq.com/consumer-prefetch.html) 定义。 这样,在您的情况下,您应该能够扩展消费者,避免数据库中的双重日志和双重条目。
【讨论】:
这很明显,所以我想我不清楚......我很抱歉。问题是如何扩大规模,同时确保每种类型的消费者只有一个会处理。如果我有两种类型的消费者, type1 和 type2 并且我希望每条消息将由每种类型处理,但每种类型只处理一次。我可以创建一个扇出交换,将发送到 2 个工作队列....还有其他选择吗? 我不知道我是否正确理解了您的请求,但是如果您希望与每个绑定了自己的队列的消费者进行扇出交换,则无法确保仅处理单个消息来自一位消费者。我认为允许扩展消费者并确保只有一个消费者消费消息的唯一方法是将单个队列中的所有消费者绑定到交换器(在这种情况下它可以是直接的,不需要扇出)。但是,也许我没有完全明白这一点,如果我的回答对你没有多大帮助,对不起:-) `我可以创建一个扇出交换,它将发送到 2 个工作队列....还有其他选择吗?` Gabrielle,我一直在寻找另一种方法,因为我认为有更好的方法。这听起来像是一个非常标准的场景(尤其是今天的微服务),所以我希望有一个“内置模式”。总之,谢谢大家!!我想实现我的目标的唯一方法确实是扇出(这样许多处理程序/消费者将接受消息),然后路由到工作队列(因此每种类型只有一个处理程序将处理传入的消息)。跨度> 我几乎面临同样的挑战(确实是微服务架构),我想我可以解释为什么提出的解决方案不是 optimql。以上是关于用于 FanOut 消息传递的 RabbitMQ 工作队列的主要内容,如果未能解决你的问题,请参考以下文章