Go 1.22 serverless-функции с изолированными рантаймами
Деплойте функции на Go 1.22 как изолированные serverless-контейнеры: экспортируйте точку входа Handler(event, context), как в AWS Lambda, объявляйте зависимости в go.mod, включая CGO-пакеты, и делите маршрутизацию шлюза с функциями на Node.js и Python в том же воркспейсе.
Обновлено: 2026-06-28
Кратко
Суть ответа
Go 1.22 serverless-функции с изолированными рантаймами. Go-функции Inquir экспортируют Handler(event, context) — тот же контракт с картой события, что у Node.js и Python на платформе. Читайте HTTP-поля шлюза из event["body"], event["headers"] и event["queryStringParameters"]; возвращайте map или объект в стиле API Gateway. CGO-пакеты собираются при деплое, потому что функции работают в полноценных Docker-контейнерах.
Когда подходит
- Высоконагруженные JSON-обработчики, где важна экономная работа Go с памятью
- Функции, зависящие от CGO-пакетов (SQLite, обработка изображений, криптография)
- Команды, которые уже пишут сервисы на Go и хотят один язык по всему стеку
На что обратить внимание
- Edge-рантаймы работают в V8-изолятах: ни CGO, ни нативных модулей, ни системных пакетов. Биндинги SQLite, библиотеки обработки изображений и криптопакеты, зависящие от C, там просто недоступны.
- Рантайм Lambda для Go требует собрать main-бинарник со своей сигнатурой обработчика и bootstrap-прослойкой — это не та же карта события, что у Node.js и Python в том же API.
Нагрузка и где ломается
Почему Go в serverless раньше был болью
- Edge-изоляты не поддерживают CGO и нативные системные библиотеки
- AWS Lambda для Go требует свой bootstrap-бинарник и нестандартную обвязку обработчика
- Смешать Go-функции с API на Node.js или Python означало отдельные платформы или хаки со слоями Lambda
Go идеален для высоконагруженных обработчиков, CLI-утилит, скомпилированных в функции, и тяжёлых вычислений, которым помогают статическая типизация и горутины. Но стандартные serverless-платформы держат Go на вторых ролях: требуют bootstrap-обёртки, исключают CGO или вовсе выталкивают с платформы.
Компромиссы
Что теряется на edge и в Lambda для Go
Edge-рантаймы работают в V8-изолятах: ни CGO, ни нативных модулей, ни системных пакетов. Биндинги SQLite, библиотеки обработки изображений и криптопакеты, зависящие от C, там просто недоступны.
Рантайм Lambda для Go требует собрать main-бинарник со своей сигнатурой обработчика и bootstrap-прослойкой — это не та же карта события, что у Node.js и Python в том же API.
Как помогает Inquir
Lambda-совместимые Go-обработчики в изолированных контейнерах
Go-функции Inquir экспортируют Handler(event, context) — тот же контракт с картой события, что у Node.js и Python на платформе. Читайте HTTP-поля шлюза из event["body"], event["headers"] и event["queryStringParameters"]; возвращайте map или объект в стиле API Gateway. CGO-пакеты собираются при деплое, потому что функции работают в полноценных Docker-контейнерах.
Go-функции делят API-шлюз с функциями на Node.js и Python в том же воркспейсе. Одна таблица маршрутов, одна модель секретов, один стек наблюдаемости — независимо от языка.
Что вы получаете
Возможности Go 1.22 serverless-функций
Lambda-совместимый контракт обработчика
Экспортируйте Handler(event map, context map) (или obs.Context). Свой bootstrap-бинарник и обёртка net/http-сервера не нужны.
Вся экосистема Go-модулей
go.mod и go.sum поддерживаются. Пакеты с CGO вроде mattn/go-sqlite3 собираются при деплое в контейнерной сборке.
Конкурентность на горутинах
Горутины работают как положено: разветвляйте параллельные запросы, используйте каналы и родные примитивы конкурентности Go.
Мультиязычный воркспейс
Go-функции делят маршруты шлюза, секреты и наблюдаемость с функциями на Node.js и Python в том же воркспейсе.
Что дальше
Как задеплоить Go serverless-функции в Inquir
Написать точку входа Handler
Экспортируйте func Handler(event map[string]interface{}, ctx map[string]interface{}) (interface{}, error). Для JSON-POST со шлюза разбирайте строку event["body"].
Описать go.mod
Стандартный файл Go-модуля. Перечислите зависимости, при необходимости — включая CGO-пакеты.
Задеплоить и подключить маршрут
Inquir компилирует плагин, деплоит функцию и добавляет её в маршрутизацию шлюза рядом с функциями на других языках.
Пример кода
Go serverless-функция: обработчик JSON API
Lambda-совместимый паттерн. Разбирайте event["body"], когда шлюз присылает JSON-строку; для HTTP-маршрутов возвращайте statusCode + body. CGO-зависимости из go.mod собираются при деплое.
package main import ( "encoding/json" ) func parsePayload(event map[string]interface{}) map[string]interface{} { if s, ok := event["body"].(string); ok && s != "" { var out map[string]interface{} if err := json.Unmarshal([]byte(s), &out); err != nil || out == nil { return map[string]interface{}{} } return out } return event } func Handler(event map[string]interface{}, ctx map[string]interface{}) (interface{}, error) { payload := parsePayload(event) name, _ := payload["name"].(string) if name == "" { name = "World" } body, _ := json.Marshal(map[string]string{"message": "Hello, " + name}) return map[string]interface{}{ "statusCode": 200, "headers": map[string]interface{}{"Content-Type": "application/json"}, "body": string(body), }, nil }
Когда подходит
Когда брать Go serverless-функции
Когда это уместно
- Высоконагруженные JSON-обработчики, где важна экономная работа Go с памятью
- Функции, зависящие от CGO-пакетов (SQLite, обработка изображений, криптография)
- Команды, которые уже пишут сервисы на Go и хотят один язык по всему стеку
Когда лучше выбрать другое
- Тяжёлый ML и обработка данных — для этого лучше подходит Python с numpy/pandas
Частые вопросы
Частые вопросы
Работает ли CGO в Go-функциях Inquir?
Да. Функции работают в полноценных Docker-контейнерах с настоящим окружением сборки Linux — CGO-пакеты из go.mod собираются при деплое, в отличие от edge-рантаймов.
Это net/http или стиль Lambda?
Стиль Lambda: экспортируйте Handler(event, context) и читайте поля шлюза из карты события. Сервер на http.ListenAndServe писать не нужно — платформа вызывает Handler на каждый запрос.
Как холодный старт соотносится с Node.js?
Go-бинарники обычно стартуют быстрее Node.js на той же нагрузке. Для постоянного трафика используйте тёплые контейнеры независимо от языка — ради стабильной задержки p95.