fix(runtime): Go panic→500 (recover), Python exception→500+threading+backlog

- go1.23 v0.1.2: defer recover() в HTTP handler — panic no longer closes connection → HTTP 500
- python3.11 v0.1.5: try/except в do_GET/_handle_with_body/do_HEAD → 500 вместо EOF
- python3.11 v0.1.5: ThreadingHTTPServer — concurrent requests (был single-thread)
- python3.11 v0.1.6: _HighBacklogHTTPServer(request_queue_size=128) — listen(128) вместо listen(5)
- context.go: go1.23 v0.1.1→v0.1.2, python3.11 v0.1.4→v0.1.6
- operator: v0.1.45 → v0.1.47 (два деплоя подряд с новыми runtime-версиями)
- examples/POSTGRES: stress.tf (10 сервисов), full_test.sh (48 тестов, 4 фазы)
- examples/POSTGRES: README.md, очистка от старых файлов (luceUNDnode.tf, funcs_list.py)

Результат: full_test.sh 48/48 PASS
- Фаза 3 PG-стресс: 40/40 parallel writer OK, 30/30 js-async OK, pgstorm 14k ops 0 err
- Фаза 4 краш-шторм: 75/75 × HTTP 500 (паники не роняют платформу)
This commit is contained in:
Naeel
2026-03-21 08:42:03 +03:00
parent 0592f57fb6
commit 778cbc8b32
11 changed files with 814 additions and 271 deletions
+100
View File
@@ -0,0 +1,100 @@
# POSTGRES — Пример: Serverless-функции с Managed PostgreSQL
Демонстрирует интеграцию sless (serverless functions) с управляемым PostgreSQL (nubes_postgres).
## Что делает этот пример
1. **Создаёт Managed PostgreSQL** через Terraform (nubes_postgres + nubes_postgres_user + nubes_postgres_database)
2. **Инициализирует БД**: одноразовый `sless_job` создаёт таблицу `terraform_demo_table`
3. **Запускает 3 HTTP-сервиса**:
- `pg-info` (Node.js 20) — версия PostgreSQL-сервера + количество строк в таблице
- `pg-table-reader` (Python 3.11) — чтение всех строк из таблицы
- `pg-table-writer` (Python 3.11) — добавление новой строки
## Структура файлов
```
POSTGRES/
├── main.tf # terraform + провайдеры (sless, nubes_cloud)
├── postgres.tf # Managed PostgreSQL: DB, пользователь, locals с credentials
├── resources.tf # Namespace и сетевые ресурсы
├── functions.tf # sless_job (init) + 3 x sless_service
├── terraform.tfvars # Переменные: realm, s3_uid, token
├── stress_test.sh # Стресс-тест функций (не трогает PG lifecycle)
├── stress_destroy_apply.sh.disabled # ОТКЛЮЧЁН — стресс-тест PG lifecycle
├── code/
│ ├── sql-runner/ # Python: одноразовое выполнение SQL (CREATE TABLE)
│ ├── pg-info/ # Node.js: версия PG + строки
│ ├── table-rw/ # Python: list_rows + add_row
│ ├── pg-stats/ # Python: расширенная статистика PG
│ ├── funcs-list/ # Утилита: листинг функций
│ └── stress-*/ # Функции для стресс-тестирования
└── scripts/ # Вспомогательные скрипты
```
## Как запустить
### Предварительные требования
- Terraform >= 1.3
- Токен sless: `SLESS_TOKEN` (или в `terraform.tfvars`)
- Токен nubes_cloud: `NUBES_TOKEN`
- Доступ к realm (например, `ffd1f598c169b0ae`)
### Запуск
```bash
# 1. Инициализация
terraform init
# 2. Проверка плана
terraform plan
# 3. Применение (создаст PG + сервисы, запустит init job)
terraform apply
```
> Первый `apply` может занять 10–15 минут: создание PG-инстанса + kaniko-сборка образов.
### Переменные (`terraform.tfvars`)
```hcl
realm = "ffd1f598c169b0ae" # Реалм (namespace в sless)
s3_uid = "s01234" # S3 bucket для nubes_postgres бэкапов
sless_token = "..." # Bearer-токен для sless API
nubes_token = "..." # Bearer-токен для nubes_cloud API
```
### Вывод после apply
```
Outputs:
table_reader_url = "https://sless.kube5s.ru/v1/namespaces/.../services/pg-table-reader/invoke"
table_writer_url = "https://sless.kube5s.ru/v1/namespaces/.../services/pg-table-writer/invoke"
```
### Вызов функций
```bash
# Информация о PG (Node.js)
curl https://.../services/pg-info/invoke
# Список строк таблицы (Python)
curl https://.../services/pg-table-reader/invoke
# Добавить строку (Python)
curl -X POST https://.../services/pg-table-writer/invoke \
-H "Content-Type: application/json" \
-d '{"title": "Hello from sless!"}'
```
## Стресс-тест
`stress_test.sh` — нагружает функции HTTP-запросами. Запускать после `terraform apply`:
```bash
./stress_test.sh
```
> `stress_destroy_apply.sh.disabled` — ранний тест PG lifecycle (destroy+apply цикл).
> **Отключён** из-за проблем с удалением postgres_user в определённых сценариях.