介绍
在现代应用程序的微服务架构中,传统的数据处理和接收方法(例如批处理和轮询)效率低下。这些方法处理海量数据,导致最终处理结果延迟,并且需要积累大量数据才能进行处理。此外,它们还引入了同步工作进程所需的额外复杂性,并且可能导致部分工作进程即使资源利用率很高也未能得到充分利用。相比之下,云计算能够为本地资源提供快速扩展能力,因此可以通过将传入数据分配给多个并行工作进程来实时处理这些数据。.
事件流是一种灵活收集和分配传入事件进行处理的方法,同时还能在不同系统间保持持续的数据流。通过调度传入数据进行即时处理,可以确保资源的最大化利用和实时响应能力。事件流将生产者和消费者分离,允许根据当前负载配置不同数量的生产者和消费者。这使得系统能够对动态的现实世界状况做出即时反应。.
这种响应能力在金融交易、支付监控或交通监控等领域尤为重要。例如,Uber 利用事件流技术连接数百个微服务,实时发送乘客端到司机端应用程序的事件数据,并将其存档以供后续分析。.
借助事件广播,无需像传统方式那样让工作进程定期等待一批数据,事件代理可以在事件发生时立即通知消费者(通常是微服务)并向其提供事件数据。事件代理负责事件的路由、接收和传递。此外,它还能在工作进程发生故障或拒绝处理事件时提供容错机制。.
本文将探讨事件流方法及其优势。我们还将介绍开源事件代理 Apache Kafka,并分析其在该方法中的作用。.
事件流架构
事件流本质上是发布/订阅架构模式的一种实现。一般来说,发布/订阅模式包括:
- 消息(包括您想要传递的任何数据)所针对的主题。.
- 出版商制作信息
- 订阅者接收并处理消息
- 消息代理,它接收来自发布者的消息,并以最有效的方式将消息传递给订阅者。
主题类似于消息关联的类别。主题持久存储消息序列,并确保新消息始终添加到序列末尾。消息一旦添加到主题,就无法再进行更改。.
赛事直播的原理类似,但更加专业化:
- 事件及相关元数据以消息形式发送。
- 同一主题下的事件通常按到达时间排序。
- 订阅者(也称为消费者)可以从帖子中的任何时间点广播事件,直到当前时刻。.
- 与实际的发布/订阅不同,某个主题的事件可以保留一段时间,也可以无限期地保留(作为存档)。.
事件流不对事件的性质施加任何限制或做出任何假设。就底层代理而言,它意味着生产者已通知它发生了某些事情。至于实际发生了什么,则由您来定义并赋予其意义。因此,从代理的角度来看,事件和消息或记录可以互换使用。.
为了便于理解,以下是来自 Confluent 文档的 Kafka 事件流架构的详细图:
消费者从代理服务器获取数据有两种模式:推送和拉取。推送是指事件代理服务器主动向初始可用的消费者发送数据,而拉取是指消费者向代理服务器请求后续可用的记录。这种区别看似无关紧要,但实际上拉取模式更受欢迎。.
推送机制不被广泛使用的主要原因之一是,消息代理无法确定消费者是否真的会对事件做出反应。因此,它可能会不必要地多次发送事件,同时仍然需要将其存储在主题中。此外,消息代理还应考虑对事件进行批量处理以提高吞吐量,这与尽可能快速地广播事件的理念背道而驰。.
让消费者在准备好处理数据时才拉取数据,可以减少不必要的网络流量,并提高可靠性。这确保了它只在准备好处理数据时才接收数据。处理时间取决于业务逻辑,并会影响工作进程数量的调度。在这两种情况下,代理都必须记住消费者已确认的事件。.
现在您已经了解了事件流是什么以及它基于什么架构,接下来您将了解这种动态方法的优势。.
活动直播的优势
赛事直播的主要优势包括:
- 一致性:事件代理确保事件正确发送给所有感兴趣的消费者。.
- 容错性:如果消费者未能接受某个事件,则可以将其重定向到其他地方,以确保没有事件未被处理。.
- 可重用性:存储在线程中的事件是不可变的。它们可以完整重放,也可以从特定时间点开始重放,这使得您可以在业务逻辑发生变化时重新处理事件。.
- 可扩展性:生产者和消费者是独立的实体,不必互相等待,这意味着可以根据需求动态地向上或向下扩展。.
- 易用性:事件代理处理事件路由和存储,抽象化复杂的逻辑,让您可以专注于数据本身。.
每个事件应该只包含事件发生的必要细节。事件代理通常非常高效,虽然建议事件一旦记录到主题中就不要过期,但它们不应被视为传统数据库。.
例如,我们可能希望显示某篇文章的浏览量发生了变化,但无需将整篇文章及其元数据与此信息一起存储。相反,该事件可以包含指向外部数据库中文章 ID 的引用。这样,既可以跟踪历史记录,又不会包含不必要的信息,也不会污染讨论串。.
现在您将了解 Apache Kafka 和其他流行的事件代理,它们的比较情况,以及它们如何融入事件流生态系统。.
Apache Kafka 的作用
Apache Kafka 是一个开源事件代理,使用 Java 编写,由 Apache 软件基金会维护。它由分布式服务器和客户端组成,这些服务器和客户端使用自定义的 TCP 网络协议进行通信,以实现最佳性能。Kafka 具有高度可靠性和可扩展性,可以运行在虚拟机、裸机硬件、容器和其他云环境中。.
为了确保可靠性,Kafka 以一个或多个服务器组成的集群形式部署。该集群可以跨越多个云区域和数据中心。Kafka 集群具有容错能力,这意味着即使发生服务器故障或断开连接,剩余的服务器也会重新组合,从而确保高可用性运行,且不会造成外部影响和数据丢失。.
为了实现最高效率,并非所有 Kafka 服务器都扮演相同的角色。一些服务器组合在一起,充当中间层,构成数据存储层。其他服务器可以与现有系统集成,并使用 Kafka Connect(一种用于将数据从现有系统(例如关系数据库)可靠地流式传输到 Kafka 的工具)以事件流的形式摄取数据。.
Kafka 将生产者和消费者视为其客户。如前所述,生产者将事件写入 Kafka broker,Kafka broker 再将事件发送给感兴趣的消费者。在默认配置下,Kafka 保证每个事件最终只会被其中一个消费者处理一次。.
在 Kafka 中,主题被分区。这意味着一个主题会被分成多个部分,分布在不同的 Kafka broker 上,从而确保了可扩展性。Kafka 还保证,存储在特定主题及其分区组合中的事件,始终可以按照写入顺序读取。.
请注意,简单地对主题进行分区并不能保证冗余,冗余只能通过跨区域和数据中心的复制来实现。在生产环境中,通常至少会有 3 个集群副本,这意味着始终有三种主题分区组合可用。.
Kafka 集成
如前所述,Kafka Connect 可用于导入和导出现有系统中的数据。它非常适合以低延迟线程从服务器导入整个数据库、报表或指标。Kafka Connect 提供适用于不同数据系统的连接器,使您能够以标准化的方式管理数据。使用连接器而非自行开发解决方案的另一个优势在于,Connect 默认具有可扩展性(可以将多个工作进程组合在一起),并自动跟踪进度。.
有大量客户端可供您通过应用程序与 Kafka 通信。Kafka 支持多种编程语言,例如 Java、Scala、Python、.NET、C++、Go 等。此外,Kafka Streams 还提供了一个名为 Kafka Streams 的高级客户端库,适用于 Java 和 Scala。该库抽象了内部细节,使您可以轻松连接到 Kafka 服务器并开始接收广播事件。.
结果
本文介绍了现代事件流数据和事件处理方法的范式,以及它相对于传统数据分类方法的优势。您还将了解 Apache Kafka 作为事件代理及其客户端生态系统。.










