# #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 часов.
что, по-видимому, является лучшим вариантом.