Open katsusan opened 3 years ago
refer: https://mp.weixin.qq.com/s?__biz=MjM5ODYwMjI2MA==&mid=2649757129&idx=1&sn=bfbac9fecfcf55b6bff25e59dc96d903&chksm=becc86b289bb0fa4236a0575a0fc7effdfe00c2af90e05be0828a78c0fa21fdab0e741a92377#rd
消息框架选型:读扩散。 // 微信群采用写扩散。
通信模式:longpolling模式。 // 不用websocket的原因:(1) ws主要用于推模式,容易丢消息。(2) 推模式需要维护在线列表。(3) longpolling本质是短连接,客户端实现简单。
读扩散会造成巨大的IO压力,因此需要加入cache。普通的cache有状态且可穿透, 通过异步线程任务来解决这一点。(实时通知、异步拉取、兜底轮训、无锁读取←读写表分离+原子切换、sect化部署)
缺点:流量不可控、大直播信令丢失、单点瓶颈、无在线历史统计、
针对丢信令消息:打优先级标记、cache内分表、优先收取/下发。
分布式在线统计:拆key+读写分离+异步聚合落盘。
历史在线统计:基于hyperloglog
基数小的时候hyperloglog会有误差因此可以结合bigtable和hyperloglog。 即小基数时双写bigtable和hyperloglog,以bigtable的select结果为准,大基数时只写hyperloglog以其估算值为准, 在线统计模块定期把在线列表merge到hyperloglog避免丢数据(?)。
流量隔离vipsect:对大小直播间进行策略分流。
related 1:
https://zhuanlan.zhihu.com/p/77289303 https://www.jianshu.com/p/55defda6dcd2 hyperloglog 基数统计(一组集合中求不重复元素的个数)。
// TODO
refer: https://mp.weixin.qq.com/s?__biz=MjM5ODYwMjI2MA==&mid=2649757129&idx=1&sn=bfbac9fecfcf55b6bff25e59dc96d903&chksm=becc86b289bb0fa4236a0575a0fc7effdfe00c2af90e05be0828a78c0fa21fdab0e741a92377#rd
1. 聊天室1.0架构
消息框架选型:读扩散。 // 微信群采用写扩散。
通信模式:longpolling模式。 // 不用websocket的原因:(1) ws主要用于推模式,容易丢消息。(2) 推模式需要维护在线列表。(3) longpolling本质是短连接,客户端实现简单。
1.1 无状态cache
读扩散会造成巨大的IO压力,因此需要加入cache。普通的cache有状态且可穿透, 通过异步线程任务来解决这一点。(实时通知、异步拉取、兜底轮训、无锁读取←读写表分离+原子切换、sect化部署)
缺点:流量不可控、大直播信令丢失、单点瓶颈、无在线历史统计、
2. 聊天室2.0架构
针对丢信令消息:打优先级标记、cache内分表、优先收取/下发。
分布式在线统计:拆key+读写分离+异步聚合落盘。
历史在线统计:基于hyperloglog
基数小的时候hyperloglog会有误差因此可以结合bigtable和hyperloglog。 即小基数时双写bigtable和hyperloglog,以bigtable的select结果为准,大基数时只写hyperloglog以其估算值为准, 在线统计模块定期把在线列表merge到hyperloglog避免丢数据(?)。
流量隔离vipsect:对大小直播间进行策略分流。