Функция облачной защиты Firebase дважды вызывается

Procedurally Generated спросил: 28 марта 2018 в 01:35 в: firebase

У нас есть функция облака, настроенная с помощью триггеров pub / sub.

Функция вызывается topic(NAME).onPublish()

Если функция вызывается, когда она холодная , он всегда выполняется дважды.

Function execution took 284 ms, finished with status: 'ok' METHOD_NAME METHOD_ID
Received message from pub sub METHOD_NAME METHOD_ID
Function execution started METHOD_NAME METHOD_IDFunction execution took 24271 ms, finished with status: 'ok' METHOD_NAME METHOD_ID
Received message from pub sub METHOD_NAME METHOD_ID
Function execution started METHOD_NAME METHOD_ID

После этого все будущие сообщения запускаются только один раз, пока функция не станет холодной.

Это потому, что требуется длительный время завершения первого вызова и таймаут заставляет его запускать снова? Любой способ предотвратить это?

1 ответ

Oliver ответил: 28 марта 2018 в 09:25

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

  1. быстро закомментируйте часть функции, чтобы увидеть, исчезнет ли проблема (по возможности, поместите ее в свой локальный терминал, используя модуль timeit)
  2. увеличение Acknowledgement Deadline секунд (после подписки); по умолчанию 10, так что это может легко стать проблемой; попробуйте 20, 40 и т. д.
  3. убедитесь, что при первом запуске функция занимает меньше времени, чем значение функции Timeout (по умолчанию 60 секунд - проблема, скорее всего, не будет)
  4. ол>
Procedurally Generated ответил: 28 марта 2018 в 05:08
Для Acknowledgement Deadline установлено значение 300 секунд. Вы правы по умолчанию, это 10 с, похоже, облачная функция устанавливает его на 300 при создании подписки. Так что это не проблема.
Procedurally Generated ответил: 28 марта 2018 в 05:14
Тема pub / sub подталкивает к конечной точке appspot.com (механизм приложений). К этому запросу применяется крайний срок в 300 секунд. Я не уверен, что этот URL-адрес appspot внутренне направляет в развернутую облачную функцию или есть приложение для ядра приложения, которое затем перенаправляет запрос в облачные функции. Есть идеи, как это работает внутри?
Procedurally Generated ответил: 28 марта 2018 в 05:15
Время первого запуска не превышает 60 секунд, оно всегда меньше 30 секунд.
Oliver ответил: 29 марта 2018 в 09:49
@precedurallygenerated Вы пробовали пункт № 1?
Procedurally Generated ответил: 29 марта 2018 в 06:14
Я пытаюсь это сейчас