2012-06-28 66 views
5

方案: 我们有多个节点分布在地理上,我们希望队列为该位置收集消息。然后,我们希望将收集到的每个节点中每个队列的数据发送到中心位置的相应队列。在中央节点中,我们将提取队列中收集的数据(从其他节点),处理并持久存储。将一个队列实例与多个Redis实例同步

约束:

  • 数据对我们来说非常重要。因此,我们必须确保在任何情况下我们都不会丢失数据。
  • 因此,我们需要在每个节点上进行持久队列,以便即使节点出于某种随机原因而关闭,但当我们将它提出时,我们已经收集到的数据与我们保持一致,并且可以将它发送到它可以被处理。
  • 同样,如果中心节点发生故障,数据必须保留在所有其他节点上,这样当中心节点出现时,我们可以将所有数据发送到中心节点进行处理。
  • 此外,中央节点上的数据不得重复或存储。也就是说,在其中一个节点上收集的数据应该只存储在中央节点上一次。
  • 我们收集的数据对我们来说非常重要,数据传输到中央节点的顺序不是问题。

我们的解决方案 我们已经考虑了几个外面我要名单下跌,我们认为是最好的一个解决方案。一个可能的解决方案(我们认为)是使用Redis来维护各处的队列,因为Redis提供了持久存储。然后可能有一个守护进程在所有地理上分离的节点上运行,这些节点从队列中读取数据并将其发送到中央节点。接收数据的中央节点向其接收数据的节点发送ACK(因为数据对我们来说非常重要),然后在接收到ACK时,节点将从队列中删除数据。当然,会有超时时间,其中必须收到ACK。

的问题 将上述溶液(根据我们)将正常工作,但问题是,我们不希望由我们自己来实现整个同步协议,原因很简单,我们可能是错在这里。我们无法在Redis中找到这种特殊的同步方式。因此,我们对其他基于AMQP的队列开放,如RabbitMQ,ZeroMQ等。我们再次无法弄清楚我们是否可以用这些解决方案来做到这一点。

  • 这些消息队列或任何其他数据存储是否提供可以解决我们问题的功能?如果是,那么如何?
  • 如果不是,那么我们的解决方案是否足够好?
  • 任何人都可以提出更好的解决方案吗?
  • 有没有更好的方法来做到这一点?
  • 什么是最安全的方法?
  • 我们收集的数据对我们来说非常重要,数据传输到中央节点的顺序不是问题。

回答

4

您可以通过设置中心节点(或节点集群)作为来自其他节点的消息使用者并使用消息确认功能来完成此任务。此功能意味着中央节点可以确认传送,以便其他节点只在确认后删除消息。请参阅:http://www.rabbitmq.com/tutorials/tutorial-two-python.html

如果您还有其他问题,请发送邮件列表rabbitmq-discuss。

+0

为正确的工作使用正确的工具:当您需要确认,持久性和(高级)消息路由时,RabbitMQ绝对是正确的工具。 “ – FGRibreau

+0

”此外,中央节点上的数据不能重复存储,也就是说,其中一个节点上收集的数据只能存储在中央节点上一次。“我如何确保这一点?考虑到由于网络问题(在我们的场景中)ACK没有得到交付。在这种情况下会发生什么?队列仍然不知道工作完成的状态。在这种情况下的消息是否被锁定?或者另一名工作人员拿起它?如果另一个工作人员拿起它,那么我们将有相同的数据工作两次,对吗? – vaidik