Ответ 1
У вас правильный дизайн, но проблема, с которой вы сталкиваетесь, связана с "липкостью" сеанса. Однако вместо того, чтобы повторно перенаправить последующие запросы обратно на соответствующий компьютер, мы должны искать способ избежать запроса "pre".
Лучший способ сделать это - сделать ваше изображение докеры Chrome "посередине" всеми запросами "обновления" HTTP. Это действие http - это то, что все соединения WebSocket испускают до изменения протоколов, включая библиотеку кукловодов (которая является просто клиентом WebSocket под капотом). Это также устранит необходимость в вызове с предварительным подключением, поскольку проксирование в Chrome произойдет при обновлении, а не для показа URL-адреса для приложения. Вот довольно простой пример этого с http-proxy- модулем:
const http = require('http');
const httpProxy = require('http-proxy');
const proxy = new httpProxy.createProxyServer();
http
.createServer()
.on('upgrade', async(req, socket, head) => {
const browser = await puppeteer.launch();
const target = browser.wsEndpoint();
proxyy.ws(req, socket, head, { target })
})
.listen(3000);
Существуют и другие преимущества такого подхода: вы можете ограничить такие вещи, как параллелизм, и даже запустить сценарии, которые будут запущены позднее. Те требуют немного больше и подготовки, но общая идея остается прежней. Это также делает балансировку нагрузки тривиальной, поскольку нет необходимости делать маршрутизацию липкой.
Если это то, что вы заинтересованы в реализации всех этих работ, в основном делается для вас в режиме без браузера. Он даже позволяет такие вещи, как ограничения параллелизма, ограничения времени сеанса и включает многофункциональную среду IDE. Здесь вы можете найти больше документов по этому проекту.