# #python #google-cloud-platform #google-cloud-functions #google-cloud-pubsub
#питон #google-облачная платформа #google-облачные функции #google-облако-pubsub
Вопрос:
У меня есть X микроуслуг, каждая из которых публикуется в одном и том же пабе/подразделе. Сообщения, которые они публикуют, содержат идентификатор микросервиса. Я ищу способ убедиться, что pub/sub завершил обслуживание всех сообщений определенной микросервисы. Мое текущее решение состоит в том, чтобы подсчитать все сообщения, опубликованные из микросервиса, а затем подсчитать сообщения, которые были поданы в разделе паба/подраздела (через облачную функцию). Есть некоторые известные проблемы с этим подходом, и мне было интересно, есть ли лучший способ узнать, не содержит ли pub/sub сообщений от конкретной микросервисы?
Комментарии:
1. Кажется, логичным было бы опубликовать их в отдельных темах… почему вы публикуете их в одной и той же теме?
Ответ №1:
Нет другого способа узнать содержание сообщения, кроме как получить его, открыть и прочитать.
Лучшим решением может быть использование отдельной темы для каждого типа сообщений, и если очередь подписки пуста, это означает, что все сообщения были обработаны. Если вам нужно их посчитать, вы можете использовать журналы для отслеживания обработки сообщений в облачных функциях.
Альтернативой является использование одной темы PubSub и добавление идентификатора в атрибут сообщения. Затем вы можете создать подписку PubSub с фильтром по этому атрибуту и контролировать подписку, как и раньше.
Плохая сторона этого решения заключается в том, что оно не совместимо с интеграцией облачных функций PubSub. Вам нужно создать функции HTTP и подписку PubSub push, чтобы использовать функцию фильтра.
Комментарии:
1. Спасибо, это хорошее решение, но в нашем случае оно не сработает, так как у нас действительно работает много микросервисов одновременно. Иногда они маленькие и быстро заканчиваются, и было бы излишним предоставлять паб/суб для каждого из них.
Ответ №2:
Решение, к которому я пришел, заключается в следующем:
- создайте набор в redis и добавьте в него новый идентификатор сообщения
- Включите этот новый идентификатор сообщения в сообщение, опубликованное на pubsub
- облачная функция, которая запускается после pubsub, должна удалить новый идентификатор message_id из набора
- к концу процесса мы проверяем набор, и если он пуст, то процесс завершен.
Это также позволяет обрабатывать случаи, когда pub/sub публикует одно и то же сообщение более одного раза.