将所有内存图形db的实例保持在同步中



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

的原因
  1. 此应用不是数据所有者。数据将通过其他应用程序摄入。在本地保留数据将帮助我们进行快速计算,因此它将改善我们的API SLA。
  2. 由于数据步骤打印很小,我们不想维护集中式服务器,这将产生额外的成本和维护。
  3. 无需其他缓存

现在,这种体系结构带来了两个挑战。首先,如何在嵌入式NEO4J应用程序的所有实例中更新数据。第二,如何确保所有实例都同步,即使用相同版本的数据。

我们考虑使用Kafka解决第一个问题。想法是让Kafka侦听器具有不同的groupID(以确保所有更新(在所有情况下。每当有更新时,事件将发布在Kafka中。所有实例都将收听事件并执行更新操作。

但是,我们仍然没有任何可靠的设计来解决第二个问题。出于各种原因,其中一个实例可能会错过活动(消费者倒闭(。方法之一是通过调用数据所有者应用程序的API来继续检查最新版本。如果版本是重播事件的背后,但是这会带来维护所有更新的事件日志的其他复杂性。你们是否认为是否可以以更好,更简单的方式完成?

kafka消费者一旦配置正确,它们就非常一致且可靠,因此除非存在基础架构问题,否则不应有任何理由错过消息,在这种情况下您架构师的任何解决方案都会有问题。如果Kafka群集很健康(例如,至少有一个数据副本可用,并且至少有Quorum Zookeepers启动并运行(,那么您的消费者应从其订阅的主题中收到每一个消息。只要您的超时/重试配置是理智的,消费者就会处理重试/重新连接。最新的Kafka版本中的默认配置在99%的时间里足够。

单独,您 can 添加一个单独的线程,例如,不断检查最新偏移量是每个主题/分区的内容,并将其与消费者最后收到的内容进行比较,也许是问题警报/警告是否存在差异。根据我的经验以及Kafka的可靠性,这应该是不必要的,但是它可以让您安心,不应该太难添加。

相关内容

  • 没有找到相关文章

最新更新