序列化事件不适合复杂的 SQL 查询。为此,将读取并进一步处理事件。可以根据需要从事件中生成不同的视图。在我们的示例中,微服务可以计算“OrderStatusChanged”事件的统计信息。
应用程序状态不是以分布式方式(在微服务中)维护然后集中化,而是以消息的形式直接发送到具有永久持久性的分布式消息系统。数据集成是明确的,是整个系统的重要组成部分。我已经遇到过这样的情况:我必须在一家大公司的帮助台上找到我仍然在我的旧地址上注册的情况。因此,当您听到:“等一下,我会检查我们的其他系统。”,那么您就知道为什么了 - 数据保存在很多地方。
事件溯源还有另一个重要特征。由于事件的顺序存储,不再需要分布式事务来确保数据一致性。不同的系统可以独立读取事件、更新自己的数据并随着时间的推移实现一致的状态。
当需要推出新的数据库或数据库版本时。消费者可以不间断地 验光师准确的电子邮件列表 更新数据库,最重要的是,可以在操作期间更新数据库。在某些时候,数据将是“最新的”并且数据库可以轻松激活。
市场上已经有一些很好的框架,例如 geteventstore、Eventuate 或 AxonFramework,它们对于实现 CQRS(数据库查询的一种变体)和事件溯源架构非常有帮助。
Kafka 越来越多地把自己打造成一个事件存储。对于那些对 Kafka 一无所知的人,我推荐该网站kafka.apache.org。 Kafka 最初是 LinkedIn 开发的一个非常高效的分布式消息系统。 Kafka 可以处理的数据量令人惊叹,正如Todd Palino解释的那样:“在一天中最繁忙的时间,我们每秒接收超过 1300 万条消息,即每秒 2.75 GB 的数据。为了处理所有这些消息,LinkedIn 运行了 1100 多个 Kafka 代理,这些代理被组织成 60 多个集群。 “
Kafka 将消息在磁盘上存储可配置的时间段或特定数据量。该配置也可以关闭,从而允许永久存储数据。消费者读取数据并“提交”读取位置。由于消息的持久性,事件生产者的性能不会受到消费者性能的影响。消费者也不必实时处理消息。如果消费者发生故障,重启后可以从最后的位置继续工作。除了客户端 API(生产者和消费者)之外,Kafka Connect API 和 Kafka Streams API 还提供事件流处理。通过 Connect API,Kafka 可以在数据库之间复制数据。 Kafka Streams 特别适合数据聚合和转换。数据从Kafka读取并写入Kafka。在许多情况下,流处理需要本地存储的状态 - 所谓的状态存储。随着“交互式查询”的引入,现在可以查询流的当前状态。这具有巨大的优势,因为它使实现微服务架构变得更加容易。微服务可以向 Kafka 集群发送消息,并且可以使用 Kafka 流在本地重现当前应用程序状态。对于更复杂的实时数据分析,可以使用 Apache Spark 并内置对机器学习算法的支持。
结论
借助 Kafka 消息传递平台,不仅可以实现基于事件的架构,而且最重要的是可以将数据作为全球可靠的信息源进行集中和管理。新的需求可以更快地实现,甚至可以在持续运营期间激活。
在事件溯源中,当前应用程序状态源自所有历史事件。如果实体有很多事件,这可能会导致响应时间变慢。各种框架通常提供优化,即所谓的快照。借助 Kafka“交互式查询”,可以实时获取当前状态。
借助微服务(包括 Kafka 作为事件源),可以实现灵活且可扩展的架构。