Рантайм Go · Inquir Compute

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.

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

1

Написать точку входа Handler

Экспортируйте func Handler(event map[string]interface{}, ctx map[string]interface{}) (interface{}, error). Для JSON-POST со шлюза разбирайте строку event["body"].

2

Описать go.mod

Стандартный файл Go-модуля. Перечислите зависимости, при необходимости — включая CGO-пакеты.

3

Задеплоить и подключить маршрут

Inquir компилирует плагин, деплоит функцию и добавляет её в маршрутизацию шлюза рядом с функциями на других языках.

Go serverless-функция: обработчик JSON API

Lambda-совместимый паттерн. Разбирайте event["body"], когда шлюз присылает JSON-строку; для HTTP-маршрутов возвращайте statusCode + body. CGO-зависимости из go.mod собираются при деплое.

handler.go
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.