Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将一个队列实例与多个Redis实例同步_Redis_Message Queue_Rabbitmq_Amqp_Zeromq - Fatal编程技术网

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

将一个队列实例与多个Redis实例同步,redis,message-queue,rabbitmq,amqp,zeromq,Redis,Message Queue,Rabbitmq,Amqp,Zeromq,场景: 我们有多个地理上分布的节点,希望在这些节点上有队列来收集该位置的消息。然后我们要将收集到的数据从每个节点的每个队列发送到中心位置的相应队列。在中心节点中,我们将取出队列中收集的数据(来自其他节点),对其进行处理并持久存储 限制条件: 数据对我们来说非常重要。因此,我们必须确保在任何情况下都不会丢失数据 因此,我们需要在每个节点上使用持久队列,这样即使节点因某种随机原因停机,当我们打开它时,我们也可以安全地将收集到的数据发送到中心节点进行处理 类似地,如果中心节点关闭,数据必须保留在所有

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

限制条件:

  • 数据对我们来说非常重要。因此,我们必须确保在任何情况下都不会丢失数据
  • 因此,我们需要在每个节点上使用持久队列,这样即使节点因某种随机原因停机,当我们打开它时,我们也可以安全地将收集到的数据发送到中心节点进行处理
  • 类似地,如果中心节点关闭,数据必须保留在所有其他节点上,以便当中心节点出现时,我们可以将所有数据发送到中心节点进行处理
  • 此外,中央节点上的数据不得重复或再次存储。也就是说,在其中一个节点上收集的数据只应在中心节点上存储一次
  • 我们正在收集的数据对我们来说非常重要,向中心节点交付数据的顺序不是问题
我们的解决方案 我们已经考虑了几个解决方案,我将列出其中我们认为最好的一个。一个可能的解决方案(在我们看来)是使用Redis在任何地方维护队列,因为Redis提供持久存储。然后,可能有一个守护进程在所有地理位置不同的节点上运行,该守护进程从队列中读取数据并将其发送到中心节点。中央节点在接收数据时向其接收数据的节点发送ACK(因为数据对我们非常重要),然后在接收ACK时,节点从队列中删除数据。当然,必须在超时期间接收ACK

问题 上面提到的解决方案(根据我们的说法)可以很好地工作,但问题是我们不想自己实现整个同步协议,原因很简单,我们可能在这里出错。我们无法在Redis中找到这种特殊的同步方式。因此,我们对其他基于AMQP的队列(如RabbitMQ、ZeroMQ等)持开放态度。同样,我们无法确定是否可以使用这些解决方案实现这一点

  • 这些消息队列或任何其他数据存储是否提供了可以解决问题的功能?如果是的话,怎么办
  • 如果不是,那么我们的解决方案是否足够好
  • 有人能提出更好的解决方案吗
  • 有没有更好的办法
  • 使其故障安全的最佳方法是什么
  • 我们正在收集的数据对我们来说非常重要,向中心节点交付数据的顺序不是问题

通过将中心节点(或节点集群)设置为来自其他节点的消息的使用者,并使用消息确认功能,可以使用RabbitMQ实现这一点。此功能意味着中心节点可以进行ack传递,以便其他节点仅在ack之后删除消息。例如,见:


如果您还有其他问题,请通过电子邮件与邮件列表rabbitmq讨论。

为正确的工作使用正确的工具:当您需要确认、持久性和(高级)消息路由时,rabbitmq绝对是正确的工具。“此外,中央节点上的数据不得重复或再次存储。也就是说,在一个节点上收集的数据应该只存储在一个节点上。“我如何保证这一点?考虑到ACK没有因网络问题而被交付(在我们的场景中))。在这种情况下会发生什么?队列仍然不知道工作完成的状态。在这种情况下,消息会被锁定吗?还是另一个工作人员拾取了它?如果另一个工作人员拾取了它,那么我们将对相同的数据进行两次处理,对吗?