У Firestore внезапно возникла огромная задержка срабатывания

# #javascript #firebase #google-cloud-firestore #google-cloud-functions

Вопрос:

Мы запускаем приложение в Firestore и получили простой триггер, который указывает, что при создании или обновлении сведений о заказе часть его информации должна быть перезаписана в родительской коллекции заказов.

Функция для этого получила следующий код

 export const updateOrderDetails = functions
  .region(FUNCTION_REGION)
  .firestore.document("orders/{orderId}/details/pickupAndDropoff")
  .onWrite(async (change, context) => {
    return await admin
      .firestore()
      .collection("orders")
      .doc(context.params.orderId)
      .set({ pickupAndDropoff: change.after.data() }, { merge: true });
  });
 

Раньше он работал нормально, но теперь наугад примерно каждое третье его выполнение задерживается. Иногда на несколько минут. В журналах облачных функций мы видим нормальное время выполнения

Что еще хуже, время от времени наше change.after.data() не определено, но мы никогда ничего не удаляем — это просто обновление и создание.

Он работал нормально, мы ничего не меняли с прошлой недели, но теперь у него начались эти неожиданные задержки. Мы также проверили состояние firebase, но в службе функций firebase сбоев нет. Что может быть причиной этого?

Комментарии:

1. У вас есть номер для более медленных функций, и когда это произойдет? Это в начальном триггере? Или в процессе обработки? Может ли это быть холодный запуск, например, потому, что одна из других функций еще не завершена, поэтому GCF необходимо запустить новый экземпляр?

2. @FrankvanPuffelen Я понимаю, что холодный запуск будет отображаться в журнале функций, в котором говорится, что для этого потребовалось 3000 мс вместо 100 мс, верно? У нас нет такой проблемы. Мы запускаем только эту функцию, мы делаем это раз в несколько секунд, и после 3-4 циклов она застревает и задерживается.

3. @FrankvanPuffelen сегодня все снова работает нормально, после ~30 часов сохранения этой проблемы. Мы ничего не изменили. Как вы думаете, возможно ли, что это была проблема с инфраструктурой? Мы не видели никакой информации об отключениях в службе облачных функций.

4. Я ничего не слышал об отключении (они крайне редки в Firestore), а также не видел подобных сообщений. Но если вы обратитесь в службу поддержки Firebase за персональной помощью в устранении неполадок, они, возможно , смогут проверить. — Распространенной причиной снижения производительности с течением времени также является первый скачок нагрузки, так как Firestore требуется время для увеличения. Смотрите документы по этому вопросу здесь .

5. Хорошо, я сделал запрос в службу поддержки, но тем временем буду рад услышать, что кто-то столкнулся с подобной проблемой и в чем ее причина.

Ответ №1:

Проблема может быть связана с монотонно увеличивающимся идентификатором порядка, как переданный здесь параметр:

 ...
.collection("orders")
  .doc(context.params.orderId)
...
 

Если вы можете один раз проверить, монотонно ли увеличивается с каждым запросом передаваемый здесь идентификатор заказа? Это может привести к возникновению горячих точек, что влияет на задержку.

Чтобы объяснить, я думаю, что скорость записи должна меняться в разные дни и в разное время — по мере изменения трафика пользователей, использующих приложение или запросы на нагрузочное тестирование, — что создает неожиданное поведение. При низкой скорости записи запросы большую часть времени работают так, как и ожидалось. При высокой скорости записи запросы сталкиваются с ситуацией горячей точки в firestore, как указано в документации firestore, что приводит к задержкам (проблема задержки).

Вот соответствующая ссылка на документацию по передовому опыту firestore.

Комментарии:

1. Что вы подразумеваете под монотонным увеличением? В нашем случае OrderID-это уникальный идентификатор, сгенерированный firebase, это не автоматически увеличиваемое значение. Кроме того, у нас нет никакого трафика, так как мы просто тестировали его в консоли Firestore, меняя один документ за раз каждые 10-15 секунд, все еще получая задержки.

2. Монотонное увеличение означает последовательное увеличение, например, порядка 1, порядка 2 и т. Д. Как вы сказали, если идентификатор заказа уникален и случаен, функция облака показывает Можете ли вы рассказать, как вы тестируете облачную функцию? Давайте достигнем всех возможных целей, чтобы найти решение. Если служба/зависимость вызывающего абонента функции ответственна за создание задержек, мы можем с нетерпением ждать, чтобы исправить это, чтобы решить проблему.

Ответ №2:

Благодаря предложению Фрэнка ван Пуффелена мы отправили этот вопрос непосредственно в службу поддержки Firebase, и после их внутреннего расследования мы получили ответ от инженерной команды, что на самом деле это была неисправность инфраструктуры.

Ответ, который я получил от них, был::

Я обострил проблему, чтобы восстановить больше информации. До сих пор кажется, что была проблема с доставкой паба/суба и созданием события. Команда Firestore также взаимодействует с командой паба/субподрядчика, чтобы расследовать проблему и предотвратить будущие инциденты.

Похоже, что лучший способ справиться с такими проблемами-это быстро написать напрямую в службу поддержки Firebase, потому что, как они упомянули в автоматическом ответе, который я получил после отправки билета в службу поддержки:

В случае сбоев в работе Firebase, не указанных на панели мониторинга состояния, мы ответим в течение 4 часов.

что, по-видимому, является лучшим вариантом.