PubSub 最大传递尝试次数和死信主题

Posted

技术标签:

【中文标题】PubSub 最大传递尝试次数和死信主题【英文标题】:PubSub Maximum delivery attempts & Dead letter topic 【发布时间】:2021-07-24 20:18:45 【问题描述】:

5 月 1 日快乐,

我正在做一个简单的 POC 来利用 PusSub 的死信主题功能。我将订阅配置为在 20 次最大传递尝试后将消息重新发布到单独的死信主题(以下是订阅拉取代码和使用的示例消息)。 注意:我使用 Cloud Console 配置了订阅。

问题/挑战:即使经过 36 次传递尝试,测试消息仍然没有重新发布到死信主题。根据文档,我假设我的测试消息将重新发布到死信主题,并且不应在 20 次尝试后传递。我错过了什么?

拉取订阅码

const PubSub = require('@google-cloud/pubsub');
var moment = require('moment');  

process.env['GOOGLE_APPLICATION_CREDENTIALS'] = 'abcxyz.json';

const pubSubClient = new PubSub();
const timeout = 100;

async function listenWithCustomAttributes() 
  const subscription = pubSubClient.subscription("projects/random-1234/subscriptions/testsub");
  
  // Create an event handler to handle messages
  const messageHandler = (message) => 

    const datetime = moment().format('mmmm do yyyy, h:mm:ss a');
    console.log(`$datetime::: $message.id:`);
    console.log(`$message.data`);
    console.log(`Delivery Attempt: $message.deliveryAttempt`);
    console.log(`custom Attributes: $JSON.stringify(message.attributes)`);
    console.log('\n');

    //NACK for re-delivery
    message.nack();
  ;

  subscription.on('message', messageHandler);
  setTimeout(() => 
    subscription.removeListener('message', messageHandler);
  , timeout * 1000000);


listenWithCustomAttributes();

PubSub 消息示例

const message   = 
    "event": "First",
    "message": "HELLOWORLD!!!!",
;

【问题讨论】:

Please do not upload images of code/errors when asking a question. 【参考方案1】:

我终于能够解决这个问题了。

根据documentation“如果您使用 Cloud Console 配置订阅,则会自动授予角色。”但是,这似乎不再有效。我们需要在订阅控制台的“DEAD LETTERING”(OVERVIEW 旁边)中授予所需的发布者和订阅者角色,或者按照文档中的说明添加 iam 策略。

【讨论】:

以上是关于PubSub 最大传递尝试次数和死信主题的主要内容,如果未能解决你的问题,请参考以下文章

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

为啥 PubSub 订阅在保留期到期后向死信主题发布消息

Google Cloud Pub/Sub - 捕获发送到死信主题的消息的消息传递失败原因[关闭]

GCP - 如何添加关于发送到 pubsub 死信队列的消息数量的警报?

Google pubsub 死字在 golang 中不起作用

PubSub 死字