我正在构建一个基于消息的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 |
. .当我想要更改队列widgetid的路由键时,问题就开始了,比如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)
哪条路最快?
安全吗?
将使我丢失更少的数据?
如果你对我对队列和路由键建模的方式有任何意见,我很乐意听到。
谢谢提前
另一种选择是保留Widget1Id
队列,并使用S&P500.ACN.200
路由密钥将其第二次绑定到交换机。这样,Widget1Id
将接收两个路由密钥的消息。当你准备好了,你可以删除之前的绑定。
您不会丢失已经在Widget1Id
中排队的消息,并且您不会丢失在取消/重新绑定或重新创建队列之间发布的消息。
如果你想要一个更具体的例子,这个场景在RabbitMQ文档的教程4中有介绍。
您提到的两个选项都会导致您的数据丢失。我建议您遵循方法2(即解除绑定并再次绑定)。另一种方法是创建一个新队列,并将该队列与新的路由密钥绑定到交换机,然后删除现有队列及其绑定。