IM系统架构设计之浅见

IM系统架构设计之浅见

在主流的Web站点中,图片往往是不可或缺的页面元素,尤其在巨型网站中,几乎都将面临“海量图片资源”的仓储、访问等连锁技术问题。在针对图片服务器的架构扩张中,也会历经重重曲折甚至是血泪教训(尤其是早期规划不足,造成中期架构上很难兼容和扩充)。

背景:除去大名鼎鼎的QQ这款即时聊天工具,还有许多瓜分行业的IM,比如天猫阿里旺旺、新浪泡泡、YY语音……。恰巧集团产品也要开支一款基于我们温馨行业的类IM系统,很幸运我肩负了这多少个产品的架构师,要旨代码编写、实现者。下面我多年来从技术上我对IM系统(即时音讯的传导,不包括语音,视频,文件的传输)的理解和规划分享出来,浅薄之见,望我们别见笑,欢迎给出批评意见。

本文将以一个真实垂直门户网站的发展进程,向我们持续道来。

一.网络传输协议的抉择

构建在Windows平台之上的网站,往往会被专业众多技巧认为很“保守”,甚至会有点。很大部分缘故,是出于微软技能系统的查封和局部技术人士的短视造成的(当然,紧要仍然人的题材)。由于天长日久短缺开源扶助,所以重重人不得不“闭门造车”,这样很容易形成思维局限性和短板。以图纸服务器为例子,要是早期没有容量规划和可扩张的计划性,那么随着图片文件的随地追加和访问量的上升,由于在性质、容错/容灾、扩大性等地点的规划不足,后续将会给开发、运维工作牵动很多题材,严重时如故会潜移默化到网站业务健康运行和互联网集团的提升(这绝不是在震惊)。

脚下本身清楚的所有IM系统传输即时信息无外乎使用UDP、TCP、基于TCP的http这三种协议中的一种或三种。比如QQ重要接纳UDP协议,MSN首要采纳TCP协议,而且她们也都援助HTTP协议的代办情势。更多材料,请列席这篇著作《一些常用软件的网络端口协议分类介绍》

有的是商厦之所以选拔Windows(.NET)平台来构建网站和图表服务器,很大部分由创始团队的技术背景决定的,早期的技术人士可能更了然.NET,或者社团的公司管理者认为Windows/.NET的易用性、“短平快”的开销形式、人才基金等地点都相比符合创业初期的集团,自然就接纳了Windows。先前时期工作发展到早晚范围,也很难轻易将完整架构迁移到其他开源平台上了。当然,对于构建大规模互联网,更提出首选开源架构,因为有成百上千成熟的案例和开源生态的支撑(也会有为数不少坑,就看是你协调第一去踩坑,如故在别人踩了修复之后您再用),避免重复造轮子和付出高额授权费用。对于迁移难度较大的采纳,个人相比推荐Linux、Mono、Jexus、Mysql、Memcahed、Redis……混搭的架构,同样能支撑具有高并发访问和天数据量等特点的互联网使用。

咱们该怎么挑选吧?

单机时代的图纸服务器架设(集中式)

草创一代由于时间紧急,开发人员水平也很有限等原因。所以一般就径直在website文件所在的目录下,建立1个upload子目录,用于保存用户上传的图纸文件。假若按工作再分开,可以在upload目录下再建立不同的子目录来分别。例如:upload\QA,upload\Face等。

在数据库表中保存的也是”upload/qa/test.jpg”这类相对路径。

用户的访问格局如下:

http://www.yourdomain.com/upload/qa/test.jpg

先后上传和写入措施:

程序员A通过在web.config中安排物理目录D:\Web\yourdomain\upload 
然后通过stream的不二法门写入文件;

程序员B通过Server.MapPath等艺术,按照相对路径获取物理目录 
然后也透过stream的办法写入文件。

优点:实现起来最简便易行,无需任何扑朔迷离技术,就能学有所成将用户上传的公文写入指定目录。保存数据库记录和访问起来倒是也很有益。

症结:上传模式混乱,严重不便于网站的壮大。

本着上述最原始的架构,紧要面临着如下问题:

  1. 随着upload目录中文件越来越多,所在分区(例如D盘)假设出现容量不足,则很难扩容。只可以停机后更换更大容量的存储设备,再将旧数据导入。
  2. 在安排新本子(部署新本子前透过需要备份)和一般性备份website文件的时候,需要同时操作upload目录中的文件,假使考虑到访问量上升,后面部署由多台Web服务器组成的负荷均衡集群,集群节点之间一旦做好文件实时同步将是个难题。

 

UDP研究实时性更好,但是什么处理安全可靠的传导并且处理不同客户端之间的音讯交互是个难题,实现起来过于复杂;

集群时代的图样服务器架设(实时同步)

在website站点下边,新建一个名为upload的虚拟目录,由于虚拟目录的八面玲珑,能在早晚水准上代表物理目录,并配合原有的图纸上传和做客模式。用户的拜访格局依然是:

http://www.yourdomain.com/upload/qa/test.jpg

亮点:配置更是灵活,也能配合老版本的上传和访问情势。

因为虚拟目录,可以针对本地任意盘符下的轻易目录。这样一来,还足以因此交接外置存储,来拓展单机的容量扩张。

症结:部署成由多台Web服务器组成的集群,各类Web服务器(集群节点)之间(虚拟目录下的)需要实时的去共同文件,由于一起效能和实时性的范围,很难保证某一天天各节点上文件是完全一致的。

主题架构如下图所示:

澳门美高梅手机网站 1

从上图可看出,整个Web服务器架设已经拥有“可扩充、高可用”了,紧要问题和瓶颈都汇聚在多台服务器之间的文书同步上。

上述架构中只好在这几台Web服务器上相互“增量同步”,这样一来,就不协理文件的“删除、更新”操作的一起了。

早期的想法是,在应用程序层面做决定,当用户请求在web1服务器举办上传写入的同时,也一路去调用别样web服务器上的上传接口,这肯定是得不偿失的。所以大家挑选采用Rsync类的软件来做定时文件同步的,从而节省了“重复造轮子”的血本,也下滑了风险性。

同步操作里面,一般有相比经典的两种模型,即推拉模型:所谓“拉”,就是指轮询地去取得更新,所谓推,就是暴发变更后主动的“推”给其余机器。当然,也足以利用加高级的事件通报机制来完成此类动作。

在高并发写入的情景中,同步都会产出频率和实时性问题,而且大量文件同步也是很耗费系统和带宽资源的(跨网段则更显然)。

HTTP协议属于增加帮忙,大家在产品的上马阶段可以毫不帮忙;

集群时代的图片服务器架设立异(共享存储)

套用虚拟目录的不二法门,通过UNC(网络路径)的不二法门实现共享存储(将upload虚拟目录指向UNC)

用户的走访形式1:

http://www.yourdomain.com/upload/qa/test.jpg

用户的拜访形式2(可以配备独立域名):

http://img.yourdomain.com/upload/qa/test.jpg

帮忙UNC所在server上安排独立域名指向,并安排轻量级的web服务器,来实现独立图片服务器。

亮点:
通过UNC(网络路径)的方法来拓展读写操作,能够制止多服务器之间同步相关的题目。相对来讲很灵巧,也匡助扩容/扩大。匡助配置成单身图片服务器和域名访问,也全部兼容旧版本的造访规则。

缺点
:然则UNC配置有些麻烦,而且会促成一定的(读写和安全)性能损失。可能会现出“单点故障”。如若存储级别没有raid或者更高级的灾备措施,还会招致数据丢失。

基本架构如下图所示:

澳门美高梅手机网站 2

在初期的众多基于Linux开源架构的网站中,假使不想一起图片,可能会拔取NFS来促成。事实讲明,NFS在高并发读写和海量存储方面,效能上设有必然问题,并非最佳的采用,所以大部分互联网集团都不会拔取NFS来落实此类应用。当然,也可以透过Windows自带的DFS来促成,缺点是“配置复杂,效率未知,而且贫乏资料大量的实际案例”。其余,也有局部合作社利用FTP或Samba来贯彻。

 

地点提到的两种架构,在上传/下载操作时,都经过了Web服务器(即便共享存储的这种架构,也足以安排独立域名和站点来提供图片访问,但上传写入仍旧得经过Web服务器上的应用程序来处理),这对Web服务器来讲确实是致使巨大的压力。所以,更提议利用独立的图片服务器和单身的域名,来提供用户图片的上传和做客。

这就非TCP协议莫属了,要考虑的一样也有众多,特别是只要有海量用户的需要。咋样保证单机服务器高并发量,怎样成功灵活,扩大的架构。

单身图片服务器/独立域名的功利

  1. 图片访问是很耗费服务器资源的(因为会提到到操作系统的上下文切换和磁盘I/O操作)。分离出来后,Web/App服务器可以更专注发挥动态处理的力量。
  2. 独立存储,更利于做扩容、容灾和数目迁移。
  3. 浏览器(相同域名下的)并发策略限制,性能损失。
  4. 做客图片时,请求信息中总带cookie音讯,也会招致性能损失。
  5. 福利做图片访问请求的负荷均衡,方便利用各个缓存策略(HTTP
    Header、Proxy Cache等),也越发惠及迁移到CDN。

……

 

大家可以运用Lighttpd或者Nginx等轻量级的web服务器来架构独立图片服务器。

Tips: QQ 为何采纳 UDP 协议,而不利用 TCP
协议落实?

当下的图片服务器架设(分布式文件系统+CDN)

在构建当前的图样服务器架设从前,可以先彻底吐弃web服务器,间接配置单独的图片服务器/域名。但面临如下的题材:

  1. 旧图片数据咋办?能否持续配合旧图片路径访问规则?
  2. 独自的图形服务器上需要提供单身的上传写入的接口(服务API对外宣布),安全题材如何保证?
  3. 同理,假诺有多台独立图片服务器,是采用可扩大的共享存储方案,依然采取实时同步机制?

 

以至应用级其它(非系统级) DFS(例如法斯特(Fast)DFS HDFS MogileFs
MooseFS、TFS)的风靡,简化了这些问题:执行冗余备份、帮助自动同步、协助线性扩充、补助主流语言的客户端api上传/下载/删除等操作,部分协理文件目录,部分补助提供Web的点子来拜访。

设想到各DFS的性状,客户端API语言援助意况(需要援助C#),文档和案例,以及社区的匡助度,我们最终采取了法斯特(Fast)(Fast)DFS来配置。

唯一的问题是:可能会不般配旧版本的造访规则。假如将旧图片三回性导入法斯特(Fast)DFS,但出于旧图片访问路径分布存储在不同工作数据库的相继表中,全体立异起来也极度困难,所以必须得十分旧版本的造访规则。架构升级往往比做全新架构更有难度,就是因为还要配合往日版本的题目。(给飞机在空间换引擎可比造架飞机难得多)

二.相应选取什么样格式的多寡协议

解决方案如下:

先是,关闭旧版本上传入口(制止后续使用导致数据不同等)。将旧图片数据经过rsync工具两回性迁移到独门的图片服务器上(即下图中描述的Old
Image
Server)。在最前端(七层代理,如Haproxy、Nginx)用ACL(访问规则控制),将旧图片对应URL规则的呼吁(正则)匹配到,然后将请求间接转接指定的web
服务器列表,在该列表中的服务器上布置好提供图片(以Web形式)访问的站点,并插足缓存策略。这样实现旧图片服务器的离别和缓存,兼容了旧图片的走访规则并升级旧图片访问效用,也防止了实时同步所带动的题材。

 

总体架构如图:

澳门美高梅手机网站 3

基于法斯特(Fast)DFS的独立图片服务器集群架构,即使已经丰裕的老到,但是由于国内“南北互联”和IDC带宽成本等题材(图片是相当消耗流量的),我们最后如故选项了商用的CDN技术,实现起来也非凡容易,原理其实也很简单,我那边只做个简易的介绍:

将img域名cname到CDN厂商指定的域名上,用户请求访问图片时,则由CDN厂商提供智能DNS解析,将多年来的(当然也恐怕有任何更复杂的政策,例如负载情状、健康情状等)服务节点地址重临给用户,用户请求到达指定的服务器节点上,该节点上提供了看似Squid/Vanish的代理缓存服务,倘诺是首先次呼吁该路线,则会从源站获取图片资源重回客户端浏览器,如若缓存中设有,则从来从缓存中得到并重临给客户端浏览器,完成请求/响应过程。

是因为拔取了商用CDN服务,所以我们并从未设想用Squid/Vanish来自行构建前置代理缓存。

澳门美高梅手机网站,地点的整套集群架构,可以很便利的做横向扩充,能满意一般垂直领域中大型网站的图样服务需求(当然,像taobao这样超大规模的或是另当别论)。经测试,提供图片访问的单台Nginx服务器(至强E5四核CPU、16G内存、SSD),对小静态页面(压缩后大约只有10kb左右的)可以扛住几千个并发且毫无压力。当然,由于图片本肢体积比纯文本的静态页面大过多,提供图片访问的服务器的抗并发能力,往往会受限于磁盘的I/O处理能力和IDC提供的带宽。Nginx的抗并发能力或者特别强的,而且对资源占用很低,尤其是拍卖静态资源,似乎都不需要有过多操心了。能够遵照实际访问量的需求,通过调整Nginx的参数,对Linux内核做调优,参预分级缓存策略等伎俩能够做更大程度的优化,也可以通过扩大服务器或者升级服务器配置来做扩张,最直白的是经过买进更高级的存储设备和更大的带宽,以满足更大访问量的急需。

值得一提的是,在“云统计”流行的立即,也推荐高速发展之间的网站,使用“云存储”这样的方案,既能帮您解决各项存储、扩大、备灾的题材,又能做好CDN加速。最根本的是,价格也不贵。

小结,有关图片服务器架设扩张,大致围绕这几个题目开展:

  1. 容量规划和扩充问题。
  2. 数据的一头、冗余和容灾。
  3. 硬件设备的资产和可靠性(是层见迭出固态硬盘,仍然SSD,或者更高端的存储设备和方案)。
  4. 文件系统的精选。依据文件特性(例如文件大小、读写比例等)选取是用ext3/4或者NFS/GFS/TFS这一个开源的(分布式)文件系统。
  5. 图表的增速访问。采纳商用CDN或者自建的代办缓存、web静态缓存架构。
  6. 旧图片路径和访问规则的兼容性,应用程序层面的可扩张,上传和走访的属性和安全性等。

二进制格式?文本格式?那多少个话题转到我的这篇著作《网络传输数据格式的取舍》,从我们脚下的需要和制品周期上我以为选取JSON形式的多寡协议是最好的。

三.架构设计

率先我们来提炼一下一个IM系统的第一需要,包括账号,关系链,在线状态展现,信息交互……。

架构考量

出于采纳可靠传输协议TCP,考虑到负载问题(短连接实现账号、关系链相关作业,长连接实现上线、信息推送);

后台架构的八面玲珑、可扩充性,襄助分布式部署——把网络层、业务逻辑层、数据层分离,网络层和业务层补助负载均衡策略、数据层扶助分布式存储;

客户端SDK的易用性:把网络层、数据层分离、业务逻辑层分离;

后台架构简化图

架构示意图

架构细化图

说明

从<架构细化图>中得以看看对于上线服务由于建立的是TCP长连接,对于单台服务器往往是因为硬件资源、系统资源、网络资源的限量无法成功海量用户的同时在线,所以计划为依据服务器负荷补助多服务器上线,同时鉴于多服务器上线造成了对所有类别相互(不同的客户端的互动,协作部门应用服务和客户的竞相)的剪切,引入信息转发服务器作为粘合点。其余对于多服务器上线造成的合并账户音讯(在线状态,音信)数据的划分,引入统一的数据层(内存存储层:session、状态信息囤积、音信队列存储;数据库:账号新闻存储)做到工作和数量的分手,也就完事了帮助分布式部署。参见我的这篇随笔《构建高性能服务的考量》

对此一些业务服务:做到网络层、业务层、数据层的一点一滴分开。首先对此TCP短连接来说不会如长连接这般消耗资源,尽管先前时期遭受海量的出现访问请求依旧得以从容的通过负载均衡策略和多少分布式部署策略举办缓解。参见我的这篇著作《服务端架构中的“网关服务器”》

服务端平台及技术选型

系统开发平台:
CentOS——Linux发行版的一种,稳定可靠、可定制优化、补助添加;

网络支撑层: libevent——减小开发成本,增强稳定性;

缓存存储层: Redis——协助添加的贮存结构,匡助分布式存储;

数据库: MySQL——最适合互联网的数据库,免授权、高效稳定、可控性高;

开发语言: C/C++;

一些热点问题考量

系统特性考量:

  • 编码角度:接纳连忙的网络模型,线程模型,I/O处理模型,合理的数据库设计和操作语句的优化;

  • 垂直扩大:通过增强单服务器的硬件资源或者网络资源来增长性能;

  • 水平扩张:通过合理的架构设计和运维方面的负荷均衡策略将负载分担,有效加强性能;先前时期甚至足以考虑投入数据缓存层,突破IO瓶颈;

系统的高可用性:(制止单点故障)

  • 在架构设计时形成业务处理和数据的分手,从而借助分布式的安排使得在单点故障时能保证系统可用。

  • 对此首要独立节点可以行使双机热备技术举行切换。

  • 数据库数据的安全性可以通过磁盘阵列的冗余配置和主备数据库来缓解。

要害学习资料: 请自行google。

《1.4亿在线背后的故事》;

《BasicDB的架构演化》;

《微信之道-至简》;

深信阅读之后,总会诱发的!

欢迎………….

发表评论

电子邮件地址不会被公开。 必填项已用*标注