【问题标题】:Will PubSub forward message to dead letter topic after delivery_attempt exceeds max_delivery_attemptsDelivery_attempt 超过 max_delivery_attempts 后,PubSub 是否会将消息转发到死信主题
【发布时间】:2020-02-08 00:38:33
【问题描述】:

我的订阅者如下所示:

from google.cloud import pubsub_v1
from google.cloud.pubsub_v1.types import DeadLetterPolicy

dead_letter_policy = DeadLetterPolicy(
    dead_letter_topic='dead_letter_topic',
    max_delivery_attempts=5,
)

topic_path = subscriber.topic_path(PROJECT, TOPIC)
subscriber.create_subscription(sub_path, topic_path, dead_letter_policy=dead_letter_policy)

subscriber = pubsub_v1.SubscriberClient()
subscription_path  = subscriber.subscription_path(PROJECT, SUBSCRIPTION)

def callback(message):
    print("Received message: {}".format(message))
    print('Attempted:', message.delivery_attempt, 'times')
    data = message.data.decode('utf-8')
    data_d = json.loads(data)
    if data_d["name"] == "some_file.json":
        message.nack()
    else:
        message.ack()

收到的消息如下所示:

Received message: Message {
  data: b'{\n  "kind": "storage#object",\n  "id": "...'
  attributes: {
    "bucketId": "sample_bucket",
    ...
  }
}
Attempted: 12 times

显然它尝试了超过 5 次,为什么我仍然可以从 PubSub 主题中提取此消息? 这是订阅信息:

ackDeadlineSeconds: 10
deadLetterPolicy:
  deadLetterTopic: projects/someproject/topics/dead_letter
  maxDeliveryAttempts: 5
expirationPolicy:
  ttl: 2678400s
messageRetentionDuration: 604800s
name: projects/someproject/subscriptions/new_sub
pushConfig: {}
topic: projects/someproject/topics/pubsub_sample

【问题讨论】:

  • 您可以找到更新的文档以使用死信队列here。

标签: publish-subscribe google-cloud-pubsub google-api-python-client pypubsub


【解决方案1】:

通常,如果您未授予 Pub/Sub 权限以发布到您的死信主题或订阅您的订阅,则会发生这种情况。您需要确保已运行以下命令:

PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com"

gcloud pubsub topics add-iam-policy-binding <dead letter topic> \
 --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
 --role='roles/pubsub.publisher'

gcloud pubsub subscriptions add-iam-policy-binding <subscription with dead letter queue> \
 --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\
 --role='roles/pubsub.subscriber'

如果写入死信队列主题失败,则 Cloud Pub/Sub 将继续将消息传递给您的订阅者。

【讨论】:

  • 我们可以从 python 代码中做这个策略绑定吗?我正在运行时创建主题和订阅,并希望将死信策略附加到这些订阅,但找不到显示如何在运行时更改这些策略绑定的文档
猜你喜欢
  • 2020-12-14
  • 2017-12-13
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
  • 2017-04-01
  • 2023-02-26
相关资源
最近更新 更多