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