-
GO千万级消息推送服务技术难点的解决方案
内核瓶颈
原理:减少网络小包(一般几百个字节)的发送
将同一秒内的N条消息,合并成1条消息
合并后,每秒推送次数只等于在线连接数
锁瓶颈
原理:大拆小
连接打散到多个集合中,每个集合有自己的锁
多线程并发推送多个集合,避免锁竞争
读写锁取代互斥锁,多个推送任务可以并发遍历相同集合
CPU瓶颈
原理:减少重复计算
json编码前置,1次消息编码+100万次推送
消息合并前置,N条消息合并后只编码1次
查看全部 -
GO千万级消息推送服务性能瓶颈
内核瓶颈
推送量大:100万在线*10条/秒=1000万条/秒
内核瓶颈:linux内核发送TCP的极限包频≈100万/秒
锁瓶颈
需要维护在线用户集合(100万在线),通常是一个字典结构
推送消息即遍历整个集合,顺序发送消息,耗时极长
推送期间,客户端仍旧正常上/下线,所以集合需要上锁
CPU瓶颈
浏览器与客户端通常采用json格式通讯
json编码非常耗费CPU资源
向100万在线推送1次,则需100万次json encode
查看全部 -
go原生的WebSocket的ReadMessage和WriteMessage方法不是线程安全的,但是Close方法是否线程安全的
查看全部 -
封装WebSocket内部原理
启动读协程,循环读取WebSocket,将信息投递到in channel
启动写协程,循环读取out channel,将信息写给WebSocket
查看全部 -
WebSocket的消息类型分为两种:文本类型和二进制类型
查看全部 -
WebSocke是HTTP协议Upgrade而来
查看全部 -
WebSocket传输原理
协议升级后,继续复用HTTP的底层socket完成后续通讯
message底层被切分成多个frame帧传输
编程时只需要操作message,无需关心frame
框架底层完成TCP网络I/O,WebSocket协议解析,开发者无需关心
查看全部 -
WebSocket通讯流程
查看全部 -
推模式
仅在数据更新时才需要推送
需要维护大量的在线长连接
数据更新后可以立即推送
查看全部 -
拉模式
数据更新频率低,则大多数请求是无效的
在线用户数量多,则服务端的查询负载很高
定时轮询拉取,无法满足时效性要求
查看全部 -
很有用啦啦
查看全部 -
试试查看全部
-
分布式架构——整体架构
查看全部 -
分布式架构——逻辑集群
查看全部 -
分布式架构——单机瓶颈
查看全部
举报