背景

《我们的应用系统是如何支撑千万级别用户的》随笔中已经从“宏观”角度去介绍了整个应用系统的布局。组件化是整个系统由头到尾都始终坚持的一个设计原则,其中“SOA组件化容器”也是我们应用系统比较特别的一点。好东西肯定要分享,当然,这个好还只停留在自恋当中。

主题

上图为整个SOA容器(即WEB容器)的透析图。其中各个(黄色)组件的执行流程就是整条业务线程的执行流程。例如在我们应用系统中主要包括会话组件、安全拦截组件、业务验证组件、业务解析组件、业务服务组件、业务响应组件、日志组件等。也就是这些组件组成了整个业务线程的生命周期。接下来对SOA容器的各个组成部分进行一一介绍。

SOA组件配置文件

配置文件就是组件执行引擎的依赖,有点类似于Spring配置文件的概念,下面是配置文件的一个例子:

<?xml version="1.0" encoding="UTF-8"?>

<soabean  id=”session”  class=”com.soa.session”  order=”1”/>

<soabean  id=”security”  class=”com.soa. security”  order=”2”/>

<soabean  id=”validate”  class=”com.soa.validate”  order=”3”/>

<soabean  id=”analysis”  class=”com.soa.analysis”  order=”4”/>

<soabean  id=”service”  class=”com.soa.service”  order=”5”/>

<soabean  id=”response”  class=”com.soa.response”  order=”6”/>

<soabean  id=”logger”  class=”com.soa.logger”  order=”7”/>

其中soabean为SOA容器组件,id为组件的唯一标识,class为组件的类路径,order为组件的执行顺序。

SOA组件执行引擎

执行引擎就是整个SOA组件容器的发动机,容器初始化时需要加载SOA组件配置文件信息并通过反射生成各组件实例根据序号(order)依序存放在SOA组件单例队列容器里。当业务请求到达SOA容器时,执行引擎循环执行单例队列容器里面的组件。

/*伪代码*/

Loop singleSOABeanList:  //循环组件单例队列容器

SOABean.handle();  //组件执行

SOA组件单例队列容器

这是一个存放着SOA组件实例的单例队列容器,队列的顺序依赖于配置文件的order值,按队列容器按order值升序排序,order值越小的组件越优先执行。

ThreadLoal(线程本地变量)

这是整个线程生命周期的本地变量,主要存储的是会话信息,而这个会话信息就是各组件解耦的关键所在,贯穿了所有组件的执行。会话信息主要包含着以下字段:

Class Session{

serssionId     //会话标识

seviceName   //请求服务标识,如SOA_001_001,可自定义业务规则

retCode      //业务响应标识

retDesc      //业务响应描述

isGone=true  //线程主流程执行信号(true/false)

soaLogger    //SOA容器组件日志跟踪器

reqJson      //请求参数报文

respJson     //响应参数报文

HTTPRequest实例

HTTPRespone实例

Userinfo      //用户信息

……

}

此会话跟HTTP会话的作用是一样的,主要是维护用户不同请求的关联关系,同时还是各组件的解耦的关键所在。

SOA组件

上图中的黄色组件为各SOA容器的业务组件,业务组件需要实现SOA组件接口。

public interface SOAInterface {

public void handle();

}

组件是一个独立体,必须管理好自己所以异常信息,可通过会话实体记录和跟踪会话的运行情况。组件又分为主流程组件和辅助组件,主流程组件是通过会话的线程主流程执行信号(isGone来跟踪主业务流程的执行情况,如果某主业务流程组件发生异常或业务失败,则通过session.setIsGone = false告诉后续的主流程组件不需要执行了:

/*主流程组件伪代码*/

Class SubGroup implement SOAInterface(){

try{

If(session.isGone){

operations

If(operation false){

session.setIsGone = false;

}

}

}catch(Exception e){

session.setExceptionLog;

session.setIsGone = false;

}

}

在我们应用中,主流程组件有会话组件、请求解析组件、业务处理组件、请求业务响应组件等。而辅助组件有黑名单拦截组件,日志组件等。辅助组件的异常不会导致整条业务线程的奔溃,遇到异常,不会对主线程的运行标识(isGone)进行干预,以免影响整条主业务线程的正常服务。例如黑名单拦截,如果就因为黑名单组件异常失败,而停止系统所有业务对外提供服务,那有点说不过去。其实说白了,还是根据自己业务而定。对于一些比较敏感的系统组件,可以通过实时异常监控组件去跟踪来弥补日志异常信息监控缓慢的缺点。例如可以利用“发布订阅系统”:

/*会话记录组件异常信息伪代码*/

session.setExceptionLog(){

ExceptionLog;

PubSubMonitor.publish(exceptioninfo); //通过发布订阅监控组件实时监控

}

总结

不难理解,各个组件就是线程栈的组成部分。SOA组件化容器把整个业务请求流程的各个组成部分都封装成组件化形式执行,例如会话解析、请求参数解析、业务逻辑处理、请求业务响应、日志记录等业务主要流程。有利于系统日后的扩展性和维护性。这个SOA容器其实有点类似于企业服务总线(ESB)的概念,也同样支持类似Spring的AOP功能,毕竟在一条垂直的业务线程上,可通过组件配置文件在随意一个横切面插入其他操作组件。无论SOA容器组件还是服务层(SOA容器业务逻辑处理组件)的业务服务组件,都是通过反射实现生产单例使用,也有点类似于Spring的IOC概念。在这里我主要还是提供想法和思路,只有思路是通用的,还是建议思路+具体业务的实现才能发挥系统的最大性能。DIY过程最好不要脱离组件化和简单化的设计原则,当然,定义=限制,不同人都有不同的可能,欢迎评论交流。

 

千万用户级别应用系统背后的SOA组件化容器的更多相关文章

  1. 【PHP自定义显示系统级别的致命错误和用户级别的错误】

    使用方法set_error_handler可以自定义用户级别的错误和系统级别的错误信息显示和处理 用户级别的错误使用trigger_error方法产生一个用户级别的错误信息 代码示例: 系统级别的错误 ...

  2. Linux 管理环境变量的文件分为系统级和用户级别

    Linux 管理环境变量的文件分为系统级和用户级别 管理环境变量的文件也分为系统级和用户级别: 1.系统级:/etc/profile:该文件是用户登录时,操作系统定制用户环境时使用的第一个文件,应用于 ...

  3. 如何打造千万级Feed流系统

    from:https://www.cnblogs.com/taozi32/p/9711413.html 在互联网领域,尤其现在的移动互联网时代,Feed流产品是非常常见的,比如我们每天都会用到的朋友圈 ...

  4. 【Linux_Fedora_系统管理系列】_1_用户登录和系统初始配置

    发现一个问题,在FC14 的Firefox浏览器中,编辑和排版好的博文,在windows下用chrome或者猎豹浏览器打开后,排版就变得阅读 不是很容易里,而且经常不经意的断行.不知道园子的管理人员时 ...

  5. SHA-1退休:数千万用户通向加密网站之路被阻

    ​ Facebook和Cloudflare警告道:上千万用户将无法访问只使用SHA-2签名证书的HTTPS网站.2016年-2017年是SHA-1算法的缓冲期.2017年开始CA机构将不能颁发含有sh ...

  6. 深喉起底APP线下预装市场,如何一夜间拥有千万用户

    注:预装对于中国的移动互联网创业者有多重要?i黑马知道这样一个内幕,某商务告诉我他们公司的前2000万用户就是靠预装打下来的,总部在北京,直接派驻商务长期扎根在深圳搞定手机厂商.而这家公司初期发展得益 ...

  7. 网络设备 密码、用户级别 AAA授权 的管理

    一.进入 特权模式 密码 设置访问网络设备特权模式口令 cisco>enable cisco#config terminal cisco(config)#enable password 密码 e ...

  8. 用户视角 vs 系统视角 看性能

    如何评价性能的优劣: 用户视角 vs. 系统视角 对于最终用户(End-User)来说,评价系统的性能好坏只有一个字——“快”.最终用户并不需要关心系统当前的状态——即使系统这时正在处理着成千上万的请 ...

  9. Radius 远程用户拨号认证系统

    RADIUS 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . RADIUS:Remote Authentication Dial In User Service,远程用户拨号认证系 ...

随机推荐

  1. IOS 代码提示有问题

    Window(menu) -> Organizer(menu) -> Projects(tab) 删除 Derived Data ,立刻关闭xcode 然后重启xcode然后重新打开项目.

  2. 1 Java线程的内存可见性

    Java内存的可见性 可见性: 一个线程对共享变量的修改,能够及时被其它线程看到 共享变量: 如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量 Java内存模型(JM ...

  3. pl/sql中文乱码问题解决

    最近用pl/sql连我们公司的数据库,发现表里的中文数据都是“???”,上网查了一下,发现是数据库的编码格式和pl/sql的编码格式不统一造成的. 解决方法非常简单,只要创建一个系统环境变量:NLS_ ...

  4. SVM系列之拉格朗日对偶

    在学习SVM(Support Vector Machine) 支持向量机时,对于线性可分的分类样本求出的分类函数为: 其中,分类超平面可以表示为:

  5. 时间管理的若干Tips

    时间管理的若干Tips 记下来 再好的记性也不如一支笔与一个本子. 买一支好点的笔于一个好点的本子,让自己有书写的欲望,将todo事项记下来. 小目标 太大太远的目标会使人气馁.通过将大目标分解再分解 ...

  6. 《uml大战需求分析》阅读笔记05

    <uml大战需求分析>阅读笔记05 这次我主要阅读了这本书的第九十章,通过看这章的知识了解了不少的知识开发某系统的重要前提是:这个系统有谁在用?这些人通过这个系统能做什么事? 一般搞清楚这 ...

  7. Java EE 和 Java Web

    什么是 Java Web 应用程序? Java Web 应用程序会生成包含各种类型的标记语言(HTML 和 XML 等)和动态内容的交互式 Web 页.它通常由 Web 组件组成(如 JavaServ ...

  8. js创建对象的方法

    1. 使用Object构造函数来创建一个对象,下面代码创建了一个person对象,并用两种方式打印出了Name的属性值. var person = new Object(); person.name= ...

  9. Android adb命令 一

    adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.adb的工作方式比 ...

  10. 多进程模块multiprocessing的使用

    该模块提供如下功能: 建立并管理运行指定函数的子进程 基本接口: 1 Process(group, target, name, args[, kwargs]): 初始化子进程对象 2 p.daemon ...