Tinkoff / invest-openapi-go-sdk

Apache License 2.0
153 stars 30 forks source link

[streaming] Ping-pong от клиента к серверу #57

Closed AlmazDelDiablo closed 2 years ago

AlmazDelDiablo commented 2 years ago

Проблема

Если у работающего робота отключить интернет, он об этом не узнает, т.к. клиент не пытается пинговать сервер.

Решение

Добавлена периодическая отправка ping-пакета на сервер с ожиданием pong-ответа. Для конфигурации таймингов, добавлен новый конструктор Streaming Client. При отсутствии pong-а в указанный таймаут, клиентский код получает error и может реализовать собственную логику переподключения к сокету и переподписки на интересующие события.

Сохранена обратная совместимость. Использование ping-pong включается фича-флагом в новом конструкторе. По умолчанию, это поведение отключено.

Отчёт о тестировании

Подключил версию из текущего PR к своему роботу, написал в нём переподключение. Прикладываю логи того, что происходит при отключении и восстановлении интернета:


 % go run main.go
> Running the application daemon...
> Running the streaming API goroutine...
> Runned!
> Successfully connected! Running a read loop...
...
> Error while streaming read received: can't read message: read tcp ***.***.***.***:*****->178.248.239.55:443: i/o timeout. Reconnect...
> Trying to connect to Tinkoff...
> Failed to estabilish a streaming connection with Tinkoff. Retry #0 (delay: 10000 ms).
> Trying to connect to Tinkoff...
> Successfully connected! Running a read loop...