B站1000 Wqps生产级IM服务框架
goin是b站公司技术总监毛剑创作,使用go语言开发,用于B站生产线上的IM服架(聊天室):
业务场景:
群聊:网页和移动端的群聊
单聊:一对一单聊,在B站终端的
推送:B站给推送客户推送的广告
下面是官方的3590万QPS超高吞吐压测的报告实例和一些的概述
①、高伸缩,可扩展的微服务架构,需要有服务的注册中心,基于golang实现的
discovery。
②、基于谷歌的二进制传输协议性能高 grpc,只是个协议的机制,没有实现服务
的注册和发现
服务端配置:
CPU | 内存 | 操作系统 | 数量 |
20核 | DDR3 32GB | Debian GNU/linux8 | 1 |
上面的使用的是独立的服务器更好,云服务器不好,因为如果用云服务器的话是共
用的物理资源
压测参数
①、不同UID同房间在线人数1,000,000
②、持续推送时长:15分钟
③、持续推送数量:40条/秒
④、推送内容:{"test":1}
⑤、推送类型:单房间推送
⑥、到达计算方式:1秒统计一次,一共30次
压力聚焦在网关上面comet
资源使用
①、每台服务端CPU使用:2000%~2300%(20个核心刚好满负载)
②、每台服务端内存使用:14GB左右
③、GC耗时:504毫秒左右
④、流量使用:Incoming(450MBit/s),Outgoing(4.39GBit/s)
压测结果
推送到达:3590万/秒左右
没有做低性能的比如JWT校验,它是推送直接推送到的Kafka。
预估:如果加上JWT的话1w/qps 预估 2.5w/qps
架构图:
httpClient:推送消息的的业务系统。
logic:相当于网关的角色,然后经过kafka消息队列的削峰。
job:然后有个聚合的工作,队列缓冲,批量写入的功能,而且具备消息的分发服务。
comet:由分发服务job发给A实例comet,或者B实例comet。
在cap定理里面:ap和cp的是不可调和的,如果要cp的话需要在推送链路上一环一环
的确定好确认,ap是高并发,goim框架是保证ap模式的