即使通讯系统功能需求分析
(1)用户点到点的消息通讯 (2)用户在线状态区分 (3)联系人/好友列表 (4)离线消息存储
三层架构设计
(1)接入网关 (2)业务逻辑 (3)数据访问层 (4)自研异步通讯框架 (5)数据传输协议Protobuffer
网关层设计
(1)提供tcp长连接接入方式 (2)维护uid与连接句柄映射关系 (3)超时管理 (4)数据加密传输 (5)对外端口80&443
- 问题思考
enty数据不同步,用户分别在两个entry上登录如何处理 enty发现连接,除了断开连接还需要做什么?
业务逻辑层设计
(1)登录,退出 身份检验 记录登录状态 (2)消息发送 路由信息 保证消息触达机制
- ack确认机制(客户端重发)
- 不可达协议
(3)拉取离线消息 登录自动分页循环拉取 (4)系统消息
数据访问层设计
(1)双向同步互为主备 (2)启动时从对方拉取数据 (3)超时扫描 (4)提供接口 (5)数据库表设计 离线消息表 在线消息表 联系人表 (6)抽象访问接口设计 请求组包/解包 配置文件设计 请求与规则配对 生成sql执行
纯异步高性能开发框架深度剖析
线程模型
(1)上游请求onrequest (2)下游回包onpacketreceived
请求处理流程
(1)编写handler (2)定义上下文 (3)设计状态机 (4)注册habder (5)向下游发起调用 组装查询请求 设置上下文状态 (6)收到下游回包 找到上下文 回调onpacketreceived (7)请求处理完成
超时处理
(1)扫描线程 (2)超时sid放队列 (3)工作线程消费
电商即使通讯系统设计实践
im系统问题
(1)设计面向pc时代 离线消息 不支持历史消息拉取 (2)route 设计过重 运维复杂 (3)没有开放api
im新架构设计
(1)取消router模块 (2)logic只处理核心业务逻辑 (3)extlogic出来非核心业务逻辑 (4)提供spi入口服务imui
存储优化
取消离线消息表 用户状态redis存储
业务流程化
(1)登录 (2)发消息 (3)ack
上线方案
(1)存储复用 (2)搭建新业务集群 (3)tgw改变指向 (4)mq双写
业务优化
(1)离线消息拉取 在线消息表拉取 性能问题 (2)未读消息控制 (3)未读消息计数 前端记录,后端统计,拉取,清零
|