Vestry

Распределённая система, работающая с Telegram: четыре backend-сервиса на Rust общаются через gRPC, а за протокольной границей идёт обработка, близкая к агентной.

Принадлежность
Заказная работа, сделанная вместе с партнёром и для него. Red Sentra сохраняет роль сопровождения. Партнёр и коммерческие условия остаются приватными.
Доступность
Приватный продукт. Исходный код приватный.
Стек
Rust / MTProto / gRPC / Protocol Buffers
Публичная витрина (откроется в новой вкладке)
Снимок публичного сайта-витрины Vestry.

Задача

Работа с Telegram на уровне протокола не прощает ошибок. Сессии имеют состояние, лимиты применяются по-настоящему, а клиент живёт долго. Всё, что относится к нему как к обычной интеграции запрос-ответ, быстро ломается трудно диагностируемым образом.

Система

Четыре backend-сервиса на Rust с разделённой ответственностью общаются через gRPC, а контрактом служат Protocol Buffers. Слой, смотрящий в MTProto, изолирован от остального, поэтому поведение протокола и его сбои не протекают в сервисы, делающие продуктовую работу.

Моя роль

Backend и системная инженерия: декомпозиция сервисов, gRPC-контракты между ними, граница интеграции с MTProto и поведение системы, когда одна часть лежит.

Самое сложное

Долгоживущие соединения с состоянием не укладываются в модель сервисов без состояния. Решение о том, где состоянию разрешено жить и как пережить перезапуск любого сервиса, сформировало большую часть архитектуры.

Архитектурные решения

  1. Изоляция протокола. Всё специфичное для MTProto стоит за одной границей, поэтому остальная система говорит в доменных терминах и тестируется без Telegram вообще.
  2. Контракты, начинающиеся со схемы. Protocol Buffers между сервисами делают ломающее изменение заметным при сборке, а не в три часа ночи.
  3. Четыре сервиса, а не один. Разделение шло по доменам отказов и нуждам масштабирования, а не по опрятности, поэтому шумные части можно перезапускать, не утягивая тихие.

Текущее состояние

В проде, Red Sentra продолжает его сопровождать.