哪个解决方案更好地处理发布者/订阅者方案?

时间:2014-05-18 07:51:14

标签: xmpp rabbitmq publish-subscribe amqp apache-kafka

该场景是发布者/订阅者,我正在寻找一种解决方案,该解决方案可以实现在MULTIPLE消费者中实时发送由ONE生产者生成的一条消息的可行性。这个场景可以通过一个解决方案来处理轻量级,更好!

在AMQP服务器的情况下,我只检查了Rabbitmq并使用rabbitmq服务器进行发布/订阅模式,每个消费者应该声明一个匿名的私有队列并将其绑定到扇出交换,因此万一用户使用一条消息实时将有大约数千个由rabbitmq进行的匿名队列处理。

但我真的不喜欢rabbitmq的方法,如果rabbitmq可以处理这个发布/子场景,只有一个队列,一条消息,许多消费者在一个队列上进行监听,那将是理想的!

我想问的是哪个AMQP服务器或其他类型的解决方案(任何类似的包括XMPP服务器或Apache Kafka或...)处理发​​布/订阅模式/场景比使用RabbitMQ更好,更有效率当然)服务器资源少?

感兴趣的偏好:

  1. 如果启用AMQP的服务器处理只有一个或少数队列的发布/订阅方案(如上所述)

  2. 以轻量级方式处理数千名消费者,与pub / sub模式中的其他解决方案相比,消耗更少的服务器资源

  3. 群集,容忍节点失败

  4. 许多语言绑定(至少Python和Java)

  5. 易于使用和管理

  6. 我知道我的问题可能非常笼统,但我喜欢听到有关发布/子案例的想法和建议。

    感谢。

1 个答案:

答案 0 :(得分:1)

一般情况下,对于RabbitMQ,如果您将用户放在routing key中,您应该能够使用一个exchange然后再使用一个小queue guaranteed order的数量(如果你愿意,甚至可以是一个,但如果你的设置合理,你可以通过服务器或类似的方式将它们分开)。

如果您不需要consumers(例如,保证FK约束不会因各种SQL数据库表的一系列更改而受到影响),那么&# 39;没理由你不能从一个队列中抽出一堆routing key

如果您想要一种广播消息类型的场景,那么这可能会有所不同。可以用于非广播类型消息的routing key中的单个用户,而不是用户可以拥有的特殊用户类型,例如 __ broadcast __ ,而且让用户广播存储在消息的有效载荷中以及消息本身。

然后,您的邮件处理代码可以负责在所有这些用户中将该邮件存入数据库(或任何最终目的地)。

根据OP的评论进行编辑:

因此payload可能看起来像消息。[user] 其中[user]可能是实际用户(如果是点对点消息),还有特殊消息 __ broadcast __ 用户(或不允许实际用户注册的类似用户名),表示广播样式消息。

然后,您可以在邮件的payload中放置要传递邮件的用户,然后可以将邮件内容(也可以在Postgres中)传递给每个邮件用户。这样做的机制取决于您的最终目的地。即消息最终是存储在Mongo DB,{{1}}还是类似的?