动态更改队列和路由密钥,RabbitMQ

时间:2016-11-16 07:59:09

标签: websocket queue rabbitmq amqp stomp

我正在构建一个基于消息的Web应用程序,它假设实时显示股票报价,

我选择RabbitMQ作为我的消息总线,我有一个交换机,它接收来自几个流动性提供商的报价流,并根据路由密钥将它们路由到相应的队列。 然后,报价将被解析并显示在屏幕上的相关小部件上。

这是Exchange和队列结构 -

| exchange       | type   | routing key       | queue              |
|------------------------------------------------------------------|
| quotes         | topic  | NASDAQ.MSFT.500   | Widget1Id          |
| quotes         | topic  | NASDAQ.FB.1500    | Widget2Id          |
| quotes         | topic  | S&P500.ABT.200    | Widget3Id          |
| quotes         | topic  | S&P500.MMM.200    | Widget4Id          |
| quotes         | topic  | S&P500.MMM.500    | Widget5Id          |

所以.. 当我想要更改队列Widget1Id的路由键时,问题就开始了,让我们说S& P500.ACN.200

我考虑了几个选项:

1. Delete Widget1Id queue and recreate is.
2. Unbind the queue and bind it again using the new routing key
  (makes me always save the old routing key)

哪种方式最快?

最安全?

会让我减少数据量吗?

如果您对我对队列和路由键建模的方式有任何意见,我很乐意听到。

提前致谢

2 个答案:

答案 0 :(得分:0)

您提到的两个选项都会导致您丢失数据。我建议您按照方法2(你解除绑定并再次绑定)。另一种方法是创建一个新队列,并使用新的路由密钥将该队列绑定到交换机,然后删除现有队列及其绑定。

答案 1 :(得分:0)

另一种选择是保留Widget1Id队列,并使用S&P500.ACN.200路由密钥将其再次绑定到交换机。这样,Widget1Id将接收两个路由密钥的消息。准备好后,您可以删除以前的绑定。

您不会在Widget1Id中排队已排队的邮件,并且在取消绑定/重新绑定或重新创建队列之间,您不会发布松散的邮件。

如果您需要更具体的示例,请在RabbitMQ文档中的Tutorial 4中介绍此方案。