该场景是发布者/订阅者,我正在寻找一种解决方案,该解决方案可以实现在MULTIPLE消费者中实时发送由ONE生产者生成的一条消息的可行性。这个场景可以通过一个解决方案来处理轻量级,更好!
在AMQP服务器的情况下,我只检查了Rabbitmq并使用rabbitmq服务器进行发布/订阅模式,每个消费者应该声明一个匿名的私有队列并将其绑定到扇出交换,因此万一用户使用一条消息实时将有大约数千个由rabbitmq进行的匿名队列处理。
但我真的不喜欢rabbitmq的方法,如果rabbitmq可以处理这个发布/子场景,只有一个队列,一条消息,许多消费者在一个队列上进行监听,那将是理想的!
我想问的是哪个AMQP服务器或其他类型的解决方案(任何类似的包括XMPP服务器或Apache Kafka或...)处理发布/订阅模式/场景比使用RabbitMQ更好,更有效率当然)服务器资源少?
感兴趣的偏好:
如果启用AMQP的服务器处理只有一个或少数队列的发布/订阅方案(如上所述)
以轻量级方式处理数千名消费者,与pub / sub模式中的其他解决方案相比,消耗更少的服务器资源
群集,容忍节点失败
许多语言绑定(至少Python和Java)
易于使用和管理
我知道我的问题可能非常笼统,但我喜欢听到有关发布/子案例的想法和建议。
感谢。
答案 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}}还是类似的?