事件和流处理系统概述
这是系统设计系列文章的第 5 篇。本文最初发表于 https://www.learncsdesign.com
您从数据中提取洞察力和知识的速度越快,您的系统就能越快地响应它们所观察到的世界不断变化的状态。
事件驱动架构
事件表明在应用程序的上下文中发生了一些有趣的事情。它可能是系统捕获的外部事件,也可能是状态变化产生的内部事件。在一个系统中,事件源发出事件而不期望其他组件如何处理它。
通常,事件会发布到消息传递系统。相关方可以注册以接收事件并相应地处理它们。
基于事件的架构可以使用像 RabbitMQ 这样的消息系统来实现。一旦每个订阅者都消费了一个事件,它就会从代理中删除。除了为代理释放资源外,这还会破坏任何显式事件记录。
我写了一个 详细的帖子 关于使用 RabbitMQ 的面向消息的中间件,您可能会觉得有趣。
在简单的数据结构中记录不可变事件具有一些有用的特性。事件日志与大多数消息代理管理的 FIFO 队列不同,因为它们是仅附加数据结构。
日志附有记录,每条记录都有一个唯一的条目号。作为序列号的结果,系统中事件的顺序被明确地捕获。
由于其持久性,事件日志具有一些关键优势:
- 可以随时引入新的事件消费者。新的消费者可以访问日志中存储的完整事件历史记录。它可以处理现有事件和新事件。
- 可以修改事件处理逻辑以添加新功能或修复错误。然后,您可以在整个日志上执行新逻辑以丰富结果或纠正错误。
- 如果服务器或磁盘发生故障,您可以恢复上次已知状态并从日志中重播事件以恢复数据集。事务日志在数据库系统中的作用与此类似。
阿帕奇卡夫卡
分布式持久日志存储是 Kafka 的核心。 Kafka 使用哑代理/智能客户端架构。事件代理主要负责将新事件附加到持久日志,将事件传递给消费者,以及管理日志分区和复制以实现可伸缩性和可用性。多个消费者可以多次读取日志条目,因为它们是持久存储的。只需指定他们希望读取的条目的日志偏移量或索引即可。这样,代理就不必维护任何复杂的消费者相关状态。该架构已被证明具有极强的可扩展性并提供非常高的吞吐量。
Credit: https://kafka.apache.org/20/images/log_consumer.png
数据处理
在传统的数据处理应用程序中,您将来自外部提要的数据持久保存到数据库中,并设计查询以提取信息。随着系统处理的信息量增加,这变得越来越困难。对于低延迟、聚合读取和连接,您需要从数据库获得快速、可扩展的写入性能。最后,您可以在数据库写入和读取完成后执行有用的分析。
越来越多的大容量数据源导致了一种称为流处理系统的新型技术的发展。通过使用这些,您可以处理内存中的数据流,而无需持久化数据。实时分析通常被称为此。可扩展系统越来越多地使用流处理平台。
金融服务公司使用流处理进行实时欺诈检测,零售商使用它来获得客户行为的完整视图,云原生公司使用它在影响客户之前检测中断。
批量处理
通常,批处理在软件系统中新可用数据的处理中发挥了重要作用。表示新对象和更新对象的数据被累积到批处理系统中的文件中。批处理数据加载作业会定期处理这些新可用的数据并将其插入应用程序的数据库中。 ETL 代表提取、转换、加载。 ETL 过程涉及处理包含新数据的批处理文件,将其聚合,并将其转换为可插入存储系统的格式。
处理完批次后,您的分析和外部用户即可使用数据。从新插入的数据中,您可以运行产生有用见解的查询。
大规模系统依赖于批处理,因为它可靠、有效且高效。缺点是新数据到达之间的滞后,可用于分析和查询。
流处理
数据流或事件流代表无界数据集。无界的定义是无限的并且不断增长。随着新记录随着时间的推移添加到数据集中,它是无限的。
数据流还具有以下属性:
- 数据流是有序的
- 不可变的数据记录
- 数据流的可重放性
在流处理中,一个或多个事件流被连续处理。流处理涉及从无界数据集中连续读取数据,对其进行处理并发出输出。
状态
如果您只需要单独处理每个事件,流处理是一个非常简单的活动。当您的操作涉及多个事件、移动平均值以及连接两个流以创建丰富的信息流时,流处理变得非常有趣。在这些情况下,您需要跟踪的信息不仅仅是每个事件。我们将存储在事件之间的信息称为状态。
流处理中有几种类型的状态:
- 本地或内部状态 — 此状态只能由流处理应用程序的特定实例访问。
- 外部状态——这种类型的状态存储在外部数据存储中,通常是 Redis 或 Cassandra 等 NoSQL 系统。它的优点包括几乎无限的大小以及可以从应用程序的多个实例访问它的事实。
流处理平台
各种数据结构用于使数据可用于平台。在大多数情况下,这些是队列,例如 Kafka 主题,或分布式存储系统中的文件,例如 AWS S3。在流处理节点中,从数据源中摄取数据对象,并执行聚合。数据对象流是从源处理的。数据对象在概念上在处理节点之间传递。
在流处理系统中,处理节点将一个节点的输入流转换为由下游节点处理的新流。
有两种一般类型的流处理应用程序:
- 第一种方法仅处理和转换流中的各个事件,而不需要任何有关它们的上下文或状态信息。
- 在某些流应用程序中,状态必须在单个数据对象的处理过程中持续存在。有状态的流应用程序属于这一类。
在数据处理领域,Apache Flink、Apache Storm、AWS Kinesis、Apache Kafka Streams、Apache Spark Streams 和 Spring Data Flow 是一些顶级竞争者。
批处理与流处理
批处理的特点
- 潜伏 — 几分钟到几小时
- 分析 — 这是一个包含新批次数据和现有数据的复杂过程
流处理的特点
- 潜伏 — 亚秒到秒
- 分析 — 一种相对简单的方法,用于检测事件、聚合事件并在滚动时间间隔内计算新到达数据的指标
如果你喜欢这篇文章,别忘了鼓掌。如果你想连接,你可以找到我 领英 .
参考
书籍:流处理应用程序设计、系统和分析的基础知识
书籍:可扩展系统的基础
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/39944/36293009
标签:处理,系统,应用程序,概述,事件,日志,数据 From: https://www.cnblogs.com/amboke/p/16743827.html