gcloud pubsub 订阅 pull 经常报空消息列表

Posted

技术标签:

【中文标题】gcloud pubsub 订阅 pull 经常报空消息列表【英文标题】:gcloud pubsub subscriptions pull often report empty message list 【发布时间】:2018-11-23 10:35:28 【问题描述】:

为什么“gcloud pubsub subscriptions pull”经常报空消息列表,而订阅中有消息需要确认?

见下图效果。消息 118870127432164 在订阅中可用,它从未被确认,但通常不会被报告。

lab@ubu1:~$ while :; do date; gcloud pubsub subscriptions pull projects/PROJECT/subscriptions/killbill-queue; done
Wed Jun 13 15:31:48 -03 2018
┌──────┬─────────────────┬───────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ DATA │    MESSAGE_ID   │               ATTRIBUTES              │                                                                                 ACK_ID                                                                                 │
├──────┼─────────────────┼───────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 6��  │ 118870127432164 │ billingAccountId=000000-000000-000000 │ TDgBRElTK0MLKlgRTgQhIT4wPkVTRFAGFixdRkhRNxkIaFEOT14jPzUgKEUSAgVPAihdeTBLNkFddgA-DRlyfWF0bFlFUAEQB3ZfWBEMYlxORAdzMhhzdWlyalsRBgZGUX9ZXzOA6NOyt7d6ZiQ9XhJLLD5-MzRFQV5AEg │
└──────┴─────────────────┴───────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Wed Jun 13 15:31:50 -03 2018
Listed 0 items.
Wed Jun 13 15:31:53 -03 2018
Listed 0 items.
Wed Jun 13 15:31:56 -03 2018
Listed 0 items.
Wed Jun 13 15:31:59 -03 2018
┌──────┬─────────────────┬───────────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ DATA │    MESSAGE_ID   │               ATTRIBUTES              │                                                                                 ACK_ID                                                                                 │
├──────┼─────────────────┼───────────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 6��  │ 118870127432164 │ billingAccountId=000000-000000-000000 │ TDgBRElTK0MLKlgRTgQhIT4wPkVTRFAGFixdRkhRNxkIaFEOT14jPzUgKEUSAgVPAihdeTBLNkFddgA-DRlyfWF0bFlFUAEQB3ZfWBEMYlxORAdzMhhzdWlyalsRBgZGUX9ZXzOA6NOyt7d6ZiQ9XhJLLD5-MzRFQV5AEg │
└──────┴─────────────────┴───────────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Wed Jun 13 15:32:01 -03 2018
Listed 0 items.
Wed Jun 13 15:32:05 -03 2018
Listed 0 items.
Wed Jun 13 15:32:07 -03 2018
Listed 0 items.

【问题讨论】:

【参考方案1】:

您引用的提取消息是“优秀的”。这意味着在 Google Cloud Pub/Sub 认为无法从原始订阅者那里获得确认之前,不应将其提供给其他订阅者。具体来说,它会一直等到“确认截止日期”,然后再向另一个订阅者提供已发布的消息。

From Google's Pub/Sub Documentation(强调我的):

将消息发送给订阅者后,订阅者必须确认或丢弃该消息。一条消息一旦被发送出去并在订阅者确认之前就被认为是未完成的。 Cloud Pub/Sub 将反复尝试传递任何尚未确认或未处理的消息。 订阅者有可配置的有限时间或ackDeadline 来确认消息。一旦截止日期过去,未确认的消息就会变为未确认。

从您分享的上下文来看,您似乎看到默认确认截止日期已超时:

确认截止日期:如果您的代码在截止日期之前未确认消息,则会再次发送消息。 默认为 10 秒。您可以指定的最大自定义期限为 600 秒(10 分钟)。

【讨论】:

明确一点:这并不意味着只有一个订阅者会收到一次消息。谷歌的文档非常清楚,虽然他们试图只发送一次,但这并不能保证。很有可能您像上面那样运行测试约 1/1000 次,即使它已经在确认截止日期窗口内发送给另一个订阅者,您仍然会再次收到该消息。【参考方案2】:

“经常拉空消息”的标题有点误导和隐含,标题也可以是“gcloud pubsub subscriptions pull acknowledges

因为这就是您认为发生的事情,它返回一个空列表,从那里的答案将解释它实际上没有确认,但消息只是在确认截止日期之前暂时处于“未完成”状态到达,然后它又回到que。

【讨论】:

以上是关于gcloud pubsub 订阅 pull 经常报空消息列表的主要内容,如果未能解决你的问题,请参考以下文章

Google Pub/Sub 如何在 Pull 上设置读取超时

Pubsub.pull 请求无法正常工作 - 去吧

排空或清除 Google Cloud pubsub 主题的最佳做法 [关闭]

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

Gcloud PubSub Java 实现 - java.util.concurrent.RejectedExecutionException

pubsub 订阅者出错:超出最大消息大小