V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
爱意满满的作品展示区。
lesismal

NBIO 第三弹 —— 真正的 Websocket 百万连接,以及 HTTPS 支持

  •  
  •   lesismal ·
    lesismal · Mar 22, 2021 · 2389 views
    This topic created in 1866 days ago, the information mentioned may be changed or developed.

    NBIO 第三弹 —— 真正的 Websocket 百万连接,以及 HTTPS 支持

    上周又撸了个 Upgrader 支持 Websocket,功能已经打通,Upgrader 握手的部分是直接从 gorilla/websocket CV 大法然后修改的,感谢 gorilla/websocket ! 经过一番纠结,没有支持 Websocket 的 permessage-deflate 压缩,因为不是所有浏览器 /client 都支持该功能,所以如果 server 开启了压缩,反倒可能导致车祸。 如果需要压缩,应用层框架自己封装下发送 payload 的方法就能轻易实现,并且更能自主选择压缩算法。

    为什么叫真正的 Websocket 百万连接?

    曾经有个老外的帖子讲到单机百万 websocket 连接的优化: Going Infinite, handling 1M websockets connections in Go 对应的仓库好像是这个:1m-go-websockets

    早前就有看过这个帖子,但是没有细读该仓库的代码,刚好前阵子有人向我推荐它,我就去试了下这个仓库优化到最后一步的代码 4_optimize_gobwas 我做了个"粘包"测试,这个帖子的优化代码应该是有问题的:这个帖子和仓库的优化方式,只是把连接的 FD events 添加到了 epoll,但是并没有设置 FD 为 Non-Blocking mod,然后等到 epoll 监听可读时再读,虽然避免了每个连接一个协程,但是由于单个 FD 的阻塞,如果这个 FD 上有某个或者某些 Websocket 完整消息的数据不是一次性全部到达,这个 FD 的 websocket 读整个消息将被阻塞,从而导致这个 epoll 上的其他 FD 也要等它读到完整包。 这个"粘包"测试的详细代码在这里,有兴趣的小伙伴可以去试下: server client

    NBIO-HTTP-Websocket 是真正的异步非阻塞,所以能像其他语言的异步库那样实现单机高并发,可以避免每个连接创建一个协程,代码示例请参考: nbio-websocket-examples nbio-websocket-1m-connections-examples

    HTTPS 支持

    由于更早些时候魔改了下标准库的 TLS 已经跟 NBIO 打通,所以也就封装了下支持 HTTPS Server,用法:

    cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
    if err != nil {
        log.Fatalf("tls.X509KeyPair failed: %v", err)
    }
    tlsConfig := &tls.Config{
        Certificates:       []tls.Certificate{cert},
        InsecureSkipVerify: true,
    }
    tlsConfig.BuildNameToCertificate()
    
    mux := &http.ServeMux{}
    mux.HandleFunc("/echo", onEcho)
    
    svr := nbhttp.NewServerTLS(nbhttp.Config{
        Network: "tcp",
        Addrs:   []string{"localhost:8080"},
    }, mux, nil, nil, tlsConfig)
    
    err = svr.Start()
    if err != nil {
        fmt.Printf("nbio.Start failed: %v\n", err)
        return
    }
    defer svr.Stop()
    

    完整代码请参考: https-server

    欢迎有兴趣的小伙伴关注、进行更多测试,以及 issue 、pr 、star,^_^

    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2592 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:51 · PVG 20:51 · LAX 05:51 · JFK 08:51
    ♥ Do have faith in what you're doing.