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

5
情境: 我们在多个地理位置上分布有多个节点,我们希望在每个位置上都有收集消息的队列。然后,我们希望将每个节点中收集到的数据发送到它们对应的中央位置的队列中。在中央节点上,我们将提取从其他节点收集到的队列中的数据,进行处理并持久存储。 限制条件:
  • 数据对我们非常重要。因此,我们必须确保在任何情况下都不会丢失数据。
  • 因此,我们需要在每个节点上使用持久性队列,以便即使节点由于某种随机原因而关闭时,当我们将其启动时,我们也可以将收集到的数据安全地保存,并将其发送到中央节点进行处理。
  • 同样,如果中央节点关闭,则数据必须保留在所有其他节点上,以便在中央节点重新启动时,我们可以将所有数据发送到中央节点进行处理。
  • 此外,中央节点上的数据不得重复或再次存储。也就是说,在其中一个节点上收集的数据应仅在中央节点上存储一次。
  • 我们正在收集的数据对我们非常重要,数据传递到中央节点的顺序不是问题。
我们的解决方案: 我们考虑了几种解决方案,其中我将列出我们认为最好的一个。我们认为可能的解决方案是在每个地理分离节点上使用Redis来维护队列,因为Redis提供持久性存储。然后,在所有地理位置分离的节点上运行守护程序,该程序从队列中读取数据并将其发送到中央节点。中央节点在接收到数据后向其接收到数据的节点发送ACK(因为数据对我们非常重要),然后在接收到ACK后,节点从队列中删除数据。当然,在必须接收到ACK的超时期间内。 问题: 我们认为上述解决方案将很好地工作,但问题在于我们不想自己实现整个同步协议,因为我们可能在这里犯错。我们无法在Redis中找到这种特定的同步方式。因此,我们可以使用基于AMQP的其他队列,如RabbitMQ、ZeroMQ等。同样,我们无法确定是否可以使用这些解决方案来解决我们的问题。
  • 这些消息队列或任何其他数据存储是否提供可以解决我们问题的功能?如果是,则如何解决?
  • 如果不能,那么我们的解决方案是否足够好?
  • 有人能建议更好的解决方案吗?
  • 有没有更好的方法来做到这一点?
  • 使其故障安全的最佳方法是什么?
  • 我们正在收集的数据对我们非常重要,数据传递到中央节点的顺序不是问题。
1个回答

4
您可以通过设置中心节点(或节点集群)作为来自其他节点的消息消费者,并使用消息确认功能来使用RabbitMQ完成此操作。该功能意味着中心节点可以确认传递,以便其他节点仅在确认后删除消息。例如,请参阅:http://www.rabbitmq.com/tutorials/tutorial-two-python.html 如果您有更多问题,请发送电子邮件至rabbitmq-discuss邮件列表。

使用正确的工具完成正确的工作:当您需要确认、持久化和(高级)消息路由时,RabbitMQ绝对是正确的工具。 - FGRibreau
此外,中央节点上的数据不得重复或再次存储。也就是说,收集在任一节点上的数据只应在中央节点上存储一次。如何确保这一点?假设由于网络问题(在我们的场景中)未能成功传送ACK。那么会发生什么?队列仍然不知道工作完成的状态。在这种情况下,消息是否会被锁定?还是另一个工作程序会接手处理?如果另一个工作程序进行处理,那么同样的数据将会被处理两次,对吗? - vaidik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接