使用 Pub/Sub 进行流式传输

本页从概念上大致介绍了 Dataflow 与 Pub/Sub 的集成。本概览说明了 Dataflow 运行程序的 Pub/Sub I/O 连接器实现所涵盖的一些优化。Pub/Sub 是一个可扩缩、持久的事件提取和传送系统。如果您使用窗口和缓冲功能,则 Dataflow 可通过去重功能和“正好一次”的按序处理,对 Pub/Sub 的可扩展、“至少一次”的传送模型起到辅助作用。要使用 Dataflow,请使用 Apache Beam SDK 编写流水线,然后在 Dataflow 服务中执行流水线代码。

在开始之前,请先了解 Apache Beam 和流处理流水线的基本概念。有关详情,请参阅以下资源:

使用 Pub/Sub 构建流处理流水线

要获享 Dataflow 与 Pub/Sub 集成带来的优势,您可以通过以下任一种方式构建流处理流水线:

Pub/Sub 和 Dataflow 集成功能

Apache Beam 针对 Pub/Sub 提供了一个参考 I/O 源代码实现方案 (PubsubIO)(JavaPython),供非 Dataflow 运行程序(例如 Apache Spark 运行程序、Apache Flink 运行程序和直接运行程序)使用。

不过,Dataflow 运行程序会使用与前述方案不同的专有 PubsubIO 实现方案。此实现方案利用 Google Cloud 内部 API 和服务提供三个主要优势:低延迟水印、高水印精度(因此能确保数据完整性)和高效的去重。

Dataflow 运行程序的 PubsubIO 实现会在消息写入 Shuffle 或接收器的永久性存储空间后自动确认消息。因此,仅当 Dataflow 可以确认在某些组件崩溃或连接丢失时不会丢失数据时,消息才会被确认。

低延迟水印

Dataflow 可以访问 Pub/Sub 的专有 API,该 API 可提供订阅中最早的未确认消息的存留时间,延迟时间要低于在 Cloud Monitoring 中的时间。可以对比一下的是,Cloud Monitoring 中可用的 Pub/Sub 积压指标通常会延迟 2-3 分钟,但在 Dataflow 中,这些指标只会延迟大约 10 秒。这使得 Dataflow 可以将流水线水印提前并更早地发出窗口计算结果。

高水印精确度

Dataflow 与 Pub/Sub 集成后,自然而然地解决的另一个重要问题是为事件时间中指定的窗口提供可靠的水印。事件时间是发布商应用指定的作为 Pub/Sub 消息属性的时间戳,而不是 Pub/Sub 服务本身针对消息设置的 publish_time 字段。由于 Pub/Sub 仅针对服务分配的(或处理时间)时间戳计算积压统计信息,因此估算事件时间水印需要单独的机制。

为了解决此问题,如果用户选择使用自定义事件时间戳,Dataflow 服务会再创建一个跟踪订阅。此跟踪订阅用于检查基础订阅积压中的消息的事件时间,并估算事件时间积压。如需了解详情,请参阅介绍 Dataflow 如何计算 Pub/Sub 水印的 StackOverflow 页面。

高效的去重技术

消息去重对于“正好一次”消息处理而言是必需的。Dataflow 会根据 Pub/Sub 消息 ID 删除重复的消息。因此,所有处理逻辑都可以假定消息已经具有独一无二的 Pub/Sub 消息 ID。用于完成此任务的高效增量式汇总机制是在 PubsubIO API 中提取的。

如果将 PubsubIO 配置为使用自定义消息 ID,则 Dataflow 会通过保留其在过去 10 分钟内看到的所有自定义 ID 的列表来删除重复的消息。如果此列表中包含新消息的 ID,则假定该消息是重复的并舍弃。