作家
登录

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

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

以下是进级请求处理的基准 :标准net/http办事器与net.Listen()加零拷贝进级:

  1. BenchmarkUpgradeHTTP 5156 ns/op 8576 B/op 9 allocs/op  
  2. BenchmarkUpgradeTCP 973 ns/op 0 B/op 0 allocs/op 

切换到ws和零拷贝进级节俭了别的24 GB内存 - 这是由net/http处理法度榜样请求处理时为I/O缓冲区分派的空间。

概要

让我们结合代码告诉你我们做的优化。

  • 攫取内部缓冲区的goroutine是异常昂贵的。 解决筹划 :netpoll(epoll,kqueue); 重用缓冲区。
  • 写入内部缓冲区的goroutine是异常昂贵的。 解决筹划 :须要时启动goroutine; 重用缓冲区。
  • DDOS,netpoll将无法工作。 解决筹划 :从新应用数量限制的goroutines。
  • net/http不是处理进级到WebSocket的最快办法。 解决筹划 :在连接上应用零拷贝进级。

结论

这就是办事器代码的样子:

邮件轮询涉及每秒大年夜约50,000个HTTP萌芽,个中60%返回304状况,这意味着邮箱没有变更。

  1. import ( 
  2.     "net" 
  3.     "github.com/gobwas/ws" 
  4.  
  5. ln, _ := net.Listen("tcp"":8080"
  6.  
  7. for { 
  8.     // Try to accept incoming connection inside free pool worker. 
  9.     // If there no free workers for 1ms, do not accept anything and try later. 
  10.     // This will help us to prevent many self-ddos or out of resource limit cases. 
  11.     err := pool.ScheduleTimeout(time.Millisecond, func() { 
  12.         conn := ln.Accept() 
  13.         _ = ws.Upgrade(conn) 
  14.  
  15.         // Wrap WebSocket connection with our Channel struct. 
  16.         // This will help us to handle/send our app's packets. 
  17.         ch := NewChannel(conn) 
  18.  
  19.         // Wait for incoming bytes from connection
  20.         poller.Start(conn, netpoll.EventRead, func() { 
  21.             // Do not cross the resource limits. 
  22.             pool.Schedule(func() { 
  23.                 // Read and

      推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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