DataFlow 不确认 PubSub 消息

jea*_*ean 0 google-cloud-datastore google-cloud-pubsub google-cloud-dataflow

简单的 gcloud 数据流管道:

PubsubIO.readStrings().fromSubscription -> Window -> ParDo -> DatastoreIO.v1().write()

当负载应用于 pubsub 主题时,消息会被读取但不会被确认

2017 年 7 月 25 日下午 4:20:38 org.apache.beam.sdk.io.gcp.pubsub.PubsubUnboundedSource$PubsubReader stats INFO:Pubsub projects/my-project/subscriptions/my-subscription 已收到 1000 条消息,950 条当前未读消息,843346 个当前未读字节,970 个当前飞行中消息,28367ms 最旧飞行中,1 个当前飞行中检查点,2 个最大飞行中检查点,770B/s 最近读取,1000 个最近接收,0 个最近扩展,0 个最近延迟扩展, 50 最近确认, 990 最近 NACK , 0 最近过期, 898 毫秒最近消息时间戳偏斜, 9224873061464212 毫秒最近水印偏斜, 0 最近延迟消息, 2017-07-25T23:16:49.437Z 最后报告水印

哪个管道步骤应该确认消息?

  • stackdriver 仪表板显示有一些确认,但未确认的消息数量保持稳定。
  • 跟踪中没有错误消息表明消息处理失败。
  • 条目显示在数据存储中

Ben*_*ers 5

Dataflow 只会在 PubSub 消息在其他地方持久提交后才确认它们。在由 PubSub -> ParDo -> 1 个或更多接收器组成的管道中,这可能会被任何有问题的接收器延迟(即使它们正在被重试,这也会减慢速度)。这是确保结果似乎得到有效处理的一部分。有关更多详细信息,请参阅上一个有关 Dataflow 何时确认消息的问题

更改此行为的一个(简单)选项是在 PubSub 源之后和接收器之前添加 GroupByKey(使用随机生成的密钥)。这将导致消息被更早地确认,但性能可能更差,因为 PubSub 通常比 GroupByKey 更擅长保存未处理的输入。