使用MQ将数据从多个客户端发送到中央服务器

时间:2015-01-01 23:59:14

标签: design-patterns rabbitmq

我有一堆节点生成数据,我想将所有这些数据发送到中央服务器。我打算用RabbitMQ来做这件事。所有的消息都是类似的类型,但对我来说,它来自哪个客户端对我的存储方式很重要。

我的问题是,建议的模式是什么?我应该为每个客户端设置一个队列还是多个队列?如果所有消息都来自单个队列,我怎样才能跟踪它们的来源?

1 个答案:

答案 0 :(得分:1)

RabbitMQ适用于交换和队列。生产者都可以发送到同一个交易所,他们将排队并由客户端读取。问题是你想要实现什么目标?

这里有选项:

  1. 您可以让所有生产者写入一个交换,并拥有一个接收这些消息的队列。将队列设置为持久且不自动删除。从那开始,它将收集发送给代理的所有消息。您的服务器将使用单个使用者从队列中读取,并相应地处理消息。在此方法中,每个客户端必须在消息中添加一个字段(来自所有客户端的所有消息的相同字段名称),例如,#34;客户端名称"。此字段将为您提供发送消息的客户端的名称,以便在服务器处理消息时,它将知道是谁发送了消息。
  2. 或者,使用相同的过程将消息发送到代理,但将代理设置为主题交换。使用不同的路由密钥发送每封邮件。为每个客户端设置一个队列(它将具有自己唯一的路由密钥),每个队列应该在开始时初始化并且是持久的并且autodelete = no,因此将收集所有消息。然后,每个队列将仅接收来自其自己客户端的消息。您需要为每个队列设置一个使用者。这将有一个头脑,但将意味着消息现在并行处理。您不需要检查消息以了解客户端,因为每个队列都有自己的路由密钥,因此您知道每个消费者只是从特定客户端读取消息。
  3. 每个都有积极的和消极的。如果你知道你将拥有多少客户(及其名称),这不太可能改变,那么(2)可能会更好。如果你想要一些动态的东西,你将需要使用(1),因为它更容易,而不是每次有新客户时编写新的消费者。如果你想要(2)的并行性但是(1)的简单性然后使用为消费者(服务器)端设置的工作队列。 http://www.rabbitmq.com/tutorials/tutorial-two-python.html 在这里,您将有多个消费者从同一队列中读取以分割工作。