Skip to content

Подписка не восстанавливается после переподключения — поток молча прекращается #104

Description

@Platonenkov

Наблюдение

Подписка (subscribe) живёт на конкретном соединении: rippled помнит её ровно до разрыва WebSocket. После переподключения новое соединение о прежних подписках не знает.

SDK переподключается сам (RestartReconnectLoop, событие OnConnectedXrpl/Client/connection.cs:1847), но поиском по репозиторию слов resubscribe / Resubscribe ничего не находится: восстановления подписок после OnConnected в коде нет.

Почему это проблема

Отказ получается молчаливым. После переподключения клиент считает себя подключённым и работоспособным: обычные запросы проходят, Connected истинно, ошибок нет. Просто перестают приходить сообщения потока.

Для подписчика это худший вид отказа — он неотличим от «в сети ничего не происходит». Любой потребитель, строящий состояние по потоку, будет тихо расходиться с реальностью, пока кто-нибудь не сверит результат с леджером напрямую.

Отдельно стоит учесть, что переподключение может произойти на другой сервер (фейловер по списку эндпоинтов) — тогда подписка теряется тем более гарантированно.

Ожидаемое

Молчаливой потери потока быть не должно. Приемлемы два решения, выбор за реализацией:

  1. SDK помнит активные подписки и восстанавливает их после успешного переподключения. Удобнее для потребителя, но требует хранить состояние подписок и решать, что делать при частичном отказе восстановления.
  2. SDK не восстанавливает, но гарантированно сигнализирует о том, что поток прерван и требуется переподписка. Проще, но перекладывает работу на потребителя — тогда сигнал обязан быть явным и задокументированным, а не выводимым из OnDisconnect.

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

Проверка

Тест с принудительным разрывом соединения: после восстановления поток либо продолжается, либо подписчик получил явный сигнал.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions