将一个队列实例与多个Redis实例同步

时间:2012-06-28 09:37:08

标签: redis message-queue rabbitmq amqp zeromq

情景: 我们有多个地理位置分布的节点,我们希望队列收集该位置的消息。然后我们希望将收集到的数据从每个节点中的每个队列发送到中心位置的相应队列。在中心节点,我们将提取队列中收集的数据(来自其他节点),处理它并持久存储它。

约束:

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

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

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

  • 这些消息队列或任何其他数据存储是否提供可以解决我们问题的功能?如果是,那怎么样?
  • 如果没有,那么我们的解决方案是否足够好?
  • 有人能建议更好的解决方案吗?
  • 有没有更好的方法呢?
  • 什么是使其安全失败的最佳方法?
  • 我们收集的数据对我们非常重要,向中央节点传送数据的顺序不是问题。

1 个答案:

答案 0 :(得分:4)

您可以通过将中心节点(或节点集群)设置为来自其他节点的消息的消费者,并使用消息确认功能,对RabbitMQ执行此操作。此功能意味着中央节点可以进行交付,以便其他节点仅在确认后删除消息。例如,请参阅:http://www.rabbitmq.com/tutorials/tutorial-two-python.html

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