# #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:
В общем, может быть несколько причин, по которым подписчик может перестать получать сообщения:
- Если подписчик не подтверждает или не отправляет сообщения, могут быть достигнуты пределы управления потоком, что означает, что больше сообщения не могут быть доставлены. Похоже, что в вашем конкретном случае это не так, учитывая, что вы немедленно подтверждаете сообщения.
- Если другой подписчик запускается для той же подписки, он может получать сообщения. В этом сценарии можно было бы ожидать, что подписчик получит подмножество сообщений, а не никаких сообщений вообще.
- Издатели просто перестают публиковать сообщения, и поэтому нет сообщений для получения. Если вы перезапустите подписчика, и он снова начнет получать сообщения, это, вероятно, не так. Вы также можете убедиться, что накопилось отставание, посмотрев на метрику 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 в качестве альтернативы, обновит вас