Как работает вызов
Прогулка по одному вызову, чтобы объяснить ограничения, коды ошибок и время, которое вы наблюдаете.
1. Путь вызова
Шлюз и служба функций общаются по шине сообщений. Сообщение на этой шине имеет ограничение на размер, поэтому запрос или ответ размером более 256 КиБ не проходит: см. ограничения .
2. Внутри среды выполнения
- Один рабочий на вызов. Пограничная среда выполнения запускает новую изолированную рабочую роль V8 для каждого вызова с ограничением памяти и временем ожидания функции. Ничто в памяти не сохраняется от одного вызова к другому: не сохраняйте состояние в переменной. Используйте свою базу данных или хранилище.
- Код кэшируется на несколько секунд. Среда выполнения сохраняет код и ограничения функции в течение 5 секунд и удаляет их при развертывании. Переменные считываются при каждом вызове.
- Ваш запрос перестроен. Среда выполнения создает описанный вами запрос (
method,path,headers,body) и передает его обработчикуDeno.serve. Таким образом, функция ведет себя как любой HTTP-сервер. - Время выполнения устанавливает тайм-аут. По истечении
timeout_secsрабочий процесс отменяется; вызывающий абонент видит ошибку примерно после этой задержки. - WASM функции выполняются внутри самой службы с ограничениями по памяти, времени и инструкциям. Функция WASM может сообщать строки журнала, которые появляются в поле
logsответа; функция Deno не может.
3. Конверт и необработанный режим
У службы есть два способа вернуть ответ вашей функции, выбранный в заголовке запроса X-Aurabase-Invoke-Mode.
| Конверт (по умолчанию) | Необработанный (raw) | |
|---|---|---|
| Статус HTTP | Всегда 200 | Собственный статус функции |
| Тело | { data: { status, headers, body, logs, duration_ms }, meta } | Байты функции |
| Содержание | Текст JSON или UTF-8. | Что угодно, включая двоичные файлы |
| Используется | responseType: 'json', Студия | 'text', 'blob', 'arrayBuffer', прямой HTTP |
Конверт существует для того, чтобы один ответ JSON мог содержать статус, заголовки и продолжительность вызова. Его ограничение заключается в том, что байты не могут передаваться в формате JSON: именно поэтому двоичный ответ требует необработанного режима. SDK выбирает режим из responseType.
В необработанном режиме служба добавляет x-aurabase-invoke-origin: function к ответам вашей функции. Ошибка, исходящая от шлюза или среды выполнения, не несет ее. Вот как SDK отделяет FunctionsHttpError (ваша функция ответила) от FunctionsRelayError (сбой платформы).
4. Время, замеры и сбои
Три тайм-аута вложены друг в друга, так что ни один из них не заканчивается раньше, чем тот, который находится внутри него:
Служба ожидает выполнения timeout_secs плюс запас. Поскольку среда выполнения отменяет рабочий процесс в timeout_secs, вы обычно видите ошибку функции в этот момент и 504 TIMEOUT только в том случае, если сама среда выполнения перестает отвечать. Таким образом, 504 означает, что функция была запущена и могла иметь последствия: не повторяйте неидемпотентный вызов вслепую.
Учет и квота:
- Перед вызовом служба резервирует один вызов из квоты плана. Если квота исчерпана, вызов останавливается здесь с помощью
403. - После вызова он записывает вызов и его продолжительность в миллисекундах.
- Если вызов завершается неудачей до того, как ваша функция ответит, резервирование снимается и ничего не учитывается.
5. Что следует за вашим кодом
- Пусть каждый звонок будет коротким и без сохранения состояния. Для длительной работы поставьте в очередь задание.
- Делайте запросы и ответы небольшими; поместите файлы в хранилище и передайте ссылку.
- Сделайте функции идемпотентными: повторная попытка выполнения задания, повторная попытка клиента после сетевой ошибки или дублированная доставка cron могут запустить ваш код дважды.
- Авторизуйте заголовки идентификаторов платформы, поскольку они являются единственными значениями, которые вызывающая сторона не может подделать. См. безопасность.
- Задержку измерьте сами: каждый вызов платит за запуск воркера. Минимальная функция сообщила о
duration_ms: 74в локальном стеке.