【问题标题】:Pub/Sub - unable to pull undelivered messagesPub/Sub - 无法提取未传递的消息
【发布时间】:2021-09-28 03:31:37
【问题描述】:

我公司的 Pub/Sub 存在问题。我们的一些消息被卡住了,并且最旧的未确认消息年龄随着时间的推移而增加。

1 天图表:

当我转到指标资源管理器并选择过期确认截止日期计数时,这是一周图表。

我决定找出这些消息被卡住的原因,但是当我运行 pull 命令(如下)时,我得到了 Listed 0 items 响应。因此无法看到它们。

有没有办法弄清楚为什么某些消息显示为未确认?

此外,未确认消息计数显示整个月的消息数量相同(大约 2k),即使每天都有新消息发布。

以下是我们用于此订阅的参数:

我尝试通过将截止日期设置为 600 秒来修复此错误,但没有帮助。

另外,我想提一下,我们使用 node.js Pub/Sub 客户端库来处理消息。

【问题讨论】:

  • 你说“这个”订阅。该主题还有其他订阅吗?消息可能正在等待另一个订阅的拉取。
  • @DazWilkin 感谢您的评论。该主题只有一个订阅,即我描述的那个。
  • 那我建议你联系云支持并让工程师调查
  • 好的,感谢您的宝贵时间
  • @DazWilkin 多个订阅的存在不会导致消息被等待传递到另一个订阅。如果同一订阅上有多个订阅者,就会发生这种情况。换句话说,如果某些消息已经发送给订阅者,则在 ack 截止日期过去之前,这些消息没有资格重新发送。

标签: google-cloud-platform gcloud google-cloud-pubsub


【解决方案1】:

无法拉取消息的最常见原因是:

  1. 订阅者客户端已经收到消息并“忘记”了它们,这可能是由于抛出了异常而未处理。在这种情况下,消息将继续被客户端租用,直到截止日期过去。客户端库都会自动延长租约,直到达到maxExtension 时间。如果这些消息总是被遗忘,则可能是它们被重新传递给订阅者并再次被遗忘,导致它们无法通过gcloud 命令行工具或 UI 拉取。
  2. 可能存在恶意订阅者。可能是另一个订阅者正在某处为同一个订阅运行,并且正在“窃取”这些消息。有时,这可能是一项测试作业,或者是早期用于查看订阅是否按预期工作并且未被拒绝的东西。
  3. 您可能会遇到large backlog of small messages 的情况。这应该在较新版本的客户端库中得到修复(Node 客户端的 v2.3.0 已修复)。
  4. gcloud pubsub subscription pull 命令和 UI 不能保证返回消息,即使有一些可以拉取。有时,快速连续多次重新运行命令有助于拉取消息。

您看到过期的确认截止日期可能指向 1、2 或 3,因此值得检查这些内容。否则,您应该open a support case,以便工程师可以更具体地查看积压并确定消息的位置。

【讨论】:

  • 谢谢!我会看看这些并返回我的结果。