Как узнать, содержит ли раздел паб/подраздел сообщения с определенным содержанием?

# #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:

Решение, к которому я пришел, заключается в следующем:

  1. создайте набор в redis и добавьте в него новый идентификатор сообщения
  2. Включите этот новый идентификатор сообщения в сообщение, опубликованное на pubsub
  3. облачная функция, которая запускается после pubsub, должна удалить новый идентификатор message_id из набора
  4. к концу процесса мы проверяем набор, и если он пуст, то процесс завершен.

Это также позволяет обрабатывать случаи, когда pub/sub публикует одно и то же сообщение более одного раза.