使用MQ将多个客户端的数据发送到一个中心服务器

Using MQ to send data from multiple clients to a central server

我有一堆节点在生成数据,我想将所有这些数据发送给中央服务器保存。我打算使用 RabbitMQ 来执行此操作。所有消息的类型都相似,但对于我如何存储它而言,它来自哪个客户端很重要。

我的问题是,执行此操作的建议模式是什么?我应该为每个客户设置一个队列还是多个队列?如果所有消息都来自一个队列,我如何跟踪它们的来源?

RabbitMQ 与交换和队列一起工作。生产者都可以发送到同一个交换器,它们将被排队并由客户端读取。问题是你想达到什么目的?

这里有选项:

  1. 你可以让所有的生产者写入一个交换器,并让一个队列接收这些消息。将队列设置为持久的而不是自动删除的。这样一开始它将收集所有发送给代理的消息。您的服务器将使用单个消费者从队列中读取,并相应地处理消息。在此方法中,每个客户端必须向消息添加一个字段(来自所有客户端的所有消息的相同字段名称),例如称为 "client name"。该字段将为您提供发送消息的客户端的名称,以便服务器在处理消息时知道是谁发送的。
  2. 或者,使用相同的过程将消息发送到代理,但将代理设置为主题交换。使用不同的路由键发送每条消息。为每个客户端设置一个队列(它将有自己唯一的路由键),同样每个队列应该在开始时初始化并且是持久的并且autodelete = no,所以所有消息都将被收集。然后每个队列将只接收来自其自己的客户端的消息。您需要为每个单独的队列设置一个消费者。这会有开销,但意味着消息现在是并行处理的。您不需要检查消息来了解客户端,因为每个队列都有自己的路由键,因此您知道每个消费者只读取来自特定客户端的消息。

每个都有积极和消极的一面。如果您知道您将拥有多少客户(及其姓名)并且这不太可能改变,那么 (2) 可能会更好。如果您想要动态的东西,那么您将需要使用 (1),因为它比每次有新客户时都编写新的消费者要容易得多。如果您想要 (2) 的并行性但想要 (1) 的简单性,则使用为消费者(服务器)端设置的工作队列。 http://www.rabbitmq.com/tutorials/tutorial-two-python.html 在这里,您将有多个消费者从同一个队列读取以分配工作。