Подписчик Google pubsub golang перестает получать новые опубликованные сообщения после простоя в течение нескольких часов

# #go #google-cloud-pubsub #subscriber

#Вперед #google-cloud-pubsub #подписчик

Вопрос:

Я создал ТЕМУ в Google pubsub и создал ПОДПИСКУ внутри ТЕМЫ со следующими настройками

введите описание изображения здесь

затем я написал съемник в go, используя его прием для извлечения и подтверждения опубликованных сообщений

 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 часов простоя) он перестает получать новые опубликованные сообщения, никаких ошибок, ничего. Я что-то упускаю?

Ответ №1:

В общем, может быть несколько причин, по которым подписчик может перестать получать сообщения:

  1. Если подписчик не подтверждает или не отправляет сообщения, могут быть достигнуты пределы управления потоком, что означает, что больше сообщения не могут быть доставлены. Похоже, что в вашем конкретном случае это не так, учитывая, что вы немедленно подтверждаете сообщения.
  2. Если другой подписчик запускается для той же подписки, он может получать сообщения. В этом сценарии можно было бы ожидать, что подписчик получит подмножество сообщений, а не никаких сообщений вообще.
  3. Издатели просто перестают публиковать сообщения, и поэтому нет сообщений для получения. Если вы перезапустите подписчика, и он снова начнет получать сообщения, это, вероятно, не так. Вы также можете убедиться, что накопилось отставание, посмотрев на метрику Stackdriver для subscription/backlog_bytes .

Если ваша проблема не попадает ни в одну из этих категорий, было бы лучше обратиться в службу поддержки Google Cloud, указав название вашего проекта, название темы и название подписки, чтобы они могли сузить проблему до вашего пользовательского кода, самой клиентской библиотеки или сервиса.

Комментарии:

1. Если мой предел управления потоком достигнут — как я могу узнать об этом? Я подозреваю, что некоторые из моих сообщений работают слишком долго.

Ответ №2:

Я испытывал нечто подобное, и я был уверен, что другой подписчик не получал эти сообщения.

Попробуйте это: перейдите в раздел, создайте новую фиктивную подписку (назовите ее как хотите, потому что вы просто удалите ее позже). Сразу после того, как я это сделал, как поддельная подписка (для подписки на которую я использовал клиент с образцом кода python), так и реальная снова получали сообщения. Странное решение, но, возможно, оно снова подняло тему.

Надеюсь, кто-нибудь из Google мог бы дать нам некоторое представление о том, что здесь происходит, но я определенно не плачу им достаточно, чтобы получить прямую поддержку.

Ответ №3:

Несколько изменений помогут вам лучше изучить проблему: — Проверить ошибку при получении — Использовать отдельный контекст для получения

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

Комментарии:

1. сделал это [я обновил вопрос mny], он не показывает никаких ошибок, я также использую GRPC_GO_LOG_SEVERITY_LEVEL=info только для того, чтобы он регистрировал все остальное

Ответ №4:

Работал ли ваш код раньше? С сегодняшнего дня у меня проблемы с PubSub. Такие методы, как get_topic() , create_topic() в библиотеке Python PubSub, перестают работать, но у меня нет никаких проблем с отправкой и извлечением сообщений. Вчера все работало нормально, а сегодня нет…

Комментарии:

1. код просто работает, но через некоторое время он перестает извлекать или получать сообщения без каких-либо ошибок. Моя команда в настоящее время опробует библиотеку python в качестве альтернативы, обновит вас