Go 为什么有这么多 Websocket 库...

2025 年 2 月 17 日
 cj323

感觉 Go 圈造 WS 库的积极程度有种 JS 圈造前端框架的劲头

github.com/gorilla/websocket

github.com/gobwas/ws

github.com/coder/websocket

github.com/olahol/melody

github.com/lxzan/gws

github.com/lesismal/nbio

...

这有必要这么多轮子吗?还是每个都解决了什么特殊问题。

一直觉得 Go 标准库很强大,为什么却不好好维护一个 WS 啊?

7940 次点击
所在节点    Go 编程语言
37 条回复
musi
2025 年 2 月 17 日
这么多轮子最少的 star 还有 1.5k ,不太理解。。。
freemoon
2025 年 2 月 17 日
造轮子跟开发者个人想法有关,跟整个生态关系不大。有的人觉得现有的不好用,有的人觉得现有的性能不足,有的人想锻炼自己。。etc
ninjashixuan
2025 年 2 月 17 日
还行吧,ws 不是很大的 framework ,甚至可以说是 lib 库,常用的多几个选择不好么。
march1993
2025 年 2 月 17 日
因为用 golang 实现 websocket 协议比较容易,同时应用需求又很旺盛,所以同时有很多实现。
lysShub
2025 年 2 月 17 日
因为简单,和 json 库一样。

难点的、像用户态网络栈就 gvisor 可用
lesismal
2025 年 2 月 17 日
按照协议分层来讲,其他是实现 websocket 协议,melody 是基于 gorilla 之上的对 websocket 的封装,使用上方便些。

按照为了解决的问题分类,gobwas/ws 和 nbio 是为了海量连接数的场景,为了解决标准库方案在高承载量场景下的内存 OOM 和 GC STW 问题、节约更多硬件成本、让服务更稳定。
但 gobwas/ws 本身的设计和实现是存在缺陷的,因为它的 IO 接口仍然是阻塞的,所以 IO 循环中如果有 1 个或多个慢连接就会导致其他连接也跟着排队,个别欧洲团队用它做内网还凑合、因为内网爆这种问题少,但公网没那么稳定,所以非常不适合用于公网商业项目、属于冒险行为。nbio 没这个问题。

coder/websocket 号称很多优化很快,但实测、跟其他基于标准库连接的方案相比,算是性能最拉垮的了

相关内容和测试:
https://www.v2ex.com/t/945827
https://github.com/lesismal/go-websocket-benchmark
lesismal
2025 年 2 月 17 日
BTW ,gorilla 被用的最广,但涉及到广播的,仍然需要自己封装,要注意避免循环中的阻塞,这通常需要自己封装额外的写协程,就是这个地方,我见过很多人实现的有问题,比如实现的不好导致僵尸连接
crackidz
2025 年 2 月 17 日
第一个 websocket 的库应用最广,但是有一段时间宣布因为没有维护者归档了一段时间,很多人估计有迁移过
其他的没用过了
voidmnwzp
2025 年 2 月 17 日
@lesismal gorilla 之前看了好像停更了
lesismal
2025 年 2 月 17 日
@voidmnwzp 是的、当初好像是 archive 了一段时间,然后 fasthttp 和字节家都 fork 了分支,但后来 gorilla 又活了
cj323
2025 年 2 月 17 日
感谢科普!
Ipsum
2025 年 2 月 17 日
就我自己用官方的自带库?
iyaozhen
2025 年 2 月 17 日
算是 go 的一个问题(发展阶段必经之路),百花齐放,但都不太好用(或者说没有压倒性的优势)。
http 框架更多

或许这是好的现象,但确实不利于项目选型,用着用着就不维护了
echo1937
2025 年 2 月 17 日
@iyaozhen 国内 gin 最多?
codegenerator
2025 年 2 月 17 日
1.ws 难度不大
2.没有更好的项目混经验,拿 ws 刷经验值
ZeroDu
2025 年 2 月 17 日
Set 的实现也一大堆
iyaozhen
2025 年 2 月 17 日
@echo1937 那不一定,看用户数还是 服务数 字节是自己的 hertz (也开源了)
cj323
2025 年 2 月 17 日
@iyaozhen http 我用自带库感觉挺好用的倒是,不复杂的需求都够用了。我一直觉得 go 标准库的文档写得特别好。

@Ipsum 我一直以来写 Go 都是优先官方库,但是看文档发现他们自己说不建议用 https://pkg.go.dev/golang.org/x/net@v0.35.0/websocket 然后他们推荐了一个库感觉维护得更一般。。https://github.com/coder/websocket
iyaozhen
2025 年 2 月 17 日
@cj323 #18 自带库没问题,但主要是没有规范化 容易每个项目自己封装。比如发起 http 请求,有人为了方便封装个 post json ,但突然要传文件 又封装个 post file

还有一个场景就是基础库一般都性能拉胯,json 这个就很明显
LostPrayers
2025 年 2 月 18 日
怎么说呢, 比如我从 JAVA 生态迁过来后,发现很多库都没有,就会自己写。
主要还是因为 go 写库太方便了,于是大家都开始造轮子

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1112060

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX