让我们考虑一个将成千上万个客户数据发布到RabbitMQ交换系统的系统(在此阶段,client_id是已知的)。 Exchange将它们路由到单个队列。最后,消息由单个应用程序使用。效果很好。
但是,随着时间的流逝,使用的应用程序成为瓶颈,需要水平扩展。问题是系统要求考虑特定客户端的消息由应用程序的同一实例使用。
我可以创建很多队列:每个客户端一个,或者使用主题交换,并基于某些client_id前缀进行路由。仍然,我没有看到一种如何设计消费者应用程序的优雅方法,以便可以水平缩放消费者应用程序(因为它需要声明明确消耗的队列)。
我正在寻找解决此问题的RabbitMQ方法。
答案 0 :(得分:3)
RabbitMQ具有x-consistent-hash
和x-modulus-hash
交换可用于解决问题。使用这些交换时,消息将根据路由键的哈希值划分到不同的队列中。当然,x-consistent-hash
和x-modulus-hash
之间在实现分区的方式上有所不同,但主要思想保持不变-具有相同路由密钥(client_id)的消息将被分配到同一队列,并且最终应由同一应用程序使用。
例如,系统可以具有以下拓扑:每个应用程序都可以定义绑定到交换机({{的exclusive queue}(仅由一个连接使用,并且当该连接关闭时,队列将被删除)。 1}}或x-consistent-hash
)。
在我看来,在这种特殊情况下拥有分布式缓存层是一个好主意,但是RabbitMQ提供了解决此类问题的插件。