Firebase Pub / sub триггер: выполнение несколько раз спорадически - PullRequest
0 голосов
/ 14 ноября 2018

Мы используем Firebase для нашего приложения, которое должно обработать некоторые данные и затем отправить серию электронных писем после того, как их данные будут определены.

Прямо сейчас я запускаю один обработчик через CRON (который использует pub / sub), который обрабатывает данные и затем публикует серию сообщений в другой pub / sub теме. Эта тема, в свою очередь, имеет аналогичную триггерную функцию, которая проходит через несколько процессов, а затем отправляет одно электронное письмо за выполнение.

// Triggered by CRON task
const cronPublisher = functions.pubsub.topic('queue-emails').onPublish(async () => {
   //processing
   ... 
   // Publish to other topic
   await Promise.all(
     emails.map((email) =>
        publisher.queueSendOffer(email)
     )
  );
});

// Triggered by above, at times twice
const sendEmail = functions.pubsub.topic('send-email').onPublish(async () => {
   //processing and send email
});

Проблема, с которой я сталкиваюсь, заключается в том, что 2-й триггер темы время от времени выполняется более одного раза, отправляя два идентичных электронных письма. Основная потенциальная причина, с которой я столкнулся через Google, заключается в длительном времени выполнения, что приводит к тайм-аутам и повторным попыткам. Это не должно иметь место , поскольку наш тайм-аут подтверждения настроен на 300 секунд, а время выполнения никогда не превышает ~ 12 секунд.

Кроме того, интерфейс Firebase, похоже, не дает вам никакого контроля над тем, как отправляется это подтверждение.

Эта функция CRON запускается каждый день, и проблема возникает только каждые 4-5 дней, но затем дублирует каждое электронное письмо.

Есть мысли?

Оценил.

1 Ответ

0 голосов
/ 15 ноября 2018

Если «каждое сообщение» дублируется, возможно, это ваша функция «cronPublisher», которая вызывается дважды?Cloud Pubsub предлагает хотя бы один раз семантику, поэтому ваша работа должна быть терпимой к этому https://cloud.google.com/pubsub/docs/subscriber#at-least-once-delivery.

Если вы хотите сохранить некоторую информацию в транзакции firebase, что это событие cron было получено, и проверить это перед публикацией,Вы можете запретить повторную публикацию в теме "send-email".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...