Наш проект состоит из набора микросервисов nodejs, взаимодействующих через socket.io. Некоторые из этих микросервисов работают за балансировщиком нагрузки amazon ALB. Единственная доступная привязка сеанса, доступная для целевых групп ALB, основана на файлах cookie, а соединения распределяются с использованием алгоритма циклического перебора, когда файл cookie сеанса не указан в HTTP-запросе.
Это эффективно нарушает протокол рукопожатия, возникающий при установке соединения socket.io, что приводит к ужасному ответу xhr poll error 400.
Обходной путь состоит в том, чтобы полностью отключить опрос xhr в клиенте и полагаться только на фактический веб-сокет. Это идеально в контролируемой среде, но не работает, когда некоторые сервисы разрабатываются и размещаются третьими сторонами.
Также существует другой хак, который состоит в переопределении базового вызова функции require('http').request и выдаче предварительного запроса для получения этих файлов cookie сеанса. Дальнейшие HTTP-запросы будут повторно вставлять файлы cookie в запрос. В лучшем случае я называю это взломом.
См. липкие сеансы ALB
Еще один запрос на ту же функцию #775
Есть новости по этому поводу?
кто-нибудь когда-нибудь решить это?
@AndyGOBrien Один из обходных путей — сначала получить файлы cookie с сервера, а затем открыть сокетное соединение, указав параметр extraHeaders.Cookie
следующим образом:
const socket = io(url, {
extraHeaders: {
Cookie: cookiesString
}
})
Документы: https://github.com/socketio/engine.io-client#nodejs -with-extraheaders
@turpault во время рукопожатия установлен файл cookie io
: https://github.com/socketio/engine.io#methods -1
Да, я заставил это работать. Спасибо, парни
@AndyGOBrien ты делал это в браузере или в узле? я могу заставить его работать в узле, но в браузере я не могу установить заголовок cookie
socket.io-client-v2.1.1 в настоящее время опция extraHeaders.Cookie
работает только на NodeJS
в Webpack 3.11.0 /Mac 10.13.6/Google Chrome 67.0.3396.87
@AndyGOBrien Один из обходных путей — сначала получить файлы cookie с сервера, а затем открыть сокетное соединение, указав параметр
extraHeaders.Cookie
следующим образом:const socket = io(url, { extraHeaders: { Cookie: cookiesString } })
Документы: https://github.com/socketio/engine.io-client#nodejs -with-extraheaders
Любой рабочий пример? Спасибо
Предупреждение. Приведенное выше решение не обрабатывает тайм-аут AWSALB. Если сокет попытается переподключиться после тайм-аута прилипания (т.е. 24 часов), он выдаст transport error
.
socket.io-client-v2.1.1 в настоящее время опция
extraHeaders.Cookie
работает только на NodeJSв Webpack 3.11.0 /Mac 10.13.6/Google Chrome 67.0.3396.87
У меня такая же проблема. повезло, что он уже исправлен?
@Seldonm @gabmontes @59naga повезло, что кто-нибудь когда-нибудь успешно справился с ExtraHeaders?
Я вообще не умею.
Есть новости по этому поводу? Существуют балансировщики нагрузки, которые работают только с липкой сессией Cookie, например Traefik...
Самый полезный комментарий
@AndyGOBrien Один из обходных путей — сначала получить файлы cookie с сервера, а затем открыть сокетное соединение, указав параметр
extraHeaders.Cookie
следующим образом:Документы: https://github.com/socketio/engine.io-client#nodejs -with-extraheaders