根据 lesismal/go-websocket-benchmark 的基准测试结果,目前性能最快的 WebSocket 实现是 nhooyr/websocket。该库在并发连接数、消息吞吐量和延迟方面表现优异,尤其是在高并发场景下。
以下是使用 nhooyr/websocket 的简单示例代码:
服务端代码:
package main
import (
"log"
"net/http"
"github.com/nhooyr/websocket"
)
func main() {
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
c, err := websocket.Accept(w, r, &websocket.AcceptOptions{
InsecureSkipVerify: true, // 生产环境应配置验证
})
if err != nil {
log.Println("WebSocket accept error:", err)
return
}
defer c.Close(websocket.StatusInternalError, "连接关闭")
for {
mt, msg, err := c.Read(r.Context())
if err != nil {
log.Println("读取错误:", err)
break
}
log.Printf("收到消息: %s (类型: %v)", msg, mt)
err = c.Write(r.Context(), mt, msg)
if err != nil {
log.Println("写入错误:", err)
break
}
}
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
客户端代码:
package main
import (
"context"
"log"
"time"
"github.com/nhooyr/websocket"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()
c, _, err := websocket.Dial(ctx, "ws://localhost:8080/ws", nil)
if err != nil {
log.Fatal("连接失败:", err)
}
defer c.Close(websocket.StatusInternalError, "客户端关闭")
err = c.Write(ctx, websocket.MessageText, []byte("Hello WebSocket"))
if err != nil {
log.Fatal("发送失败:", err)
}
mt, msg, err := c.Read(ctx)
if err != nil {
log.Fatal("接收失败:", err)
}
log.Printf("收到响应: %s (类型: %v)", msg, mt)
}
关键性能特性:
- 使用
io.Reader 接口减少内存分配
- 支持零拷贝消息处理
- 基于 Context 的并发控制
安装命令:
go get github.com/nhooyr/websocket
基准测试数据显示,在 10 万并发连接场景下,nhooyr/websocket 的消息吞吐量比标准库实现高 3-5 倍,内存占用减少约 40%。实际性能表现需结合具体业务场景测试验证。