Google PubSub Request 消息即使确认?

Posted

技术标签:

【中文标题】Google PubSub Request 消息即使确认?【英文标题】:Googlr PubSub Request messages even if acknowledged? 【发布时间】:2021-06-18 15:35:39 【问题描述】:

我正在接收来自我创建的订阅的消息:

subscriber = pubsub_v1.SubscriberClient(credentials=credentials)
subscriber.create_subscription(name=subscription_name,topic=topic_name, ack_deadline_seconds=60)

我正在使用这个来接收:

subscriber = pubsub_v1.SubscriberClient()
subscription_path = subscriber.subscription_path(project_id, subscription_id)
future = subscriber.subscribe(subscription_path, callback=callback())

with subscriber:
    try:
        future.result()
    except TimeoutError:
        future.cancel()

def callback(msg):
    my_logic(msg)
    msg.ack()

虽然我在回调结束时承认我错过了来自发布者的前约 600 条消息(订阅存在)。我认为他们没有收到,但由于最小化的日志记录,我无法确认。无论如何,我需要恢复这些消息。

我读了这个页面:

https://cloud.google.com/pubsub/docs/replay-overview

不幸的是我的订阅没有设置retain_acked_messages=true

我有两个问题:

    检索这些丢失消息的最简单方法是什么?我知道他们会发生的时间段。是否可以指示服务使用时间戳重播它们?

    我应该对我的订阅进行任何更改以应对未来的问题吗?我应该在启动时创建快照吗?

【问题讨论】:

【参考方案1】:

如果您不保留已确认的消息,则无法寻求您的 PubSub 订阅并重播过去的确认消息。

快照很棒,尤其是对于测试(可重播性)或在生产中发布新版本之前(发生错误时回滚)。

IMO,retain_acked_messages 在您的情况下激活很重要。如果您的用例是重播已确认的消息,则当您拥有此参数时,快照的用处不大。

【讨论】:

感谢您的回答。我将消息存储到数据库超过一周(一周后是一个新系列),我需要确保我不会错过任何消息。我不热衷于寻找,因为它需要知道时间段。我认为从自动化的角度来看,这可能很难实现。我认为这对手动更正很有好处,但工作量很大。我最初的感觉是快照可能更适合自动更正? 用法不一样。快照是在某个时间点进行拍摄,寻找倒带时间并重播消息。快照后,所有新消息都不包含在其中。搜索也考虑到新消息。一切都取决于您的用例。

以上是关于Google PubSub Request 消息即使确认?的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud PubSub 不确认消息

Google PubSub 排序密钥问题,未启用消息排序

获取 Google Cloud PubSub 中单条消息的大小

Google PubSub 每次拉取的最大消息数

通过 Google Cloud Dataflow 将 PubSub 消息插入 BigQuery

Google Dataflow:根据条件仅将消息输出到 PubSub 主题之一