IM之架构与细节

特性

保证消息可达、消息不重复,高可用。常用功能

  • 发送成功、已读未读,以及未读数量
  • 好友、分组、黑名单
  • 群聊
  • 网络问题,友好提示,重试机制
  • 用户状态维护,心跳机制,是否在线,丢失消息存储。

协议涉及

  • 传输层: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:

  1. single message communication
  2. 任何端到端的消息传递协议都必将引入消息丢失或消息重复
  3. 工程启示:不可能构建既不丢失消息也不造成消息重复的即时通讯系统,可行的是通过各种手段降低这件事出现的可能性。唯一messgeid 去重。

自己yy:目前java技术栈大多都是用netty+websocket,在tcp层上进行连接,所谓的百万级连接,还依赖linux的连接数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章