我们正在构建一个Java应用程序,它将使用嵌入式Neo4j进行图形遍历。以下是我们要使用嵌入式版本而不是集中式服务器的原因
现在,这种架构带来了两个挑战。首先,如何在嵌入式Neo4j应用程序的所有实例中同时更新数据。其次,如何确保所有实例都处于同步状态,即使用相同版本的数据。
我们考虑过使用Kafka解决第一个问题。想法是在所有实例中使用具有不同groupid的kafka侦听器(以确保所有实例都获得更新)。每当有更新时,事件就会在kafka中发布。所有实例都将侦听事件并执行更新操作。
但是,我们仍然没有解决第二个问题的可靠设计。由于各种原因,该实例之一可能会错过该事件(它的使用者关闭了)。一种方法是通过调用数据所有者应用程序的api来保持检查最新版本。如果版本落后,则重播事件。但这会带来维护所有更新的事件日志的额外复杂性。你们认为是否可以通过更好和更简单的方式来做到这一点?
答案 0 :(得分:0)
只要配置正确,Kafka使用者就会非常一致且可靠,因此,除非有基础结构问题,否则您应该没有任何理由错过消息,在这种情况下,您可以使用任何解决方案建筑师会有问题。如果Kafka集群运行状况良好(例如,至少有一个数据副本可用,并且至少有法定人数的动物园管理员已经启动并正在运行),那么您的消费者应该从订阅的主题中收到每条消息。只要您的超时/重试配置正确,使用者就可以自行处理重试/重新连接。最新的kafka版本中的默认配置在99%的时间内都足够。
单独地,您可以添加一个单独的线程,例如,该线程不断检查每个主题/分区的最新偏移量,并将其与消费者最后一次收到的偏移量进行比较,并可能发出问题出现差异时发出警报/警告。以我的经验,加上Kafka的可靠性,应该没有必要,但它可以让您放心,并且添加起来也不会太困难。