整理自https://www.imooc.com/learn/1025,GO实现千万级WebSocket消息推送服务
一:百万用户的websocket的技术瓶颈
主要有三个:内核瓶颈、cpu瓶颈和锁瓶颈
1内核瓶颈
在线用户达百万时,实时数据量非常之大,linux内核发送tcp的极限包频率是100万/秒,
优化:消息合并,减小网络小包推送,同一秒内的多条消息合并成1条推送,减小内核压力
2 cpu 瓶颈
1)浏览器与服务器通常采取json格式通讯
2)json编码特别消耗cpu资源
3)向100万在线推送资源,json需要100万次encode
优化:编码前置:1次编码+100万次推送
3.锁瓶颈
1)需要维护在线用户(100万在线),通常是个哈希字典结构
2)推送消息遍历整个集合,顺序发送消息,耗时极长
3)推送期间,客户端正常上下线,集合面临不停的修改,需要上锁,这期间客户端拿不到锁会无法正常上下线
解决方案:
a)大锁拆小,把长连接打散到多个集合,每个集合有自己的锁,每个集合独立,锁之间没竞争关系,
可多线程并发推送不同的集合
b)读写锁代替互斥锁
二 单机瓶颈
维护海量长连接会花费不少的内存
消息推送瞬时会消耗大量的cpu资源
消息推送瞬时带宽高达400-600MB(4-6Gbits)万兆网卡才能满足需求,是主要的技术瓶颈
因此需要分布式架构