Google Cloud PubSub:如何仅读取最新记录

Posted

技术标签:

【中文标题】Google Cloud PubSub:如何仅读取最新记录【英文标题】:Google Cloud PubSub: How to read only latest records 【发布时间】:2020-01-08 08:17:03 【问题描述】:

在 Kafka 中有 2 个设置 earliestlatest,您可以从主题的最早偏移量 (0) 或最新事件(对实时有用)进行读取

我现在将 PubSub 与 Dataflow 和 Beam 一起使用,但默认情况下,该作业似乎每次启动时都会从最早读取。如何配置它以使其仅读取最新记录?

latest 是 Kafka 中的默认值,谁能解释为什么这在 Pub/Sub 中不容易实现?

【问题讨论】:

Google PubSub - getting last message的可能重复 【参考方案1】:

最新的定义是什么?事实上,使用 Beam,PubsubIO 阅读器是无限阅读。也就是说,没有尽头,最近之后总会有更近的!

所以,这是哲学部分。其实你要定义,最新的比较是什么。使用光束,您可以使用windowing。然后,您可以说,在 5 分钟的窗口内,我想处理最后一个。这里最新的定义是正确的,可以实现。

【讨论】:

我熟悉窗口化,但它不适合我的情况。如果我重新启动一个应用程序,我不希望它从一开始就处理一个主题的所有消息,只处理应用程序启动后到达的新消息。这在 Beam / PubSub 中是否可行? 在这种情况下,寻求最佳解决方案。将 seek 设置为 Now,然后启动您的管道。【参考方案2】:

您可以尝试使用 seek 选项:https://cloud.google.com/pubsub/docs/reference/rest/v1/projects.subscriptions/seek

它仍然有点初级,因为您需要确定时间戳或快照。

我猜 Apache Beam 选项将使用 withTimestampAttribute

https://beam.apache.org/releases/javadoc/2.15.0/org/apache/beam/sdk/io/gcp/pubsub/PubsubIO.Read.html#withTimestampAttribute-java.lang.String-

【讨论】:

根据链接文档,seek API 确认早于给定时间戳的消息。所以是的,您将阅读最后的消息但您会丢失较旧的消息,因为它们会被确认。我认为这不是 OP 想要实现的目标。 您可以通过设置retain-acked-messages 功能来避免丢失旧邮件。这将确保消息不会丢失,但要接收它们,您必须回到更早的位置。

以上是关于Google Cloud PubSub:如何仅读取最新记录的主要内容,如果未能解决你的问题,请参考以下文章

MQTT 到 Google Cloud PubSub 重新发布解决方案的设计方法/模式

如何在 Google.Cloud.PubSub.V1 SubscriberServiceApiClientBuilder 中配置频道选项

google.cloud.pubsub_v1 和 google.cloud.pubsub 有啥区别?

如何从 google-cloud-platform vminstance 中的 pubsub 回调函数调用全局变量?

如何通过 terraform 使用服务帐户创建 google cloud pubsub pull 订阅?

为 Google PubSub 暂停 Spring Cloud StreamListener