RabbitMQ 中的密钥感知消费者
Key-aware consumers in RabbitMQ
让我们考虑一个将数千个客户端数据发布到 RabbitMQ 交换器的系统(client_id 在这个阶段是已知的)。 Exchange 将它们路由到单个队列。最后,消息由单个应用程序使用。效果很好。
然而,随着时间的推移,消费应用程序成为瓶颈,需要水平扩展。问题是系统要求考虑特定客户端的消息由应用程序的同一实例使用。
我可以创建很多队列:每个客户端一个或使用主题交换并根据某些 client_id 前缀路由它。尽管如此,我仍然没有看到一种优雅的方式来设计消费者应用程序以使其可以水平扩展(因为它需要声明它显式使用的队列)。
我正在寻找解决此问题的 RabbitMQ 方法。
RabbitMQ有x-consistent-hash
and x-modulus-hash
个交流可以用来解决问题。当使用这些交换器时,消息根据路由键的哈希值被划分到不同的队列中。当然,x-consistent-hash
和 x-modulus-hash
在实现分区的方式上存在差异,但主要思想保持不变 - 具有相同路由键(client_id)的消息将分发到同一个队列,最终应该由同一个应用程序使用。
例如,系统可以有以下拓扑结构:每个应用程序都可以定义一个 exclusive queue(仅由一个连接使用,当该连接关闭时队列将被删除)绑定到交换器( x-consistent-hash
或 x-modulus-hash
).
在我看来,在这种特定情况下使用分布式缓存层是个好主意,但 RabbitMQ 提供了解决此类问题的插件。
让我们考虑一个将数千个客户端数据发布到 RabbitMQ 交换器的系统(client_id 在这个阶段是已知的)。 Exchange 将它们路由到单个队列。最后,消息由单个应用程序使用。效果很好。
然而,随着时间的推移,消费应用程序成为瓶颈,需要水平扩展。问题是系统要求考虑特定客户端的消息由应用程序的同一实例使用。
我可以创建很多队列:每个客户端一个或使用主题交换并根据某些 client_id 前缀路由它。尽管如此,我仍然没有看到一种优雅的方式来设计消费者应用程序以使其可以水平扩展(因为它需要声明它显式使用的队列)。
我正在寻找解决此问题的 RabbitMQ 方法。
RabbitMQ有x-consistent-hash
and x-modulus-hash
个交流可以用来解决问题。当使用这些交换器时,消息根据路由键的哈希值被划分到不同的队列中。当然,x-consistent-hash
和 x-modulus-hash
在实现分区的方式上存在差异,但主要思想保持不变 - 具有相同路由键(client_id)的消息将分发到同一个队列,最终应该由同一个应用程序使用。
例如,系统可以有以下拓扑结构:每个应用程序都可以定义一个 exclusive queue(仅由一个连接使用,当该连接关闭时队列将被删除)绑定到交换器( x-consistent-hash
或 x-modulus-hash
).
在我看来,在这种特定情况下使用分布式缓存层是个好主意,但 RabbitMQ 提供了解决此类问题的插件。