invest-openapi
invest-openapi copied to clipboard
Streaming ограничение в 6 TCP соединений
Здравствуйте, не могу понять, как работает ограничение в 6 tcp соединений при работе через WebSocket. Периодически соединение обрывается с сообщением, что оно было принудительно разорвано удаленным хостом, но по какой причине? Как работает ограничение? Нельзя одновременно запускать 6 разных соединений, по одному токену, или не может быть больше 6 одновременных событий по подписке?
Здравствуйте! Имеется в виду, что одним клиентом (не важно с какого токена) не может быть открыто более 6 соединений. @NikitaMelnikov поправь меня, если неточно сказал
Что считается соединением? я формирую объект websocket, прописываю figi, на которые хочу подписаться и запускаю веб-сокет, сколько это будет соединений? одно или по количеству запущенных подписок? Затем по подписке ко мне приходят ответы, если допустим я подписался на 12 инструментов, на свечи и биржевой стакан, и мне одновременно прийдет ответ по 6 инструментам, это будет 6 соединений?
Соединением считается запущенный веб-сокет. Получается, вы можете запустить одновременно до 6 копий вашей программы, которая создаёт веб-сокет соединение. Сколько будет оформлено подписок и какого они типа совершенно не важно.
Большое спасибо, тогда мне совершенно неясно, почему может происходить разрыв соединения. Неужели у меня одного такая проблема. Соединение может держаться от 10 до часа, а потом выбрасывает
Нужно больше информации для опеределения проблемы. Каким клиентом пользуетесь? Шлет ли клиент ping? Отвечает ли сервер на него?
Разрыв происходит кратко временно, связь не обрывается на совсем, если пересоздать подключения, то все работает штатно. использую для подключения скрипт python 3, через объект websocket, дополнительных проверок на ping не использую.
Если вы используете настройки websocket по умолчанию, то рекомендую проверить, какое значение стоит у ping интервала. По опыту разработки java sdk выяснилось, что оптимальным является интервал в пределах 30 секунд.
Подтверждаю обрывы соединения со стороны сервера. Время может варьироваться от пары минут до нескольких часов. В среднем при открытых рынках обрыв происходит через 30-50 минут. Добавление пингов каждые 10-30 секунд ситуацию не поменяло. При закрытых рынках соединение продержалось более 400 минут, т.е. похоже что обрывы зависят от количества пересланных сообщений. При одновременном запуске двух идентичных процессов обрывы для них происходят в разное время, т.е. маловероятно что дело в плохом канале.
Вероятно нужно смотреть tcpdump со стороны клиента. У меня пока что не удалось воспроизвести ситуацию с нескольких хостов в разных локациях
Я вроде бы разобрался почему веб-сокет со стороны сервера может отключать соединение. Если в один момент времени происходит несколько изменений по свечам, то вебсокет формирует очередь вызовов процедуры на клиенте. Если клиент обрабатывает каждое сообщение достаточно долго, то очередь вызовов может накапливаться. Я так понимаю на сервере есть ограничение не длину такой очереди, и если очередь будет достаточно большой, то соединение отрубается.
@Karpik666 Все верно, примерно так это и работает. Клиент должен успевать вычитывать сообщения. Обрабатывать же их он может и асинхронно. 6 Соединений сделано для того чтобы масштабировать подписки например по figi и не упираться в очередь на сервере
И всё-таки странное происходит. Подписка на ~20 instrument_info. Т.е. нечего неуспевать обрабатывать. Проверено на двух вебсокет библиотеках. Интернет Linode и домашний.
Дисконнектит либо ваш сервер. Либо я сам реконнекчусь при отсутствии двух пингов подряд (10 секунд). (дополнительно: частая задержка одного пинга и данных в течение 5 секунд)
Дисконнектов огромное количество в трейдинг часы. Не считал даже. Но они присутствуют и в ночное время, и в утреннее, и в выходные.
А по крайней мере на домашнем инете наблюдаю ещё одно явление: дисконнект / отсутствие пинга каждый час, ровно в 19 минут.
И во всех случаях реконнект происходит не сразу, а через несколько, может быть десяток секунд. Тогда как в нормальном случае инишиал коннект моментальный.
Здравствуйте, не могу понять, как работает ограничение в 6 tcp соединений при работе через WebSocket. Периодически соединение обрывается с сообщением, что оно было принудительно разорвано удаленным хостом, но по какой причине? Как работает ограничение? Нельзя одновременно запускать 6 разных соединений, по одному токену, или не может быть больше 6 одновременных событий по подписке?
Здравствуйте! Вы не могли бы уделить мне пару минут и ответить на мои вопросы. Я не хочу засорять переписку и писать их тут, поэтому хотел бы задать их в личной переписке.
Если кто-то снимет tcpdump, то дело сдвинется :) Без него очень трудно сказать что происходит
Здравствуйте, не могу понять, как работает ограничение в 6 tcp соединений при работе через WebSocket. Периодически соединение обрывается с сообщением, что оно было принудительно разорвано удаленным хостом, но по какой причине? Как работает ограничение? Нельзя одновременно запускать 6 разных соединений, по одному токену, или не может быть больше 6 одновременных событий по подписке?
Здравствуйте! Вы не могли бы уделить мне пару минут и ответить на мои вопросы. Я не хочу засорять переписку и писать их тут, поэтому хотел бы задать их в личной переписке.
Пишите, отвечу по мере сил.