作家
登录

如何使用Go建开发高负载WebSocket服务器

作者: 来源: 2017-09-13 15:47:14 阅读 我要评论

  • func WriteFrame(io.Writer, Frame) error 
  • 留意这里有reader和writer连个goroutines。 每个goroutine都须要本身的内存栈, 根据操作体系和Go版本可能具有2到8 KB的初始大年夜小。

    在300万个在线连接的时刻,我们将须要24 GB的内存 (客栈为4 KB)用于保持所有连接。 这还没有计算为Channel构造分派的内存,传出的数据包ch.send和其他内部字段消费的内存。

    1. I/O goroutines 
    1. func (c *Channel) reader() { 
    2.     // We make a buffered read to reduce read syscalls. 
    3.     buf := bufio.NewReader(c.conn) 
    4.  
    5.     for { 
    6.         pkt, _ := readPacket(buf) 
    7.         c.handle(pkt) 
    8.     } 

    这里我们应用bufio.Reader来削减read() syscalls的数量,并攫取与buf缓冲区大年夜小一样的数量。 在无穷轮回中,我们等待新数据的到来。 请记住: 估计新数据将会光降。 我们稍后会回来。

    我们将分开传入数据包的解析和处理,因为对我们将要评论辩论的优化不重要。 然则, buf如今值得我们留意:默认情况下,它是4 KB,这意味着我们须要别的12 GB内存。 “writer”有类似的情况:

    我们遍历c.send ,并将它蒙烫蛛缓冲区。细心读者已经猜到的,我们的300万个连接还将消费12 GB的内存。

    HTTP

    1. GET /ws HTTP/1.1 
    2. Host: mail.ru 
    3. Connection: Upgrade 
    4. Sec-Websocket-Key: A3xNe7sEB9HixkmBhVrYaA== 
    5. Sec-Websocket-Version: 13 
    6. Upgrade: websocket 
    7.  
    8. HTTP/1.1 101 Switching Protocols 
    9. Connection: Upgrade 
    10. Sec-Websocket-Accept: ksu0wXWG+YmkVx+KQR2agP0cQn4= 
    11. Upgrade: websocket 

    我们已经有一个简单的Channel实现,如今我们须要一个WebSocket连接才能应用。

    留意:如不雅您不知道WebSocket若何工作。客户端经由过程称为进级的特别HTTP机制切换到WebSocket协定。 在成功处理进级请求后,办事器和客户端应用TCP连接来交换二进制WebSocket帧。 这是连接中的框架构造的描述。

    1. import ( 
    2.     "net/http" 
    3.     "some/websocket" 
    4.  
    5. http.HandleFunc("/v1/ws", func(w http.ResponseWriter, r *http.Request) { 
    6.     conn, _ := websocket.Upgrade(r, w) 
    7.     ch := NewChannel(conn) 
    8.     //... 
    9. }) 

    请留意, http.ResponseWriter为bufio.Reader和bufio.Writer (应用4 KB缓冲区)进行内存分派,用于*http.Request初始化和进一步的响应写入。

    无论应用什么WebSocket库,在成功响应进级请求后, 办事器在responseWriter.Hijack()调用之后,连同TCP连接一路接收 I/O缓冲区。

    提示:在某些情况下, go:linkname 可用于 经由过程调用 net/http.putBufio{Reader,Writer} 精华冲区返回到 net/http 内 的 sync.Pool 。

    1. func (c *Channel) writer() { 
    2.     // We make buffered write to reduce write syscalls.  
    3.     buf := bufio.NewWriter(c.conn) 
    4.  
    5.     

        推荐阅读

        通过云库存管理遏制随需应变的自助服务风险

      51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦! 然则因为云计算的按需自助办事模式,营业的其他部分经常会供给新办事,并绕开企业的IT办事,这可能会增长>>>详细阅读


      本文标题:如何使用Go建开发高负载WebSocket服务器

      地址:http://www.17bianji.com/lsqh/37391.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)