聊天系统设计调研
Contents
总体架构分层
- 接入层,无状态
- 逻辑层
- 存储层
这里是参考了陌陌设计
连接层
这里有2种方案选择
- WebSocket
- MQTT
关于MQTT,有EMQX
中间件.
消息上线可以走HTTP接口,即客户端发给服务端消息
消息下行可以走EMQX订阅主题,即服务端推送消息给客户端
连接层属于无状态,支持水平扩展.
逻辑层
通用消息格式定制
以及业务路由分发决策
设计规则
不丢消息
需要业务ACK机制
消息去重
服务端与客户端都需要做到
时序一致性
可以用snowflake算法.
利用局部性原理减少id生成器压力,有利于水平扩展
缓存设计
由于实时系统,基本上有一层cache,类似内核系统的buffer。
多级缓冲,面向c端场景的话一般链路不会太长,而且要考虑数据回种,分布式一致性挑战.
大概local cache -> redis (读写分离)-> database(读写分离)
其他考虑场景
- 接入APP推送
- 接入风控
- 数据多端同步
- 多条消息打包与压缩格式设计
- 万人大群的数据扇出
- 明星突发性空降某频道
- 数据埋点监控
- 系统自动扩容
存储层
离线消息
如果需求量不大,Mysql即可以解决.
聊天应用的读写比例大概是1:1.
数据库
Cassandra
Discord公司有在用.偏向AP场景
HBase
Facebook公司有在用.偏向CP场景
个人想法
前期用Mysql,但是封装一层接口,为后期数据库迁移作准备.
大数据库选择要还看云数据库商支持程度,说不定还有其他云产品合适.
对象存储
minio
消息队列
rabbitMQ
比较适合业务,
但是追求高吞吐的kafka
,自己必须封装多一层机制来保证业务的一致性.
后续有的话再更新