赞
踩
总体架构包括5个层级,具体内容如下图。
1.1.1 用户端
移动端重点是移动端,支持IOS/Android系统,包括IM App,嵌入消息功能的瓜子App,未来还可能接入客服系统。
1.1.2 用户端API
针对TCP协议,提供IOS/Android开发SDK。对于H5页面,提供WebSocket接口
1.1.3 接入层
接入层主要任务是保持海量用户连接(接入)、攻击防护、将海量连接整流成少量TCP连接与逻辑层通讯。
1.1.4 逻辑层
逻辑层负责IM系统各项功能的核心逻辑实现。包括单聊(c2c)、上报(c2s)、推送(s2c)、群聊(c2g)、离线消息、登录授权、组织机构树等等内容。
1.1.5 存储层
存储层负责缓存或存储IM系统相关数据,主要包括用户状态及路由(缓存),消息数据(MySQL也可采用NoSql,如MangoDB),文件数据(文件服务器)。
1.2.1 核心结构
客户端从Iplist服务获取接入层IP地址(也可采用域名的方式解析得到接入层IP地址),建立与接入层的连接(可能为短连接),从而实现客户端与IM服务器的数据交互;业务线服务器可以通过服务器端API建立与IM服务器的联系,向客户端推送消息;客户端上报到业务服务器的消息,IM服务器会通过mq投递给业务服务器。
1.2.2 tcp接入核心流程
【1.2.2.1 登录授权(auth)】
【1.2.2.2 登出(logout)】
【1.2.2.3 踢人(kickout)】
用户请求授权时,可能在另一个设备(同类型设备)开着软件处于登录状态。这种情况需要系统将那个设备踢下线。
【1.2.2.4 上报(c2s)】
【1.2.2.6 单对单聊天(c2c)】
注:在第6步和第7步之间,启动计时器(DelayedQueue或哈希环,时间如5秒),计时器时间到后,探测该条消息状态,如果消息未送达,考虑通过APNS、米推、个推进行推送
【1.2.2.7 群聊(c2g)】
采用扩散写(而非扩散读)的方式。
群聊是多人社交的基本诉求,一个群友在群内发了一条消息:
由于“消息风暴扩散系数”的存在,群消息的复杂度要远高于单对单消息。
群基础表:用来描述一个群的基本信息
im_group_msgs(group_id, group_name,create_user, owner, announcement, create_time)
群成员表:用来描述一个群里有多少成员
im_group_users(group_id, user_id)
用户接收消息表:用来描述一个用户的所有收到群消息(与单对单消息表是同一个表)
im_message_recieve(msg_id,msg_from,msg_to, group_id,msg_seq, msg_content, send_time, msg_type, deliverd, cmd_id)
用户发送消息表:用来描述一个用户发送了哪些消息
im_message_send (msg_id,msg_from,msg_to, group_id,msg_seq, msg_content, send_time, msg_type, cmd_id)
业务场景举例:
【1.2.2.8 拉取离线消息】
gate和logic合并为im-server。拉取离线消息流程如下。
ISO采用APNS;Android真后台保活,同时增加米推、个推。
基本思路:push提示信息,App通过拉离线获得真实消息。
2.2.1 用户状态及路由信息
Redis缓存以uid为key,检索channel(socketid),last_packet_time等。
Gate层,session以channel(socketed)为key,检索uid,及其他信息。
交互接口:gate->logic,通过将channel转换为uid作为key。
logic->gate,将uid转换为channel作为key。
2.2.2 其他缓存信息
你觉得该怎么存就怎么存。
采用商用云存储。
可考虑采用HBase,HDFS作为数据归档,或者相关云存储服务。
安全部分略,其他非核心功能略
更多im设计资料请访问 http://m2jm.com
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。