【问题标题】:Dynamically change Queues and Routing Keys, RabbitMQ动态改变队列和路由键,RabbitMQ
【发布时间】:2023-10-15 06:24:01
【问题描述】:

我正在构建一个基于消息的 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)

哪种方式最快?

最安全?

会让我丢失更少的数据吗?

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

提前感谢

【问题讨论】:

  • 你有没有考虑过像zeromq.org这样的其他框架?

标签: websocket queue rabbitmq amqp stomp


【解决方案1】:

您提到的两个选项都会导致您丢失数据。我建议您遵循方法 2(您解除绑定并再次绑定)。您可以这样做的另一种方法是创建一个新队列并将该队列与新路由键绑定到交换器,然后删除现有队列及其绑定。

【讨论】:

    【解决方案2】:

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

    您不会丢失已在Widget1Id 中排队的消息,也不会丢失在取消绑定/重新绑定或重新创建队列之间发布的消息。

    如果您需要更具体的示例,RabbitMQ 文档中的Tutorial 4 中会介绍此场景。

    【讨论】:

      最近更新 更多