Подписчик Google Pubsub Golang перестает получать новые опубликованные сообщения после нескольких часов бездействия. - PullRequest
2 голосов
/ 04 апреля 2019

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

enter image description here

затем я написал пуллер в 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 ]

1 голос
/ 26 апреля 2019

У меня возникло нечто подобное, и я был почти уверен, что ни один подписчик не потянул эти сообщения.

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

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

1 голос
/ 04 апреля 2019

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

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

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

0 голосов
/ 04 апреля 2019

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

0 голосов
/ 04 апреля 2019

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

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