转载地址:http://hi.baidu.com/algorithms/blog/item/a17909d1bfc3712f9a5027c0.html
IM(即时通讯)系统(如QQ、MSN、飞信等),至少分为2个部分:客户端和服务器端。它属于典型的1对多服务。IM的特点有:
① PV很高,这里PV表示client和server的一次通信;
② 有效在线UV很高,典型的为100w-1亿;
③ 主要的功能包括:登录、发文本消息、群发文本消息、发图片消息、群发图片消息、语音/视频。
Ok,基本特点了解了,开始设计构架。
流程:
① 用户发送连接请求给接入点;
② 接入点去用户信息服务判断是否可以登录;
③ 如果可以登录,从用户信息服务获得数据到本地;
④ 发送登录成功给用户;
⑤ 设置用户登录状态到状态服务。
接入点功能:
① 提供网络传输,基于udp;
② 存储接入用户信息,如个人信息、好友信息等;
③ 负载均衡,负载过高时,要求用户换一个登录,备选方案:3dns;
用户信息服务(更多像一个数据库)功能:
① 存储用户的所有信息;
状态服务功能:
① 用户当前状态存储,如登录/隐身/ip/sessionid;
设计理由:
① 多接入点+udp,可以同时接受更多用户;
② 状态服务,可以给其他应用(如发信息)使用,免去验证;
流程:
① A用户在接入点A登录,B用户在接入点B登录;
② A用户发送文本消息给接入点A;
③ 接入点A从状态信息服务器中获得B用户状态;
④ 接入点A发送消息到消息服务;
⑤ 接入点A返回发送成功给A用户;
⑥ 消息服务调度消息,发送消息给接入点B;
⑦ 接入点B发送消息给B用户。
消息服务功能:
① 存储消息,通过接入点发送给最终客户端;
② 负载均衡;
设计理由:
① 接入点功能复杂,内存紧张,增加一个消息服务更清晰。
群发文本消息和普通文本消息的不同之处在于接收人有多个。一个最简单的做法就是沿用普通文本消息的策略,但产生多个内容一样的消息,消息发往多个消息服务器,等消息服务器调度。
群消息的安全性没有普通消息要求高,故可以设置一个较短延迟(最迟投递时间),超过了(如网络繁忙)就直接抛弃。
多媒体信息都很大,最佳解决方案是不通过服务器,客户端直接通过NAT打洞策略链接。
群发图片采用客户端直连会比较麻烦,因为群里面人太多,客户端每个都去链接会造成资源紧张,也容易出错。故主要仍然需要采用服务器中转的模式。
语音/视频和图片处理策略差不多。在多人语音的时候,首先采用客户端直连的策略,在不通畅的时候,才采用服务器中转的策略。
① 抗dns错误:客户端(每发布一个版本就更新一次)预先存储一些有效接入点(ip)。
② YY语音怎么弄?更快速的多媒体传输:
a)自建CDN,在每个接入商那里都放几台电脑。好处:大局域网用户快速中转。
b)多个IDC之间P2P传输,加快数据分发速度。
c) 多IDC建立内部光纤专线。