首页 > 解决方案 > 保持内存图数据库中的所有实例同步

问题描述

我们正在构建一个 java 应用程序,它将使用嵌入式 Neo4j 进行图遍历。以下是我们要使用嵌入式版本而不是集中式服务器的原因

  1. 此应用程序不是数据所有者。数据将通过其他应用程序在其上摄取。将数据保存在本地将有助于我们进行快速计算,因此它将改进我们的 api sla。
  2. 由于数据足迹很小,我们不想维护集中式服务器,这将产生额外的成本和维护。
  3. 不需要额外的缓存

现在这种架构带来了两个挑战。首先如何在嵌入式 Neo4j 应用程序的所有实例中同时更新数据。其次,如何确保所有实例同步,即使用相同版本的数据。

我们想用 Kafka 来解决第一个问题。想法是在所有实例中使用具有不同 groupid 的 kafka 侦听器(以确保所有获取更新)。每当有更新时,事件都会在 kafka 中发布。所有实例都会监听事件并执行更新操作。

然而,我们仍然没有任何可靠的设计来解决第二个问题。由于各种原因,其中一个实例可能会错过事件(它的消费者已关闭)。一种方法是通过调用数据所有者应用程序的 api 来不断检查最新版本。如果版本落后于重播事件。但这带来了维护所有更新的事件日志的额外复杂性。你们认为是否可以以更好,更简单的方式完成?

标签: javaneo4japache-kafkaspring-data-neo4jdata-consistency

解决方案


一旦你正确配置了 Kafka 消费者,它们就会非常一致和可靠,所以他们不应该有任何理由错过消息,除非存在基础设施问题,在这种情况下,你设计的任何解决方案都会遇到问题。如果 Kafka 集群是健康的(例如,至少有一个数据副本可用,并且至少 quorum zookeepers 已启动并运行),那么您的消费者应该收到来自他们订阅的主题的每条消息。只要您的超时/重试配置合理,消费者将自行处理重试/重新连接。最新 kafka 版本中的默认配置在 99% 的情况下都足够了。

另外,您可以添加一个单独的线程,例如,不断检查每个主题/分区的最新偏移量,并将其与消费者上次收到的内容进行比较,如果存在差异,可能会发出警报/警告。以我的经验,加上 Kafka 的可靠性,它应该是不必要的,但它可以让你安心,并且应该不会太难添加。


推荐阅读