使用RabbitMQ,我有两种类型的消费者:FileConsumer将消息写入文件,MailConsumer将消息写入邮件。每种类型可能有多个消费者,比如三个正在运行的MailConsumers和一个FileConsumer实例。
我该怎么做:
我应该使用什么类型的交换来获得这种行为?我真的很想看到一些示例/伪代码来说明这一点。
这应该很容易,但我无法从文档中找到它。似乎fanout example应该有效,但我对这些“匿名队列”感到困惑,这似乎会导致向每个消费者发送相同的消息。
答案 0 :(得分:2)
如果您创建没有auto-delete
标志的队列,那么即使在消费者断开连接后,队列也会保持活跃状态。
请注意,如果您将队列声明为持久性,则即使在代理重新启动后它也会出现。
如果您将发布具有delivery-mode=2
属性集的消息(这意味着该消息将是持久的),即使在代理重新启动之后,此类消息仍将保持持久性(这对于使队列持久化很重要)队列。
使用fanout
交换类型不是必需的。如果需要,您还可以使用topic
来更好地处理邮件路由。
UPD:逐步获取您使用架构显示的内容。
main
,exchange.declare
(exchange-name=main, type=fanout, durable=true)
。files
和mails
为queue.declare
(queue-name=files, durable=true)
和queue.declare
(queue-name=mails, durable=true)
queue.bind
(queue-name=files, exchange-name=main)
和queue.bind
(queue-name=mails, exchange-name=main)
。此时,您可以向main
交换发布消息(请参阅上面有关delivery-mode
的说明)并使用来自files
FileConsumer
和mails
的队列中的任何消费者号码来自MailConsumer
和{{1}}。在队列中没有任何消费者的情况下,消息将排队并保持队列直到它们消耗(或者代理重新启动它们不是持久的)。