Google 实时处理的 Cloud Dataflow 延迟
Google Cloud Dataflow latency for real-time processing
如果我们只是在高流量 Google Dataflow 集群上进行简单转换,并且每个“数据点”都很小,那么我们期望 Dataflow 的延迟有多低。
如果相关的话,我们计划使用间隔持续时间为 3 秒的会话窗口策略。
从数据点进入 Dataflow 到我们有结果输出的时间可以少于 2 秒,这是否现实?不到 1 秒?
我们已经 运行 使用测试工具对我们的应用程序流程进行了基准测试,但随后恢复为对当前 out-of-the-box Google-supplied PubSub 到 PubSub 模板流程进行基准测试(参见:https://cloud.google.com/dataflow/docs/templates/overview,虽然此处未列出 - 您可以从控制台创建它)。
我们的测试工具生成并发送了数百万 JSON-formatted 条带有时间戳的数百字节消息,并比较了两端的延迟。
非常简单:
测试发布者 -> PubSub -> 数据流 -> PubSub -> 测试订阅者。
对于单实例发布者和订阅者,我们改变了消息速率并试验了窗口和触发策略,看看我们是否可以改善平均延迟,但通常无法改善超过 1.7 秒 end-to-end 每秒 1,500 - 2000 条消息(我们的典型工作负载)。
然后我们从等式中删除 Dataflow,直接将发布者连接到订阅者,对于相同的消息速率,延迟通常在 20-30 毫秒 左右。
恢复使用标准的 PubSub 到 PubSub 数据流模板,我们发现 end-to-end 延迟类似于我们的应用程序数据流,大约 1.5 - 1.7 秒。
我们在管道中的不同点对时间戳进行了采样,并将值写入了一些自定义指标,并且发现将消息添加到 PubSubIO.Read 的初始 PCollection 的平均延迟约为 380msec,但最小值低至 25msec,由于启动开销,我们忽略了较高的值。但似乎存在我们无法影响的开销。
我们尝试的开窗策略如下所示:
Pipeline p = Pipeline.create(options);
/*
* Attempt to read from PubSub Topic
*/
PCollectionTuple feedInputResults =
p.apply(feedName + ":read", PubsubIO.readStrings().fromTopic(inboundTopic))
.apply(Window.<String>configure()
.triggering(Repeatedly
.forever(AfterWatermark.pastEndOfWindow()
.withEarlyFirings(
AfterProcessingTime
.pastFirstElementInPane()
.plusDelayOf(Duration.millis(windowDelay)))
// Fire on any late data
.withLateFirings(AfterPane.elementCountAtLeast(windowMinElementCount))))
.discardingFiredPanes())
.apply(feedName + ":parse", ParDo.of(new ParseFeedInputFn())
.withOutputTags(validBetRecordTag,
// Specify the output with tag startsWithBTag, as a TupleTagList.
TupleTagList.of(invalidBetRecordTag)));
如果我们只是在高流量 Google Dataflow 集群上进行简单转换,并且每个“数据点”都很小,那么我们期望 Dataflow 的延迟有多低。
如果相关的话,我们计划使用间隔持续时间为 3 秒的会话窗口策略。
从数据点进入 Dataflow 到我们有结果输出的时间可以少于 2 秒,这是否现实?不到 1 秒?
我们已经 运行 使用测试工具对我们的应用程序流程进行了基准测试,但随后恢复为对当前 out-of-the-box Google-supplied PubSub 到 PubSub 模板流程进行基准测试(参见:https://cloud.google.com/dataflow/docs/templates/overview,虽然此处未列出 - 您可以从控制台创建它)。
我们的测试工具生成并发送了数百万 JSON-formatted 条带有时间戳的数百字节消息,并比较了两端的延迟。 非常简单:
测试发布者 -> PubSub -> 数据流 -> PubSub -> 测试订阅者。
对于单实例发布者和订阅者,我们改变了消息速率并试验了窗口和触发策略,看看我们是否可以改善平均延迟,但通常无法改善超过 1.7 秒 end-to-end 每秒 1,500 - 2000 条消息(我们的典型工作负载)。
然后我们从等式中删除 Dataflow,直接将发布者连接到订阅者,对于相同的消息速率,延迟通常在 20-30 毫秒 左右。
恢复使用标准的 PubSub 到 PubSub 数据流模板,我们发现 end-to-end 延迟类似于我们的应用程序数据流,大约 1.5 - 1.7 秒。
我们在管道中的不同点对时间戳进行了采样,并将值写入了一些自定义指标,并且发现将消息添加到 PubSubIO.Read 的初始 PCollection 的平均延迟约为 380msec,但最小值低至 25msec,由于启动开销,我们忽略了较高的值。但似乎存在我们无法影响的开销。
我们尝试的开窗策略如下所示:
Pipeline p = Pipeline.create(options);
/*
* Attempt to read from PubSub Topic
*/
PCollectionTuple feedInputResults =
p.apply(feedName + ":read", PubsubIO.readStrings().fromTopic(inboundTopic))
.apply(Window.<String>configure()
.triggering(Repeatedly
.forever(AfterWatermark.pastEndOfWindow()
.withEarlyFirings(
AfterProcessingTime
.pastFirstElementInPane()
.plusDelayOf(Duration.millis(windowDelay)))
// Fire on any late data
.withLateFirings(AfterPane.elementCountAtLeast(windowMinElementCount))))
.discardingFiredPanes())
.apply(feedName + ":parse", ParDo.of(new ParseFeedInputFn())
.withOutputTags(validBetRecordTag,
// Specify the output with tag startsWithBTag, as a TupleTagList.
TupleTagList.of(invalidBetRecordTag)));