Почему реализация WebSocket медленнее, чем HTTP/2 Push, при передаче нескольких файлов? (Node.js / Go)

Я экспериментировал с библиотеками WebSockets и HTTP/2 в Node and Go. Моя основная настройка заключается в создании клиента и сервера, повторной отправке файла с сервера и измерении времени, пока каждый файл будет доступен на клиенте.

К моему удивлению, реализация HTTP/2 Push работает значительно лучше, чем WebSocket (более чем в 5 раз быстрее в общем времени). Я делаю что-то неправильно?

Мои серверы Gorilla WebSocket и node-ws приведены ниже:

Идти

package main

import (
  "net/http"
  "io/ioutil"
  "log"
  "github.com/gorilla/websocket"
)

var file []byte

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }

    for i := 0; i < 100; i++ {
      conn.WriteMessage(2, file)
    }
}

func main() {
  file, _ = ioutil.ReadFile("<path-to-file>")

  http.HandleFunc("/", handler)
  err := http.ListenAndServeTLS(":443", "<path-to-cert>", "<path-to-key>", nil)
  if err != nil {
    panic("ListenAndServe: " + err.Error())
  }
}

Узел

const WebSocket = require('ws');
const https = require('https');
const fs = require('fs');

const options = {
  key: fs.readFileSync('<path-to-key>'),
  cert: fs.readFileSync('<path-to-cert>')
};

var file = fs.readFileSync('<path-to-file>')

var httpServer = new https.createServer(options).listen(443);

var wss = new WebSocket.Server({
  server: httpServer,
  perMessageDeflate: false
});

wss.on('connection', function(ws) {
  for (let i = 0; i < repetition; i++) {
    ws.send(file);
  }
});

1 ответ

См. https://github.com/gorilla/websocket/issues/228. Оператор измерял время открытия потоков с помощью HTTP/2 Push, а не время для передачи всех данных через потоки. ОП обнаружил, что веб-сокеты работают быстрее, чем HTTP/2 push.

Другие вопросы по тегам