Недавно стало интересно, а что если для передачи данных между javascript-частью web-приложения и backend-ом использовать пулл websocket-соединений, например, возможно, это будет интересным вариантом увеличения производительности какого-то очень толстого javascript-браузерного-приложения (например, игрушки типа Warcraft 3 прямо в браузере, где куча юнитов что-то постоянно делает и с чем-то взаимодействует).
Для полноты неординарности решения, было интересно использовать web-воркер, как посредника между пулом вебсокетов и основной частью приложения. Как оказалось (issue, спасибо, @_prefer), так можно делать далеко не везде, например, Firefox вообще не позволяет использовать web-сокеты из web-воркеров. Чтож, зато так можно делать по крайней мере в Google Chrome. Приступим.
1. Транспорт на web-воркере и пуле web-сокетов.
<script id="worker" type="text/js-worker"> var createSocket = function(){ var ws = new WebSocket('wss://echo.websocket.org'); ws.onmessage = function(e) { this.postMessage(e.data); }.bind(this); return ws; }.bind(this); var requestsPool = []; var socketsPool = [ createSocket(), createSocket(), createSocket() ]; this.onmessage = function (e) { requestsPool.push(e.data); }; this.setInterval(function(){ var ws = socketsPool[Math.floor(Math.random() * socketsPool.length)]; if (requestsPool.length && ws.readyState == 1) { ws.send(requestsPool.pop()); } }, 0); </script>
2. Использование транспорта.
var workerBlob = new Blob( [document.querySelector('#worker').textContent], {type: "text/javascript"} ), worker = new Worker(window.URL.createObjectURL(workerBlob)); var messagesPerSecond = 0; window.setInterval(function(){ console.log('Messages per second: ', messagesPerSecond); messagesPerSecond = 0; }, 1000); worker.onmessage = function (e) { messagesPerSecond++; }; window.setInterval(function(){ worker.postMessage('hello-' + Math.random()); }, 0);
Вот примеры этого велосипеда на jsfiddle: медленно и очень быстро.