invest-openapi icon indicating copy to clipboard operation
invest-openapi copied to clipboard

Streaming ограничение в 6 TCP соединений

Open andrei-karpov opened this issue 4 years ago • 15 comments

Здравствуйте, не могу понять, как работает ограничение в 6 tcp соединений при работе через WebSocket. Периодически соединение обрывается с сообщением, что оно было принудительно разорвано удаленным хостом, но по какой причине? Как работает ограничение? Нельзя одновременно запускать 6 разных соединений, по одному токену, или не может быть больше 6 одновременных событий по подписке?

andrei-karpov avatar Feb 26 '20 14:02 andrei-karpov

Здравствуйте! Имеется в виду, что одним клиентом (не важно с какого токена) не может быть открыто более 6 соединений. @NikitaMelnikov поправь меня, если неточно сказал

zlumyo avatar Feb 26 '20 18:02 zlumyo

Что считается соединением? я формирую объект websocket, прописываю figi, на которые хочу подписаться и запускаю веб-сокет, сколько это будет соединений? одно или по количеству запущенных подписок? Затем по подписке ко мне приходят ответы, если допустим я подписался на 12 инструментов, на свечи и биржевой стакан, и мне одновременно прийдет ответ по 6 инструментам, это будет 6 соединений?

andrei-karpov avatar Feb 26 '20 21:02 andrei-karpov

Соединением считается запущенный веб-сокет. Получается, вы можете запустить одновременно до 6 копий вашей программы, которая создаёт веб-сокет соединение. Сколько будет оформлено подписок и какого они типа совершенно не важно.

zlumyo avatar Feb 27 '20 06:02 zlumyo

Большое спасибо, тогда мне совершенно неясно, почему может происходить разрыв соединения. Неужели у меня одного такая проблема. Соединение может держаться от 10 до часа, а потом выбрасывает

andrei-karpov avatar Feb 27 '20 10:02 andrei-karpov

Нужно больше информации для опеределения проблемы. Каким клиентом пользуетесь? Шлет ли клиент ping? Отвечает ли сервер на него?

NikitaMelnikov avatar Feb 28 '20 05:02 NikitaMelnikov

Разрыв происходит кратко временно, связь не обрывается на совсем, если пересоздать подключения, то все работает штатно. использую для подключения скрипт python 3, через объект websocket, дополнительных проверок на ping не использую.

andrei-karpov avatar Feb 28 '20 08:02 andrei-karpov

Если вы используете настройки websocket по умолчанию, то рекомендую проверить, какое значение стоит у ping интервала. По опыту разработки java sdk выяснилось, что оптимальным является интервал в пределах 30 секунд.

zlumyo avatar Feb 28 '20 14:02 zlumyo

Подтверждаю обрывы соединения со стороны сервера. Время может варьироваться от пары минут до нескольких часов. В среднем при открытых рынках обрыв происходит через 30-50 минут. Добавление пингов каждые 10-30 секунд ситуацию не поменяло. При закрытых рынках соединение продержалось более 400 минут, т.е. похоже что обрывы зависят от количества пересланных сообщений. При одновременном запуске двух идентичных процессов обрывы для них происходят в разное время, т.е. маловероятно что дело в плохом канале.

newpavlov avatar Mar 06 '20 19:03 newpavlov

Вероятно нужно смотреть tcpdump со стороны клиента. У меня пока что не удалось воспроизвести ситуацию с нескольких хостов в разных локациях

NikitaMelnikov avatar Mar 13 '20 07:03 NikitaMelnikov

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

andrei-karpov avatar Mar 16 '20 13:03 andrei-karpov

@Karpik666 Все верно, примерно так это и работает. Клиент должен успевать вычитывать сообщения. Обрабатывать же их он может и асинхронно. 6 Соединений сделано для того чтобы масштабировать подписки например по figi и не упираться в очередь на сервере

necryin avatar Mar 16 '20 16:03 necryin

И всё-таки странное происходит. Подписка на ~20 instrument_info. Т.е. нечего неуспевать обрабатывать. Проверено на двух вебсокет библиотеках. Интернет Linode и домашний.

Дисконнектит либо ваш сервер. Либо я сам реконнекчусь при отсутствии двух пингов подряд (10 секунд). (дополнительно: частая задержка одного пинга и данных в течение 5 секунд)

Дисконнектов огромное количество в трейдинг часы. Не считал даже. Но они присутствуют и в ночное время, и в утреннее, и в выходные.

А по крайней мере на домашнем инете наблюдаю ещё одно явление: дисконнект / отсутствие пинга каждый час, ровно в 19 минут.

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

lolpoi avatar Apr 13 '20 11:04 lolpoi

Здравствуйте, не могу понять, как работает ограничение в 6 tcp соединений при работе через WebSocket. Периодически соединение обрывается с сообщением, что оно было принудительно разорвано удаленным хостом, но по какой причине? Как работает ограничение? Нельзя одновременно запускать 6 разных соединений, по одному токену, или не может быть больше 6 одновременных событий по подписке?

Здравствуйте! Вы не могли бы уделить мне пару минут и ответить на мои вопросы. Я не хочу засорять переписку и писать их тут, поэтому хотел бы задать их в личной переписке.

romanstage avatar Aug 14 '20 16:08 romanstage

Если кто-то снимет tcpdump, то дело сдвинется :) Без него очень трудно сказать что происходит

NikitaMelnikov avatar Aug 18 '20 05:08 NikitaMelnikov

Здравствуйте, не могу понять, как работает ограничение в 6 tcp соединений при работе через WebSocket. Периодически соединение обрывается с сообщением, что оно было принудительно разорвано удаленным хостом, но по какой причине? Как работает ограничение? Нельзя одновременно запускать 6 разных соединений, по одному токену, или не может быть больше 6 одновременных событий по подписке?

Здравствуйте! Вы не могли бы уделить мне пару минут и ответить на мои вопросы. Я не хочу засорять переписку и писать их тут, поэтому хотел бы задать их в личной переписке.

Пишите, отвечу по мере сил.

andrei-karpov avatar Aug 30 '20 21:08 andrei-karpov