V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
cj323
V2EX  ›  Go 编程语言

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

  •  
  •   cj323 · 1 天前 · 5071 次点击

    感觉 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 啊?

    37 条回复    2025-02-18 15:53:38 +08:00
    musi
        1
    musi  
       1 天前
    这么多轮子最少的 star 还有 1.5k ,不太理解。。。
    lasuar
        2
    lasuar  
       1 天前   ❤️ 3
    造轮子跟开发者个人想法有关,跟整个生态关系不大。有的人觉得现有的不好用,有的人觉得现有的性能不足,有的人想锻炼自己。。etc
    ninjashixuan
        3
    ninjashixuan  
       1 天前
    还行吧,ws 不是很大的 framework ,甚至可以说是 lib 库,常用的多几个选择不好么。
    march1993
        4
    march1993  
       1 天前
    因为用 golang 实现 websocket 协议比较容易,同时应用需求又很旺盛,所以同时有很多实现。
    lysShub
        5
    lysShub  
       1 天前
    因为简单,和 json 库一样。

    难点的、像用户态网络栈就 gvisor 可用
    lesismal
        6
    lesismal  
       1 天前   ❤️ 10
    按照协议分层来讲,其他是实现 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
        7
    lesismal  
       1 天前   ❤️ 1
    BTW ,gorilla 被用的最广,但涉及到广播的,仍然需要自己封装,要注意避免循环中的阻塞,这通常需要自己封装额外的写协程,就是这个地方,我见过很多人实现的有问题,比如实现的不好导致僵尸连接
    crackidz
        8
    crackidz  
       1 天前
    第一个 websocket 的库应用最广,但是有一段时间宣布因为没有维护者归档了一段时间,很多人估计有迁移过
    其他的没用过了
    voidmnwzp
        9
    voidmnwzp  
       1 天前 via iPhone
    @lesismal gorilla 之前看了好像停更了
    lesismal
        10
    lesismal  
       1 天前
    @voidmnwzp 是的、当初好像是 archive 了一段时间,然后 fasthttp 和字节家都 fork 了分支,但后来 gorilla 又活了
    cj323
        11
    cj323  
    OP
       1 天前
    感谢科普!
    Ipsum
        12
    Ipsum  
       1 天前
    就我自己用官方的自带库?
    iyaozhen
        13
    iyaozhen  
       1 天前
    算是 go 的一个问题(发展阶段必经之路),百花齐放,但都不太好用(或者说没有压倒性的优势)。
    http 框架更多

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

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

    还有一个场景就是基础库一般都性能拉胯,json 这个就很明显
    LostPrayers
        20
    LostPrayers  
       1 天前
    怎么说呢, 比如我从 JAVA 生态迁过来后,发现很多库都没有,就会自己写。
    主要还是因为 go 写库太方便了,于是大家都开始造轮子
    yb2313
        21
    yb2313  
       21 小时 5 分钟前
    多就是好, 你不会真喜欢少就是多的理念吧?
    SingeeKing
        22
    SingeeKing  
       20 小时 55 分钟前 via iPhone
    还是每个开发者的喜好不同,也可能是对于暴露的功能的要求不同,比如我之前也自己造过一个…
    wheat0r
        23
    wheat0r  
       19 小时 44 分钟前
    有些时候不是重复制造轮子的问题,是各家的轮子都是方的,而每个人都觉得自己的轮子更圆
    aababc
        24
    aababc  
       19 小时 40 分钟前
    @cj323 #18 你是我见过的为数不多的说 go 官方文档写的好的
    realpg
        25
    realpg  
       19 小时 34 分钟前
    某些用 java 的看跟 java 不一样的调用方式就不爽
    跟 java 某些知名库比少一些参数就手撸一个
    而且,golang 写网络相关东西很省事,有些东西找库,还不知道内部性能,实现方式,都不如自己写一个知根知底性能可预期的靠谱
    zhady009
        26
    zhady009  
       19 小时 22 分钟前
    @realpg Java 里这一领域感觉已经被 Netty 统治了,性能扩展易用都很好基本没人会去再造
    realpg
        27
    realpg  
       19 小时 6 分钟前
    @zhady009 #26
    我说的是 写 java 的 用其他语言 就想把什么都整成跟 java 一样的样子
    我们遇到过太多了
    liaohongxing
        28
    liaohongxing  
       18 小时 35 分钟前
    @lesismal fasthttp 这个 websocket 实现有无问题 https://github.com/fasthttp/websocket ,我用的这个
    sakurawzt
        29
    sakurawzt  
       17 小时 52 分钟前
    @realpg 是这样的,感觉还是有个统一的比较好
    0x676e67
        30
    0x676e67  
       17 小时 46 分钟前
    多一个选择未必不是好事。。
    powersee
        32
    powersee  
       17 小时 29 分钟前
    conn4575
        33
    conn4575  
       17 小时 23 分钟前 via Android
    真的有人看 javadoc 啊,那玩意就只是一堆类和方法的堆叠,我一般都是去 github 上看 example
    lesismal
        34
    lesismal  
       17 小时 17 分钟前
    @liaohongxing 看了下提交日志,这个应该就是 gorilla 那个 fork 过来之后改了改的。不论哪个库,主流都是 http upgrade 到 ws 的,这个过程中的 hijack 后 ws 库就接管了 conn 。fasthttp 这个基于 gorilla 那个、后续改了多少内容我就没关注了,应该都差不多。我上面说的很多人使用 gorilla 有问题是指自己封装的部分的问题比如僵尸连接、协程泄漏,不是说 gorilla 本身有问题、它的定位是实现协议并提供基础接口。
    sagaxu
        35
    sagaxu  
       17 小时 15 分钟前
    @lvlongxiang199 31# Java 文档也改进很多了,比如
    https://docs.oracle.com/en/java/javase/23/docs/api/java.base/java/util/regex/Matcher.html#appendReplacement(java.lang.StringBuffer,java.lang.String)

    这两个 JEP 就是为了改进文档提的
    JEP 413: Code Snippets in Java API Documentation
    JEP 467: Markdown Documentation Comments

    代码片段和文字描述都很重要
    lvlongxiang199
        36
    lvlongxiang199  
       16 小时 26 分钟前
    @powersee @sagaxu 跟 go 的相比, 还是有些差距, golang 的 example 能在线运行 (点开 example 有个 run 按钮), 能集成到 CI 里头 https://go.dev/blog/examples
    tsanie
        37
    tsanie  
       13 小时 48 分钟前   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:41 · PVG 05:41 · LAX 13:41 · JFK 16:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.