Google Pubsub - 接收推送订阅的传递尝试

Posted

技术标签:

【中文标题】Google Pubsub - 接收推送订阅的传递尝试【英文标题】:Google Pubsub - Receive delivery attempt for push subscription 【发布时间】:2021-06-01 20:57:17 【问题描述】:

我有一个由 Pubsub 推送订阅触发的 Google 云功能。

我想知道给定消息的当前传递尝试

在请求订阅中,它通过设置死信主题来工作,但是我无法在推送订阅消息属性中获得传递尝试。尝试配置死信主题,delivery_attempt 属性不在消息属性中。

有没有办法在推送订阅中获取传递尝试参数?

【问题讨论】:

消息向函数显示了多少次?只有一个?几次? 【参考方案1】:

我不确定是否可以明确获取该数据...但我可以提出一个解决方法的想法以供考虑。

每次调用云函数时,您都可以(在您的代码中)创建/更新具有一些唯一 ID(消息事件 ID 或一些唯一业务相关标识符)的 Firestore 文档。该文档可能具有属性,其中之一是时间和/或尝试次数。

【讨论】:

【参考方案2】:

对于推送订阅,请使用 deliveryAttempt,而不是 delivery_attempt。文档中提到了这个here:

当 Pub/Sub 从推送订阅转发无法投递的消息时,您从订阅中收到的每条消息都包含 deliveryAttempt 字段。

【讨论】:

【参考方案3】:

在java中你可以使用订阅者类的静态方法。

对于 PubsubMessage 消息;

com.google.cloud.pubsub.v1.Subscriber.getDeliveryAttempt(message);

根据文档 sais 返回接收到的 PubsubMessage 的传递尝试计数。

Integer maxAttemps = 5;
     private void killMessage(Event<String> event, Exception en,
      BasicAcknowledgeablePubsubMessage acknowledgeable) 
    Integer attemps = Subscriber.getDeliveryAttempt(acknowledgeable.getPubsubMessage());
    if(attemps.intValue() < maxAttemps) 
      acknowledgeable.nack();
      return;
    
    sendToErrorQueue(event, en, acknowledgeable);
  

https://googleapis.dev/java/google-cloud-pubsub/latest/com/google/cloud/pubsub/v1/Subscriber.html

【讨论】:

以上是关于Google Pubsub - 接收推送订阅的传递尝试的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息从 GCP 推送订阅传递到本地 PC?

Google pubsub golang 订阅者在空闲几个小时后停止接收新发布的消息

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

推送订阅发送多条消息远早于消息确认截止日期

将频道与 google pubsub poll 订阅者一起使用

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