Google pubsub golang订户闲置了几个小时后停止接收新发布的消息

时间:2019-04-04 05:16:34

标签: go google-cloud-pubsub subscriber

我在google pubsub中创建了一个主题,并在主题中创建了SUBSCRIPTION,并进行了以下设置

enter image description here

然后我写了一个puller in go,使用它的Receive提取并确认已发布的消息

package main

import (
    ...
)

func main() {
    ctx := context.Background()

    client, err := pubsub.NewClient(ctx, config.C.Project)
    if err != nil {
       // do things with err
    }
    sub := client.Subscription(config.C.PubsubSubscription)
    err := sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
        msg.Ack()
    })

    if err != context.Canceled {
      logger.Error(fmt.Sprintf("Cancelled: %s", err.Error()))
    }
    if err != nil {
      logger.Error(fmt.Sprintf("Error: %s", err.Error()))
    }
  }

没什么好看的,它运作良好,但是过了一会儿(闲置3个小时后〜),它停止接收新发布的消息,没有错误,什么也没有。我想念什么吗?

4 个答案:

答案 0 :(得分:1)

通常,订户可能停止接收消息的原因有几个:

  1. 如果订户不确认或拒绝消息,则可以达到流控制限制,这意味着无法再传递消息。考虑到您立即确认消息,在您的特定情况下似乎并非如此。
  2. 如果另一个订户启动了相同的订阅,则它可能正在接收消息。在这种情况下,人们希望订户接收到一部分消息,而不是根本没有消息。
  3. 发布者只是停止发布消息,因此没有消息要接收。如果您重新启动订户,并且它再次开始接收消息,则可能不是这种情况。您还可以通过查看subscription/backlog_bytes的{​​{3}}来验证是否积压了工作。

如果您的问题不属于这些类别之一,则最好与您的项目名称,主题名称和订阅名称联系以获得Google Cloud支持,以便他们可以将问题缩小到您的用户代码中,客户端库本身或服务。

答案 1 :(得分:1)

我正在经历类似的事情,并且我很确定没有其他订阅者在提取这些消息。

尝试以下操作:转到主题,创建一个新的虚假订阅(将其命名为任意名称,因为稍后将其删除)。之后,我立即完成了虚假订阅(我正在使用python sample code client进行订阅)和真实订阅。奇怪的解决方案,但也许使话题再次醒来。

希望来自Google的人可以为我们提供一些有关这里发生的情况的见解,但我绝对不会付给他们足够的费用来获得直接支持。

答案 2 :(得分:0)

几乎没有什么变化可以帮助您更好地调查问题: -检查接收错误 -为接收使用单独的上下文

ctx := context.Background()
err := sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
    msg.Ack()
})
if err != nil {
    log.Fatal(err)
}

答案 3 :(得分:0)

您的代码以前可以工作吗?从今天开始,我在PubSub上遇到问题。 Python PubSub库中的诸如get_topic()create_topic()之类的方法停止工作,但是在发送和提取消息方面没有任何问题。昨天一切正常,但今天不...