特性
保证消息可达、消息不重复,高可用。常用功能
- 发送成功、已读未读,以及未读数量
- 好友、分组、黑名单
- 群聊
- 网络问题,友好提示,重试机制
- 用户状态维护,心跳机制,是否在线,丢失消息存储。
协议涉及
- 传输层:TCP
- 安全层:一人一密 一次一密。断定网络上的数据包都能被截取,秘钥在客户侧生成。动态秘钥。
- 应用层:定长包头,变长包体
// 包头
struct header
{
magic_num ;// 魔数,分包断包
cmd //命令号
key // 异步key,请求id
log_id // 日志id
body // 二进制 protobuf or json
}
// 包体,即body中的数据
message Request{
cmd;
version;
uid;
seq;
content;
}
// content 内容
message CMsgContent{
from_uid;
to_uid;
time;
msg_id;
msg_data;
}
核心模块
- 接入层netry 连接整流,安全信道,初步攻防
- 逻辑层 原子业务逻辑
- 内存存储router 内存存储 消息路由
固话存储
原子数据访问,cache与存储引擎,对上层提供接口,调用方不用关注落库是MongoDB或者MySQL
核心架构
- 多机房:分组,同连
- 水平扩展:分号段,无状态
- 高可用:冗余,多加集群,可用区
- 负载均衡:随机与平均
核心流程
登录:
在router登记状态,记录entry的ip
聊天:
应用层ACK,上下半场,6个请求,
等待ACK队列;被调用方方去重
SMC:
- single message communication
- 任何端到端的消息传递协议都必将引入消息丢失或消息重复
- 工程启示:不可能构建既不丢失消息也不造成消息重复的即时通讯系统,可行的是通过各种手段降低这件事出现的可能性。唯一messgeid 去重。
自己yy:目前java技术栈大多都是用netty+websocket,在tcp层上进行连接,所谓的百万级连接,还依赖linux的连接数