Files
SQS-service/doc/thinking/architecture-analysis-2026-10-08.md
T
Repinoid 39b162439f doc: архитектурный анализ — публичный SQS, обход через ВМ, модульный монолит (data-plane/control-plane)
- SQS должен быть публичным (как AWS SQS/YMQ) -> внешний доступ обязателен;
- стратегия сети: сейчас публичная точка на ВМ (обход managed-шлюза), позже —
  девопсам чинить шлюз с доказательствами;
- 'без монолитов' уточнено: модульный монолит, критерии разбиения, data-plane vs
  control-plane, billing/metrics/UI — модули;
- ограничение: in-memory stateful-ядро = одиночка, вынос хранилища важнее;
- IoT: внешний MQTT-канал неизбежен, крупные тела мимо шлюза;
- открытые вопросы.
2026-10-08 17:09:21 +03:00

6.2 KiB
Raw Blame History

Архитектурный анализ размещения и разбиения shared-sqs (2026-10-08)

Роль: архитектор. Статус: решения согласованы с владельцем, записаны для исполнения.


1. Исходные требования (согласовано)

  1. SQS должен быть полноценным публичным сервисом — как AWS SQS и Yandex YMQ. Клиенты ходят к нему снаружи по HTTPS через AWS SDK. Внешний доступ — обязателен, а не опция.
  2. Без монолитов — но с уточнением (раздел 3): не «микросервисы ради микросервисов», а «разные процессы там, где разные требования».
  3. Девопсов не дёргать сейчас — у них и так заботы.

2. Сетевая стратегия (две беды платформы, обход)

См. nubes-large-body-workaround-findings-2026-10-08.md и nubes-workaround-applicability-to-sqs-2026-10-08.md.

Две независимые беды managed-шлюза:

  • A. Большие пакеты/тела не проходят (MSS 1448 при underlay 1450, PMTUD мёртв) — ~51 с;
  • B. Таймауты/RST на ЛЮБЫХ телах из-за таймеров шлюза (период 31–33 с; keep-alive 10 в drhider).

Обе — на стороне платформы, тикет не решает (доказано опытом drhider).

Принятая стратегия:

  1. Сейчас — публичная точка входа на ВМ (наш nginx, TLS, MTU, keep-alive), минуя managed-шлюз. Полный контроль, девопсы не нужны.
  2. Когда сервис отлажен и появились реальные клиенты — к девопсам с накопленными доказательствами (tcpdump, период 31–33 с, MSS 1448, опыт drhider), просить чинить managed-шлюз уже предметно.

Уточнение про «в кубере та же хуйня»: она есть только на пути через managed ingress извне. Внутри кластера сеть чистая (6–8 мс, без таймаутов).

3. Разбиение: «модульный монолит», а не микросервисы

Вывод обсуждения: монолит плох там, где смешивает разное; микросервисы — плата (сеть, распределённые транзакции, оркестрация, дебаг), которая для стадии «никто не использует, один человек» преждевременна.

Критерии, по которым решаем, выносить ли в отдельный процесс:

  1. разный профиль нагрузки/масштабирования;
  2. разный жизненный цикл / частота релизов;
  3. stateful vs stateless.

Целевое разбиение SQS:

Компонент Отдельный процесс? Обоснование
SQS data-plane (очереди, сообщения, SigV4) да горячий путь, stateful, свой профиль
control-plane (тенанты, креды, очереди, админ) да редкие операции, другой жизненный цикл и периметр
биллинг модуль внутри выносить = сеть ради одной горутины, пишущей в PG
метрики (Prometheus) модуль внутри это эндпоинт, не сервис
UI статика не сервис

4. Ограничение, которое разбиение НЕ снимает

Ядро SQS держит очередь в памяти одного пода (globals.go SyncQueues, redis.go LoadAllQueues). «Не монолит» ≠ «масштабируется»: пока хранилище не вынесено наружу (чтение тоже из Redis, либо иной сторедж, либо шардирование), data-plane всё равно одиночка. Это отдельный, более важный вопрос — решать до набора тенантов.

5. Размещение IoT (для полноты картины)

  • К IoT внешний доступ нужен по определению (устройства). Managed-шлюз в цепочке IoT неизбежен.
  • Но: телеметрия — мелкие MQTT-сообщения, для них критичен только разрыв wss ~150 с (лечится переподключением — уже реализовано в IoT).
  • Большие payload'ы от устройств через MQTT-шлюз не пускать: лимит размера, дробление на уровне протокола, либо приём крупных данных на ВМ с вытягиванием кластером (схема drhider).
  • IoT переделывается с нуля — не монолитом: bridge (MQTT), consumer (→storage), API отдельными сервисами.

6. Открытые вопросы (ждут решений)

  1. Домен и сертификат для публичной точки SQS на ВМ.
  2. Есть ли клиенты без явного endpoint_url (влияет на внешние QueueUrl).
  3. Вынос хранилища data-plane (главный стратегический вопрос) — когда начинаем.
  4. Крупные тела у IoT-устройств нужны или только мелкая телеметрия.

7. Следующий шаг

Подготовить развёртывание SQS на ВМ: разбиение на data-plane и control-plane, nginx с правильным MTU/keep-alive/TLS, внешние QueueUrl. Старт — по команде владельца.