2012-09-11 173 views
1

我必须实现这个场景:
一个外部应用程序发布消息给rabbitmq。 此消息具有client_id属性。我们可以将这个ID放在路由键或消息头或其他一些属性中。
我必须在交换路由逻辑中实现分片 - 消息应根据client_id范围传递到特定队列。Rabbitmq队列分片

是否可以在标准交换中实施?
如果不是我应该以什么交换为基础?
如何动态更改client_id范围?

回答

0

只需让制作人员将足够的信息放入导致邮件进入Exchange另一端的正确队列的路由键中即可。

因此,例如,创建两个名为1和2的队列,并将它们与匹配名称的路由键绑定。然后让生产者决定生成事件消息时使用哪个路由密钥。名称以字母a-m开头的客户会转到1,n-z转到2,您会明白。它将分片推送给制片人,但这对您的应用程序可能没问题。

+1

这不是理想的解决方案,因为外部应用程序不应该知道内部逻辑。 – kolchanov

+1

他们你可能不走运。 –

+1

不仅如此,而且能够在不更改发布者的情况下添加和删除更多队列将会非常有用。 – mtsr

0

AMQP没有任何明确的分片实现,但其架构应该可以帮助你做到这一点。

将消息分发到几个队列只是一个rabbitmq挑战(和amqp规范的一部分),并且通过路由,您可以连接异构消费者来处理通过同一交换机路由的特定消息。因此,生产者应该推特定的密钥以供特定的队列/消费者使用...

您可以决定进行静态分片,也许您有10个队列,每个队列有一个消费者。您可以实现一致的散列函数,使得密钥为CLIENT_ID%10.

另一种方法并没有静态解决方案可以提出,您可以尝试在此架构上尝试。