2017-03-13 19 views
-3

저는 Node and Go에서 WebSockets 및 HTTP/2 라이브러리를 실험했습니다. 기본 설정은 클라이언트와 서버를 만들고 서버에서 파일을 반복적으로 보내고 클라이언트에서 각 파일을 사용할 수있을 때까지의 시간을 측정하는 것입니다.WebSocket 구현이 HTTP/2보다 느린 이유는 무엇입니까? 여러 파일을 전송할 때 밀어 넣기가 필요합니까? (Node.js/Go)

놀랍게도 HTTP/2 Push 구현은 WebSocket보다 훨씬 뛰어납니다 (총 시간이 5 배 이상 빨라짐). 내가 뭔가 잘못하고 있는거야?

Gorilla WebSocketnode-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); 
    } 
}); 
+2

HTTP/2 푸시 또는 클라이언트 측 구현이 아닌 웹 소켓 서버 만 관련 코드의 3 분의 1 만 표시하고 붙여 넣지 않은 결과에 대해 묻습니다 (요약했지만 ...). 우리는 어떻게 이것에 반응 할 것으로 예상됩니까? – Myst

+0

또 다른 참고 사항 : HTTP/2 푸시는 브라우저에서 HTTP 캐싱의 장점과 모든 요청 (새로운 연결이 열리지 않음)에서 영구적 인 TCP/IP 연결이라는 이점뿐만 아니라 새로운 Web 소켓 연결 페이지를 새로 고칠 때마다 열립니다. 귀하의 요구 사항은 무엇인지 모르겠지만 HTTP/2에 약간의 편향이있을 수 있습니다 (이 속도는 처음 클라이언트/연결시 정확하지 않습니다). – Myst

답변

0

https://github.com/gorilla/websocket/issues/228를 참조하십시오. OP는 스트림을 통해 모든 데이터를 전송할 시간이 아니라 HTTP/2 푸시로 스트림을 여는 시간을 측정했습니다. OP는 웹 소켓이 HTTP/2 푸시보다 빠르다는 사실을 발견했습니다.