Google Cloud Pub / Sub Python SDK получают по одному сообщению за раз - PullRequest
0 голосов
/ 17 мая 2018

Проблема : Мой вариант использования: я хочу получать сообщения из Google Cloud Pub / Sub - по одному сообщению за раз, используя Python Api. Во всех текущих примерах упоминается использование опции Async / callback для извлечения сообщений из подписки Pub / Sub. Проблема с этим подходом заключается в том, что мне нужно сохранить поток.

Можно ли просто получить 1 сообщение и закрыть соединение, т. Е. Есть ли функция, в которой я могу просто установить параметр (что-то вроде max_messages) в 1, чтобы после получения 1 сообщения поток завершался?

В документации здесь ничего не указано для Python Synchronous pull, в которой, похоже, есть опция num_of_messages для других языков, таких как Java.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

См. Следующий пример по этой ссылке :

from google.cloud import pubsub_v1

client = pubsub_v1.SubscriberClient()
subscription = client.subscription_path('[PROJECT]', '[SUBSCRIPTION]')
max_messages = 1

response = client.pull(subscription, max_messages)
print(response)

Я попробовал себя, и с его помощью вы получаете одно сообщение за раз.

Если вы получили ошибку, попробуйте обновить библиотеку pubsub до последней версии:

pip install --upgrade google-cloud-pubsub

В документации здесь у вас есть дополнительная информация о методе извлечения, использованном во фрагменте кода:

Метод Pull основан на модели запрос / ответ:

Приложение отправляет запрос на сообщения. Сервер отвечает с ноль или более сообщений и закрывает соединение.

0 голосов
/ 18 мая 2018

Согласно официальной документации здесь :

... вы можете добиться ровно однократной обработки потоков сообщений Pub / Sub, PubsubIO дедуплицирует сообщения на основе пользовательских идентификаторов сообщений или идентификаторы, назначенные Pub / Sub.

Таким образом, вы должны иметь возможность использовать идентификаторы записей, то есть идентификаторы для ваших сообщений, чтобы обеспечить возможность однократной обработки через границу между Потоком данных и другими системами. Чтобы использовать идентификаторы записей, вы вызываете idLabel при создании преобразований PubsubIO.Read или PubsubIO.Write, передавая строковое значение по вашему выбору. В Java это будет:

public PubsubIO.Read.Bound<T> idLabel(String idLabel)

Возвращает преобразование, подобное этому, но считывающее уникальные идентификаторы сообщений из заданного атрибута сообщения.

...