我正在创建系统,该系统使用Java服务器从各种 channel 收集实时数据并将这些数据存储在NoSql数据库中。我有 N 个节点,每个节点负责自己的一组 channel 。
我的要求之一是数据完整性。鉴于此,我需要处理接下来的两种情况:
- 当 PC 关闭或 JVM 失败时 -> 下次启动时系统应获得离线时间并创建作业以减少数据历史间隙
- 当 NoSql 存储不可用时 -> 系统应将数据保存在某处(实时数据或间隙时间数据)
所以,我的问题是:
- 如何跟踪每个节点的离线时间?
- 我应该使用带有心跳的内部存储(例如 SqlLite)吗?
- 我应该使用带心跳的原始数据库吗?
- 管理此类案件的一般方法是什么?
提前致谢
最佳答案
嗯,在起草任何架构之前,您必须记住的第一件事是 CAP定理,说你不可能拥有高性能的系统, 高水平的一致性和分区——至少应该牺牲一个参数来维持其他两个参数。在我看来,你想要所有这些,这是不可能的,所以你需要决定什么对你的业务领域更重要。
由于我不知道您系统的所有详细信息+我什至不知道业务领域是什么,所以我只能建议满足您所要求的通用方法。考虑到上述所有因素,这里是一个通用方法:
<强>1。 REST API(或 API 网关)。显然,它将服务客户端请求。这里的主要思想是,它基本上会对所有请求返回相同的响应,告诉它们我们接受了处理请求。在此步骤中,我们将消息推送到消息代理。
<强>2。消息代理(Kafka、RabbitMQ 等)。这是我们存储异步处理请求的地方。
<强>3。您的应用程序。它们将监听消息代理中的队列,只要有消息,应用程序就会使用它进行处理。处理完成后,应用程序会将结果存储在数据库中。
<强>4。 DB。仅存储应用程序执行的处理结果。
这个想法是,如果您的消息代理发生故障,客户端将立即收到消息无法处理的通知。如果应用程序关闭 - 消息不会丢失,因为它们在队列中。如果数据库关闭 - 消息仍将位于队列中,因为应用程序将无法使用它。 请注意,如果您正确执行所有操作,您的队列就不会出现问题。如今的消息代理确实(就像 reallllyy 一样)速度很快,而且规模非常大,例如,Kafka 在 Linkedin 处理数十亿条消息,这一切对他们来说都工作得很好。
希望这有帮助!
关于java - 设计具有历史数据完整性的系统,同时存储实时事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253887/