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

vai*_*dik 5 message-queue amqp rabbitmq zeromq redis

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

约束:

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

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

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

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

小智 4

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

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