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