ZionVox: мессенджер для нестабильной сети

В ZionVox я начинаю архитектуру доставки не с выбора WebSocket, а с вопроса: что произойдёт, если Core жив, но маршрут клиента до него заблокирован?

Добавить retry недостаточно: повторный запрос не создаёт новый путь. Сделать всё P2P — тоже не готовый ответ: остаются членство в чатах, офлайн-доставка и согласование истории нескольких устройств.

Поэтому базовая схема server-first, а устойчивость транспорта и устойчивость данных разделены.

До отправки у логического сообщения есть clientMessageId. Серверный id появится позже. Локальный tempId относится к записи исходящей очереди. При смене транспорта логическая идентичность не должна меняться: иначе потерянный ACK превращается во второе сообщение.

Локальное хранение — тоже не один кэш. В IndexedDB отдельно живут outbox, relay_queue, ratchet_states, история и discovery-подсказки. Очередь отвечает за отправку, криптографическое состояние — за сессию, кэш истории — за локальный рабочий набор. Полную серверную базу на устройство я не переношу.

Разбор outbox идёт последовательно под блокировкой между вкладками. Это ограничивает параллелизм, зато не позволяет двум вкладкам независимо разбирать один список. Подтверждение серверной записи, доставка адресату и прочтение — отдельные события, не один статус.

Сеть описывается машиной состояний NORMAL, DEGRADED и BYPASS. Она учитывает окна проб и задержку переключения. 403/451, критичные 5xx и 404 необязательного endpoint имеют разный смысл. Один случайный ответ не должен бесконечно переключать маршруты туда и обратно.

Резервный узел не получает доверие только потому, что доступен. Подписанные подсказки проверяются отдельно; у кэша ограничен срок жизни. Мост ведёт к живому Core, а не становится новым владельцем аккаунтов.

Что взять себе: сначала определить идентичность операции, границы локального хранения и merge после восстановления связи. Только потом добавлять следующий транспорт. Без этих правил резервирование увеличивает число состояний, но не обязательно надёжность.

В полной статье — последовательность доставки, конверт сообщения и разбор отказов. Я проектирую такие системы и для клиентских продуктов.

https://arhellist.ru/blog/zionvox-messendzher-dlya-nestabilnoy-seti/

ZionVox: мессенджер для нестабильной сети | Сетка — социальная сеть от hh.ru