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

Design system with historical data integrity while storing realtime events

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

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

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

那么,我的问题是:

提前致谢

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

因为我不知道您系统的所有细节 + 我什至不知道业务领域是什么,我只能建议您满足您的要求的一般方法。考虑到以上所有情况,这里是一个通用的方法:

1. REST API(或API 网关)。 显然,它将为客户端请求提供服务。这里的主要想法是,它将 return 基本上对所有请求做出相同的响应,告诉他们我们接受了处理请求。在这一步,我们将消息推送到消息代理。

2。 Message Broker(Kafka、RabbitMQ 等)。 这是我们存储异步处理请求的地方。

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

4. DB. 只存储应用程序执行的处理结果。

想法是,如果您的消息代理出现故障 - 将立即通知客户端无法处理该消息。如果应用程序关闭 - 消息不会丢失,因为它们在队列中。如果数据库已关闭 - 消息仍将在队列中,因为应用程序将无法使用它。 请注意,如果您正确地执行所有操作,您的队列将不会出现故障。现在的消息代理确实(就像 reallllyy)快速且规模非常好,例如,Kafka 在 Linkedin 处理数十亿条消息,并且对他们来说一切正常。

希望这对您有所帮助!