Наблюдение
Подписка (subscribe) живёт на конкретном соединении: rippled помнит её ровно до разрыва WebSocket. После переподключения новое соединение о прежних подписках не знает.
SDK переподключается сам (RestartReconnectLoop, событие OnConnected — Xrpl/Client/connection.cs:1847), но поиском по репозиторию слов resubscribe / Resubscribe ничего не находится: восстановления подписок после OnConnected в коде нет.
Почему это проблема
Отказ получается молчаливым. После переподключения клиент считает себя подключённым и работоспособным: обычные запросы проходят, Connected истинно, ошибок нет. Просто перестают приходить сообщения потока.
Для подписчика это худший вид отказа — он неотличим от «в сети ничего не происходит». Любой потребитель, строящий состояние по потоку, будет тихо расходиться с реальностью, пока кто-нибудь не сверит результат с леджером напрямую.
Отдельно стоит учесть, что переподключение может произойти на другой сервер (фейловер по списку эндпоинтов) — тогда подписка теряется тем более гарантированно.
Ожидаемое
Молчаливой потери потока быть не должно. Приемлемы два решения, выбор за реализацией:
- SDK помнит активные подписки и восстанавливает их после успешного переподключения. Удобнее для потребителя, но требует хранить состояние подписок и решать, что делать при частичном отказе восстановления.
- SDK не восстанавливает, но гарантированно сигнализирует о том, что поток прерван и требуется переподписка. Проще, но перекладывает работу на потребителя — тогда сигнал обязан быть явным и задокументированным, а не выводимым из
OnDisconnect.
Второй вариант допустим. Недопустимо только текущее поведение, при котором потребитель узнаёт о проблеме по отсутствию данных.
Проверка
Тест с принудительным разрывом соединения: после восстановления поток либо продолжается, либо подписчик получил явный сигнал.
Наблюдение
Подписка (
subscribe) живёт на конкретном соединении: rippled помнит её ровно до разрыва WebSocket. После переподключения новое соединение о прежних подписках не знает.SDK переподключается сам (
RestartReconnectLoop, событиеOnConnected—Xrpl/Client/connection.cs:1847), но поиском по репозиторию словresubscribe/Resubscribeничего не находится: восстановления подписок послеOnConnectedв коде нет.Почему это проблема
Отказ получается молчаливым. После переподключения клиент считает себя подключённым и работоспособным: обычные запросы проходят,
Connectedистинно, ошибок нет. Просто перестают приходить сообщения потока.Для подписчика это худший вид отказа — он неотличим от «в сети ничего не происходит». Любой потребитель, строящий состояние по потоку, будет тихо расходиться с реальностью, пока кто-нибудь не сверит результат с леджером напрямую.
Отдельно стоит учесть, что переподключение может произойти на другой сервер (фейловер по списку эндпоинтов) — тогда подписка теряется тем более гарантированно.
Ожидаемое
Молчаливой потери потока быть не должно. Приемлемы два решения, выбор за реализацией:
OnDisconnect.Второй вариант допустим. Недопустимо только текущее поведение, при котором потребитель узнаёт о проблеме по отсутствию данных.
Проверка
Тест с принудительным разрывом соединения: после восстановления поток либо продолжается, либо подписчик получил явный сигнал.