java - 设计具有历史数据完整性的系统,同时存储实时事件

标签 java architecture storage real-time

我正在创建系统,该系统使用Java服务器从各种 channel 收集实时数据并将这些数据存储在NoSql数据库中。我有 N 个节点,每个节点负责自己的一组 channel 。

我的要求之一是数据完整性。鉴于此,我需要处理接下来的两种情况:

  1. 当 PC 关闭或 JVM 失败时 -> 下次启动时系统应获得离线时间并创建作业以减少数据历史间隙
  2. 当 NoSql 存储不可用时 -> 系统应将数据保存在某处(实时数据或间隙时间数据)

所以,我的问题是:

  • 如何跟踪每个节点的离线时间?
  • 我应该使用带有心跳的内部存储(例如 SqlLite)吗?
  • 我应该使用带心跳的原始数据库吗?
  • 管理此类案件的一般方法是什么?

提前致谢

最佳答案

嗯,在起草任何架构之前,您必须记住的第一件事是 CAP定理,说你不可能拥有高性能的系统, 高水平的一致性和分区——至少应该牺牲一个参数来维持其他两个参数。在我看来,你想要所有这些,这是不可能的,所以你需要决定什么对你的业务领域更重要。

由于我不知道您系统的所有详细信息+我什至不知道业务领域是什么,所以我只能建议满足您所要求的通用方法。考虑到上述所有因素,这里是一个通用方法:

<强>1。 REST API(或 API 网关)。显然,它将服务客户端请求。这里的主要思想是,它基本上会对所有请求返回相同的响应,告诉它们我们接受了处理请求。在此步骤中,我们将消息推送到消息代理。

<强>2。消息代理(Kafka、RabbitMQ 等)。这是我们存储异步处理请求的地方。

<强>3。您的应用程序。它们将监听消息代理中的队列,只要有消息,应用程序就会使用它进行处理。处理完成后,应用程序会将结果存储在数据库中。

<强>4。 DB。仅存储应用程序执行的处理结果。

这个想法是,如果您的消息代理发生故障,客户端将立即收到消息无法处理的通知。如果应用程序关闭 - 消息不会丢失,因为它们在队列中。如果数据库关闭 - 消息仍将位于队列中,因为应用程序将无法使用它。 请注意,如果您正确执行所有操作,您的队列就不会出现问题。如今的消息代理确实(就像 reallllyy 一样)速度很快,而且规模非常大,例如,Kafka 在 Linkedin 处理数十亿条消息,这一切对他们来说都工作得很好。

希望这有帮助!

关于java - 设计具有历史数据完整性的系统,同时存储实时事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253887/

相关文章:

仅具有基类实现的 C# 抽象方法?

java - 拍照时如何获取默认相机存储位置?

jquery - 使用本地/ session 存储保存 .addClass()

java - Spring ViewResolver问题

java - Kafka KStream - 拓扑设计

java - Spring WebClient获取请求返回 "Connection refused: localhost/"

c# - 如何安全地将静态类转换为 C# 中的实例化类

c++ - 容器的元素如何访问其容器的 "owner"?

java - 将三个 ByteArray 合并在一起,然后拆分生成的 ByteArray

C: 存储命令历史的数据库