首先说一下为何这两个月又没消息了,由于这两个月忙啊。算法
首先是接收上半年系统分析师的证书,并完成总结。其次是九月份PMP考试(4A经过,尚需努力),而后是十一月的软考高项的考试。工做的事情就不谈了,还好没什么私人事情须要处理。因此这两个月没什么空写博客,不过接下来应该会有一些时间来写博客。数据库
关于系统架构师这个分支,本来都打算完结了的。而后忽然发现你们对系统架构师的论文比较感兴趣,而且自从我上次透露了我有一个架构师/分析师的群后,陆陆续续不断有人私信我加群。因此,就回过头,再发一篇系统架构师的论文。并打算找时间,将本身系统分析师,PMP,项目管理师的知识整理出来。毕竟在过去的一年的时间,我连续经过系统架构师,系统分析师,PMP,并完成,参加了高项(虽然目前还不知道经过没),我认为个人学习方法,知识体系等仍是有必定做用的,但愿对你们有所帮助。嘻嘻。编程
哦。差点忘了。因为个人架构师/分析师群是邀请制的,因此给大家群号,也是没法添加的。因此,若是有参加架构师/分析师的朋友,请私聊我。谢谢。缓存
(强调一下,图片绝对清晰。若是看不清,请重新的页面打开,或者下载下来)服务器
摘要:
本人于2015年11月参与浙江省某在线教育平台“外教一对一在线教育”项目,该项目为客户提供了一对一欧美外教视频教学,社交圈,公众直播等功能提供全方位的软件支撑,在该项目组中我担任系统架构师岗位,主要负责总体架构设计与中间件选型。本文以该教育平台为例,主要讨论了该系统有关可靠性方面的设计与应用,以及遇到的问题与解决方案。一方面经过负载均衡进行容错技术中冗余设计的实现,另外一方面经过层次架构风格来明确系统结构体系,从而下降系统设计复杂度,提升系统可靠性。整个系统开发工做历时18个月。目前,该系统已经稳定运行近一年半的时间。实践证实,经过容错设计,下降复杂度设计等,系统有效提升了可靠性,从而为公司业务提供持续稳定的服务支撑。网络
正文:
随着国家对教育的愈加重视,英语教育的市场份额逐步上升,其中用户口语提高的需求愈来愈大。为此,一些公司开始提供与外国人聊天的平台。我所在公司决定从国际通信领域进军口语教育领域。为了这项战略转变,公司于2015年11月设计某在线教育平台系统(一下简称为“系统”)。该系统帮助人们与欧美外教进行面对面的口语交流和教学。其中随意聊提供了一种相似QQ视频通话,而正式课程还提供了H5互动课件与课后点评等,以提升教学质量。与此同时,还有公众直播用于拉新,AI测试用于评定学院能力,下降成本。我参与了该项目的开发工做,担任系统架构设计师职务,负责设计系统架构。本项目组全体成员共9人,我主要负责项目计划制定,需求分析,总体架构设计与技术选型,以及部分底层设计。该项目的架构工做与次年2月完成,选择了层次架构风格。整个项目耗时18个月,于2017年5月完成。
目前主流的可靠性设计技术有容错设计,检错设计,下降复杂度设计等技术。容错设计技术分为恢复块设计,N版本程序设计和冗余设计。其中恢复块设计是选择一组软件操做做为容错设计单元,将普通的程序块编程恢复块。N版本程序设计的核心是经过设计出多个模块或不一样版本,对于相同初始条件和相同输入的操做结果,实现多数表决,防止其中某一软件模块/版本的故障提供错误的服务,以实现软件容错。冗余设计是在一套完整的软件系统以外,设计一种不一样路径,不一样算法或不一样实现方法的模块或系统做为备份,在出现故障时可使用冗余的部分进行替换,从而维持软件系统的正常运行。缺点是费用和资源的消耗会有所增长。检错技术是在软件出现故障后能及时发现并报警。其缺点是不能自动解决故障。下降复杂度设计是由于软件复杂性与软件可靠性有着密切关系,是产生软件缺陷的重要根源。在设计时考虑下降软件的复杂性,是提升软件可靠性的有效方法。session
在了解系统需求后,咱们决定遵从公司技术顾问的建议,容错设计主要应用在冗余设计方面,经过负载均衡,双机容错等机制完成冗余设计。检错设计则是经过对Java异常处理机制的设计与封装处理完成。至于下降复杂度方面,采用层次架构风格,使得系统的结构明确,立体,从而提升系统可靠性。接下来,我将从系统的冗余设计,复杂度下降设计介绍可靠性在系统中的设计与应用,以及应用过程当中遇到的问题与解决方案。架构
1.冗余设计:负载均衡
首先说冗余设计,冗余包含逻辑冗余,数据冗余,应用冗余等。这里以应用冗余为例。为了提升系统的性能,可靠性,可拓展性等,咱们采用了负载均衡技术。常见的负载均衡技术有F5硬件,LVS软件,Nginx服务器配置等。出于便捷与成本的考虑,咱们采用了Nginx服务器配置负载均衡技术。经过对Nginx服务器中upstream模块的配置,就能够实如今多台服务器的反向代理家在负载均衡。采用负载均衡后,应用服务器集群存在Session问题没法统一的问题。解决方法有Session Sticky,Session Replication,Session数据集中存储,Cookie Based四个方案。Session Sticky是经过确保同一个会话的请求都在同一个Web服务器上处理实现。Session Replication是增长Web服务器间会话数据的同步来保证不一样Web服务器间的Session数据的一致。Cookie Based就是经过Cookie传递Session数据完成。通过考虑,咱们采用了Session数据集中存储。Session数据集中存储经过令每台服务器从专门的session服务器获取session数据来解决问题。优势是可靠性,可移植性与可拓展性的大幅提升。缺点是一方面读写Session数据引入了网络操做,对数据读取存在时延和不稳定性,但对于使用内网通讯的系统并无太大影响。另外一方面,若是Session服务器或集群出现问题,将会影响整个应用。咱们经过双机容错机制解决该问题。除此以外,还有心跳线,看门狗等技术。限于篇幅,再也不赘述。框架
2.下降复杂度设计:
再者就是下降复杂度设计,因为系统的复杂性和综合性,咱们决定采用层次架构风格,将系统架构分为接入层,应用层,服务层,数据层四个层次。这里以应用层与服务层为例。应用层分为视图层与业务逻辑层,视图层负责App与网站的表现效果,业务逻辑层负责业务层的逻辑处理。为了解决系统日益复杂,应用日益臃肿问题,咱们将系统按照应用横向划分,将系统划分为课件管理系统,课程管理系统等十余个子系统。如课件管理系统负责学员上课所用课件,有课件编辑,课件预览,课件交互等多个功能模块。功能模块需调用服务层的服务支撑,如课件交互模块须要调用stomp通讯服务,实现学生与老师间课件的交互功能。另外,课件交互模块经过对帐户服务的调用,确立课件双方的身份,从而明确双方在课件交互过程当中对课件交互部分的交互权限。该划分使得系统体系变得清晰明了,极大下降系统复杂度,提升系统可靠性。应用层采用基于J2ee的MVC框架-Structs框架,主要经过Servlet和JSP技术实现。另外还有动静分离,动态资源静态化等,这里再也不赘述。
服务层提供通用服务。系统在应用层中按照应用横向划分,有效下降系统复杂度。但系统代码仍然存在冗余,好比用户信息的调用在诸多应用子系统中都有相关模块。另外应用的大小依旧十分巨大,复杂,而太小的应用划分会增长数据库链接数负担,故咱们提出服务化解决方案。服务化方案就是提取出各个应用的通用服务,如帐户服务,Session服务等。出于技术成熟度与技术支持等考虑,咱们最终采用了阿里的dubbo服务框架,创建服务层。开发过程当中,产生了服务框架部署问题与实现服务框架的jar包和应用自身依赖的jar包冲突的问题。前者,咱们经过Tomcat做为Web容器,而服务框架做为容器的一部分来解决。后者,咱们经过Java的ClassLoader将服务框架自身用的类与应用的类进行隔离。除此以外,咱们经过服务线程池隔离,分布请求合并,服务调用端的流程控制来下降系统复杂度,提升系统可靠性。详情限于篇幅,再也不赘述。
最终项目成功上线,正常运行了近一年半,收到各方好评。尤为是H5课件的良好互动性,使得大量业界同行争相模仿,改用H5制做课件。还有咱们的服务化方案架构被做为许多传统互联网企业系统重构的经典方案。在系统的架构设计中,咱们引入了层次架构的设计思想,有效地下降了维护成本,提升了系统的开放性,可扩展性,可重用性以及可移植性。固然仍是存在一些问题的。如H5课件采用http协议,易被非法劫持,嵌入广告,能够将协议修改成https来解决。还有咱们采用的负载均衡算法是加权轮转算法,过于简单,经常出现资源分配不合理的现象,能够将算法改成加权最小链接数算法来解决。这些都是我在从此的系统设计和开发中须要注意与改进的地方,也是往后我应该努力的方向。
这篇论文的项目,依旧是以前那片论文的项目-在线教育系统。可是其中不少技术,其实在原有项目中是没有涉及的。
另外这篇论文与以前论文存在一个结构上的不一样之处,那就是此次的核心论点只有两个分论点。不过,第二个论点-下降复杂度设计,是经过两个方面进行阐述的。这也算是论文中核心论点的一种回答方式。每每论文的核心论点,推荐使用三个分论点进行论述,而部分论文的核心论点就只能拆分为两个分论点(或者,三个论点的拆分维度,本身不熟悉)。这时候就须要灵活的转变本身的思想,将核心论点的两个分论点氛围主次论点回答,实际体现就是主论点两个段落,次论点一个段落。
既然说到这里,也说一下,若是核心论点能够拆分出多个分论点。如架构风格的层次架构彻底能够拆分为接入层,应用层,服务层(基础服务层,通用服务层,业务服务层),数据接入层,数据源等。那么这种状况,咱们彻底能够从中挑选三点本身熟悉的部分,进行阐述。若是担忧这样写,文章显得比较僵硬,就在相关位置写上“此处,咱们以XXX,XXX,XXX为重点,进行论述"这样的话语便可。
早期未修改的论文:
摘要:
本人于2015年11月参与浙江省某在线教育平台“外教一对一在线教育”项目,该项目为客户提供了一对一欧美外教视频教学,社交圈,公众直播等功能提供全方位的软件支撑,在该项目组中我担任系统架构师岗位,主要负责总体架构设计与中间件选型。本文以该教育平台为例,主要讨论了该系统有关可靠性方面的设计与应用。一方面经过负载均衡与应用服务器集群实现容错技术中冗余设计的实现,另外一方面经过创建了接入层,应用层,服务层,数据层四层层次的架构来下降明确系统结构,从而系统设计复杂度,提升系统可靠性。整个系统开发工做历时18个月。目前,该系统已经稳定运行近一年半的时间。实践证实,经过容错设计,下降复杂度设计等,系统有效提升了可靠性,从而为公司业务提供持续稳定的服务支撑。
正文:
随着国家对教育的愈加重视,英语教育的市场份额逐步上升,其中用户口语提高的需求愈来愈大。为此,一些公司开始提供与外国人聊天的平台。我所在公司决定从国际通信领域进军口语教育领域。为了这项战略转变,公司于2015年11月设计某在线教育平台系统(一下简称为“系统”)。该系统帮助人们与欧美外教进行面对面的口语交流和教学。其中随意聊提供了一种相似QQ视频通话,而正式课程还提供了H5互动课件与课后点评等,以提升教学质量。与此同时,还有公众直播用于拉新,AI测试用于评定学院能力,下降成本。我参与了该项目的开发工做,担任系统架构设计师职务,负责设计系统架构。本项目组全体成员共9人,我主要负责项目计划制定,需求分析,总体架构设计与技术选型,以及部分底层设计。该项目的架构工做与次年2月完成,选择了层次架构风格。整个项目耗时18个月,于2017年5月完成。
目前主流的可靠性设计技术有容错设计,检错设计,下降复杂度设计等技术。容错设计技术分为恢复块设计,N版本程序设计和冗余设计。其中恢复块设计是选择一组软件操做做为容错设计单元,将普通的程序块编程恢复块。N版本程序设计的核心是经过设计出多个模块或不一样版本,对于相同初始条件和相同输入的操做结果,实现多数表决,防止其中某一软件模块/版本的故障提供错误的服务,以实现软件容错。冗余设计是在一套完整的软件系统以外,设计一种不一样路径,不一样算法或不一样实现方法的模块或系统做为备份,在出现故障时可使用冗余的部分进行替换,从而维持软件系统的正常运行。缺点是费用和资源的消耗会有所增长。检错技术是在软件出现故障后能及时发现并报警。其缺点是不能自动解决故障。下降复杂度设计是由于软件复杂性与软件可靠性有着密切关系,是产生软件缺陷的重要根源。在设计时考虑下降软件的复杂性,是提升软件可靠性的有效方法。
在了解系统需求后,咱们决定遵从公司技术顾问的建议,在容错设计,检错设计,下降复杂度设计三个主流方向分别做出相应处理和应用。容错设计主要应用在冗余设计方面,经过负载均衡,双机容错等机制完成冗余设计。检错设计则是经过对Java异常处理机制的设计与封装处理完成。至于下降复杂度,咱们应用层次清晰的四层层次架构。经过将系统划分为接入层,应用层,服务层,数据层,使得系统的结构明确,立体,从而下降系统复杂度。限于篇幅,接下来,我将从系统的冗余设计,复杂度下降设计两个方面介绍可靠性在系统中的设计与应用,以及应用过程当中遇到的问题。
首先说冗余设计,冗余包含逻辑冗余,数据冗余,应用冗余等。这里以应用冗余为例。一方面为了提升应用服务器性能,另外一方面为了提升系统的可靠性,可拓展性等,咱们采用了负载均衡技术。常见的负载均衡技术有F5硬件,LVS软件,Nginx服务器配置等。出于便捷与成本的考虑,咱们采用了Nginx服务器配置负载均衡技术。经过对Nginx服务器中upstream模块的配置,就能够实如今多台服务器的反向代理家在负载均衡。为了提升负载均衡服务器可靠性,咱们采用双机热备机制。但采用负载均衡后,应用服务器集群出现了Session问题没法统一的问题。解决方法有Session Sticky,Session Replication,Session数据集中存储,Cookie Based四个方案。Session Sticky是经过确保同一个会话的请求都在同一个Web服务器上处理实现。Session Replication是增长Web服务器间会话数据的同步来保证不一样Web服务器间的Session数据的一致。但一方面同步Session数据会形成网络带宽的开销。另外一方面,每台Web服务器都要保存全部Session数据,消耗大量内存。通过考虑,咱们采用了第三种方案-Session数据集中存储。Session数据集中存储经过令每台服务器从专门的session服务器获取session数据来解决问题。优势是可靠性,可移植性与可拓展性的大幅提升。缺点是一方面读写Session数据引入了网络操做,对数据读取存在时延和不稳定性,但对于使用内网通讯的系统并无太大影响。另外一方面,若是Session服务器或集群出现问题,将会影响整个应用。咱们经过双机容错机制解决该问题。Cookie Based就是经过Cookie传递Session数据完成。实现简单,可是存在如Cookie长度限制等问题。除此以外,还有心跳线,看门狗等诸多技术。限于篇幅,再也不赘述。
再者就是下降复杂度设计,咱们从架构风格选择,技术选型等角度实现。因为系统的复杂性和综合性,咱们决定采用层次架构风格,将系统架构分为接入层,应用层,服务层,数据层四个层次。接入层负责多平台的接入,以及API网关,负载均衡等方面。API网关的使用使得对外资源与服务得到统一,保持系统结构的明确,从而提升了系统可靠性。应用层分为视图层与业务逻辑层,视图层负责App与网站的表现效果,业务逻辑层负责业务层的逻辑处理。为了解决系统日益复杂,应用日益臃肿问题,咱们将系统按照应用横向划分,将系统划分为课件管理系统,课程管理系统等十余个子系统。这样的划分使得系统体系变得清晰明了,极大下降系统复杂度,提升系统可靠性。应用层采用基于J2ee的MVC框架-Structs框架。服务层提供通用服务。系统在应用层中按照应用横向划分,有效下降系统复杂度。但系统代码仍然存在冗余,好比用户信息的调用在诸多应用子系统中都有相关模块。另外应用的大小依旧十分巨大,复杂,而太小的应用划分会增长数据库链接数负担,故咱们提出服务化解决方案。服务化方案就是提取出各个应用的通用服务,如帐户服务,Session服务等。出于技术成熟度与技术支持等考虑,咱们最终采用了阿里的dubbo服务框架,创建服务层。数据层涉及缓存,文件系统,数据库,数据通知服务,搜索系统等模块。因为用户对数据访问具备集中性,故咱们基于Spring Cache与Redis实现缓存机制。数据访问方面,Java已经有不少成熟技术,大体分为专用API方式,JDBC方式,给予ORM或类ORM接口方式三种。最终咱们采用了成熟的ORM框架-Mybatis框架,再将框架包装一层。这样一方面提升系统开发效率,另外一方面提升系统可移植性与可靠性。除此以外,还采用了solr做为数据层搜索引擎,数据访问层物理部署采用Proxy方式。限于篇幅,再也不赘述。
最终项目成功上线,正常运行了近一年半,收到各方好评。尤为是H5课件的良好互动性,使得大量业界同行争相模仿,改用H5制做课件。还有咱们的服务化方案架构被做为许多传统互联网企业系统重构的经典方案。在系统的架构设计中,咱们引入了层次架构的设计思想,有效地下降了维护成本,提升了系统的开放性,可扩展性,可重用性以及可移植性。固然仍是存在一些问题的。如H5课件采用http协议,易被非法劫持,嵌入广告,能够将协议修改成https来解决。还有咱们采用的负载均衡算法是加权轮转算法,过于简单,经常出现资源分配不合理的现象,能够将算法改成加权最小链接数算法来解决。这些都是我在从此的系统设计和开发中须要注意与改进的地方,也是往后我应该努力的方向。