RabbitMQ AMQP队列设计

ahm*_*hmy 3 queue message-queue amqp rabbitmq

以下是队列的理想设计:

  • P制作人.插入数据的应用程序
  • X交换.
  • C1-C3消费者.从队列中读取的应用程序

队列详细信息:

  • A.就像队列日志一样,如果没有客户端绑定,那么将丢弃消息.
  • B.这是一个工作队列.如果有标准匹配,它会做一些事情.
  • C.也是一个工作队列.它将改变数据

A是可选的,但BC将始终排队,直到某个客户端进程连接它.

理想的队列设计

问题是确定我应该使用哪种类型的交换.它是一个扇动,直接或主题?因为如果没有连接客户端,我希望A队列丢弃该消息,但B&C应始终保留该消息.

并且生产者应该一次写入交换,还是用不同的路由密钥或主题写多次?

rob*_*olf 7

回答这个问题:我是否希望所有队列都能收到所有消息?

如果答案是肯定的,那么你应该使用扇出.如果答案是否定,则应使用直接或主题.直接或主题的重点是队列本身只接收基于路由密钥与绑定密钥匹配的消息.

队列A应该由消费者C1实例化,并设置为autodelete和non durable.这种方式当C1断开队列时将被删除,并且消息将被丢弃.

相反,当交换单独或由生产者进行交换时,应该实例化队列B和C. 应该设置为非自动删除并且可能是持久的.如果您使用持久队列,您可能希望拥有持久性消息(如果队列A不存在,请不要担心,即使持久性消息不会成为问题).这样,一旦生产者开始发送消息,队列将开始排队,即使消费者尚未运行,也不会错过任何消息.

是否使用直接或主题交换是个人偏好.我知道直接交换应该更快,而主题交换允许路由/绑定密钥的很大灵活性.

我不是100%你的上一个问题的意思.每条消息只应写入交换一次.如果使用扇出,交换将负责正确地将消息路由到队列,就是这样.如果您正在使用直接或主题交换,则向下到绑定密钥以确保每个队列都接收到正确的消息.您不需要发送带有多个路由密钥的消息,如果您希望执行类似的操作,那么您的理解中会有一些倒退.但是,您可以从单个队列中为交换提供多个绑定密钥.

简单的例子.X是直接交换.B具有黑色的绑定键,C具有黑色的一个绑定键和白色的一个绑定键.P发送路由密钥为黑色或白色的消息.如果它是黑色的,那么B和C都会收到消息,如果是白色则只有C接收它.