转载: IM系统架构设计之浅见
出处:http://yaocoder.blog.51cto.com/2668309/1412029
背 景:除去大名鼎鼎的QQ这款即时聊天工具,还有许多细分行业的IM,比如淘宝阿里旺旺、网易泡泡、YY语音......。恰巧公司产品也要开发一款基于我 们自己行业的类IM系统,很有幸我担当了这个产品的架构师,核心代码编写、实现者。下面我近年来从技术上我对IM系统(即时消息的传输,不包括语音,视 频,文件的传输)的理解和设计分享出来,浅薄之见,望大家别见笑,欢迎给出批评意见。
一.网络传输协议的选择
目前我知晓的所有IM系统传输即时消息无外乎使用UDP、TCP、基于TCP的http这几种协议中的一种或几种。比如QQ主要采用UDP协议,MSN主要采用TCP协议,而且他们也都支持HTTP协议的代理模式。更多资料,请参加这篇文章《一些常用软件的网络端口协议分类介绍》。
我们该如何选择呢?
- UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂; 
- HTTP协议属于扩展支持,我们在产品的初始阶段可以不用支持; 
- 那就非TCP协议莫属了,要考虑的同样也有很多,特别是如果有海量用户的需求。如何保证单机服务器高并发量,如何做到灵活,扩展的架构。 
二.应该选择什么格式的数据协议
二进制格式?文本格式?这个话题转到我的这篇文章《网络传输数据格式的选择》,从我们当前的需求和产品周期上我觉得选择JSON形式的数据协议是最好的。
三.架构设计
首先我们来提炼一下一个IM系统的主要需求,包括账号,关系链,在线状态显示,消息交互......。
架构考量:
- 由于采用可靠传输协议TCP,考虑到负载问题(短连接实现账号、关系链相关业务,长连接实现上线、信息推送); 
- 后台架构的灵活性、可扩展性,支持分布式部署——把网络层、业务逻辑层、数据层分离,网络层和业务层支持负载均衡策略、数据层支持分布式存储; 
- 客户端SDK的易用性:把网络层、数据层分离、业务逻辑层分离; 
后台架构简化图

架构示意图

架构细化图

说明
- 从< 架构细化图>中可以看出对于上线服务由于建立的是TCP长连接,对于单台服务器往往由于硬件资源、系统资源、网络资源的限制无法做到海量用户的同时 在线,所以设计为根据服务器负载支持多服务器上线,同时由于多服务器上线造成了对整个系统交互(不同的客户端的交互,协作部门应用服务和客户的交互)的分 割,引入消息转发服务器作为粘合点。另外对于多服务器上线造成的统一账户信息(在线状态,消息)数据的分割,引入统一的数据层(内存存储 层:session、状态信息存储、消息队列存储;数据库:账号信息存储)做到业务和数据的分离,也就做到了支持分布式部署。参见我的这篇文章《构建高性能服务的考量》 
- 对于部分业务服务:做到网络层、业务层、数据层的完全分离。首先对于TCP短连接来说不会如长连接那般消耗资源,即使后期遇到海量的并发访问请求依然可以从容的通过负载均衡策略和数据分布式部署策略进行解决。参见我的这篇文章《服务端架构中的“网关服务器”》 
服务端平台及技术选型
- 系统开发平台: CentOS——Linux发行版的一种,稳定可靠、可定制优化、支持丰富; 
- 网络支撑层: libevent——减小开发成本,增强稳定性; 
- 缓存存储层: Redis——支持丰富的存储结构,支持分布式存储; 
- 数据库: MySQL——最适合互联网的数据库,免授权、高效稳定、可控性高; 
- 开发语言: C/C++; 
部分热点问题考量
- 系统性能考量: - 编码角度:采用高效的网络模型,线程模型,I/O处理模型,合理的数据库设计和操作语句的优化; 
- 垂直扩展:通过提高单服务器的硬件资源或者网络资源来提高性能; 
- 水平扩展:通过合理的架构设计和运维方面的负载均衡策略将负载分担,有效提高性能;后期甚至可以考虑加入数据缓存层,突破IO瓶颈; 
 
- 系统的高可用性:(防止单点故障) - 在架构设计时做到业务处理和数据的分离,从而依赖分布式的部署使得在单点故障时能保证系统可用。 
- 对于关键独立节点可以采用双机热备技术进行切换。 
- 数据库数据的安全性可以通过磁盘阵列的冗余配置和主备数据库来解决。 
 
- Tips: 如果要支持web IM,请阅读《Web推送技术研究》 
主要学习资料: 请自行google。
- 《1.4亿在线背后的故事》; 
- 《BasicDB的架构演变》; 
- 《微信之道-至简》; 
转载: IM系统架构设计之浅见的更多相关文章
- IM系统架构设计之浅见
		转自:http://mobile.51cto.com/hot-439693.htm 背景:除去大名鼎鼎的QQ这款即时聊天工具,还有许多细分行业的IM,比如淘宝阿里旺旺.网易泡泡.YY语音....... ... 
- [转]【转】大型高性能ASP.NET系统架构设计
		大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ... 
- PetShop的系统架构设计
		<解剖PetShop>系列 一.PetShop的系统架构设计 http://www.cnblogs.com/wayfarer/archive/2007/03/23/375382.html ... 
- petshop4.0 具体解释之中的一个(系统架构设计)
		前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ... 
- NET ERP系统架构设计
		解析大型.NET ERP系统架构设计 Framework+ Application 设计模式 我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应 ... 
- 基于Struts2,Spring4,Hibernate4框架的系统架构设计与示例系统实现
		笔者在大学中迷迷糊糊地度过了四年的光景,心中有那么一点目标,但总感觉找不到发力的方向. 在四年间,尝试写过代码结构糟糕,没有意义的课程设计,尝试捣鼓过Android开发,尝试探索过软件工程在实际开发中 ... 
- Unity3D手游开发日记(2) - 技能系统架构设计
		我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ... 
- 图数据库 Nebula Graph 的数据模型和系统架构设计
		Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,而且能够提供极高的 ... 
- 5G 融合计费系统架构设计与实现(一)
		5G 融合计费系统架构设计与实现(一) 随着5G商用临近,5G的各个子系统也在加紧研发调试,本人有兴全程参与5G中的融合计费系统(CCS)的设计.开发.联调工作.接下来将用几篇文章介绍我们在CCS实现 ... 
随机推荐
- 使用PyHive操作Hive
			使用PyHive操作Hive 废话 搜了一下,看到了StackOverFlow的回答,试了一下前两个方案,感觉第二个更简洁,这里记录一下,更详细的见参考. 安装依赖 pip install sasl ... 
- Arrays.sort()的底层实现
			1.基本类型(以int为例) 源码中的快速排序,主要做了以下几个方面的优化: 1)当待排序的数组中的元素个数较少时,源码中的阀值为7,采用的是插入排序.尽管插入排序的时间复杂度为0(n^2),但是当数 ... 
- Eclipse - Mac Os Default JRE missing
			转:http://stackoverflow.com/questions/1736993/eclipse-mac-os-default-jre-missing 1) Follow Joshua's a ... 
- SVN如何切换账号
			https://www.cnblogs.com/six-moon/p/5233878.html **************************************************** ... 
- 在java代码中,用xslt处理xml文件
			http://blog.csdn.net/zhou_lei/article/details/2661735 ********************************************** ... 
- WPF视频会议系统资料
			Android和C#实现实时视频传输Demo 视频会议及流媒体十大开源项目 WinForm二三事(三)Control.Invoke&Control.BeginInvoke 
- java随机范围内的日期
			使用了最新的java8的java.time类,并提供了LocalDateTime和java.util.Date之间的转换. 使用方法: randomLocalDateTime(-3,3) : 取距离今 ... 
- shell+钉钉机器人完成java程序中断后自启动和实时监控
			java实时程序在运行过程中偶尔出现异常信息中断的情况,通过shell脚本即可完成自启动. 以下为监控一个实时的java程序的shell脚本. 通过每10秒检查一次java程序的进程,来判断程序是否处 ... 
- Google Chrome 未响应。是否立即重新启动?---解决方法(秒速解决)
			Google Chrome 未响应.是否立即重新启动? 解决方法 不当的退出会造成 Google Chrome 无法启动.出现“Google Chrome 未响应.是否立即重新启动?”的错误. 要解决 ... 
- drupal7 的核心模块
			核心模块 Drupal 7 block Block(区块)模块提供了与区块相关的功能,通过区块可将内容放置在网站不同区域.Block模块是Drupal的基础模块之一,不能被禁用.它是通过单独的区块管理 ... 
