`
jgsj
  • 浏览: 957698 次
文章分类
社区版块
存档分类
最新评论

项目日志2-系统降级模块设计

 
阅读更多

1.系统降级的概念

系统降级的是指当系统由于某种原因(可能是网络外部系统不稳定或程序内部bug导致)不稳定时,系统可以平滑的过渡到一个备选方案上来,使系统处于半可使用状态

2.为什么要做系统降级

当有新功能模块发布以后,一些隐藏较深的问题可能过一段时间才能展示出来,当这些问题发生而且会比较严重时,如果不及时对出问题的模块作操作,很可能导致大批的错误数据产生,而排查问题需要一定的时间的,如何将发现问题到解决问题过程中产生的错误数量降低到最低,这个就是系统降级需要处理的事情,可以简单的理解成一个个backup的功能点,当主功能点出现问题时,backup的功能点就可以上线了。举个简单的例子,一个商品页面新增了一个商品评价功能,这个反馈功能上线前无法预知可能出现的问题,当发现问题时需要及时的把评价入口给隐蔽掉--如评价入口遭到恶意攻击导致某段时间访问量骤增,或者恶意反馈过多,这个时候在不停机的前提下把入口给关掉是最快的解决途径。

3.降级的目标

1)不停机的前提下对系统作切换控制

2)能为排查问题和解决问题赢得时间

3)尽少的降低对用户的影响

3.系统降级如何实现

1)发掘降级点

系统开始前TL或架构师需要有意识去发觉系统的瓶颈点,如访问量比较大的页面,数据库查询比较多的地方,外部依赖接口的地方,对这些容易出错的地方进行整理归类

2)在程序中埋点

针对1)中的降级点在代码实现时在相应的逻辑中进行控制,添加控制逻辑

3)降级处理策略

在系统降级后希望系统给予怎样的响应,是应用直接跳转到一个错误提示页面去还是显示一个简洁版的用户输入界面还是直接绕过这段出错逻辑,这个就是具体的策略了

4)降级点管理

对于一个应用,理想的状态就是对系统中所有的降级点放在一起,便于查找和管理,我们这次项目里也是以这种方式来实现的,这也是模块化编程的很好实践

5)外部触发

设计好了降级点就要有外部的请求来触发才能实现降级,这个对于web应用来讲一般是通过设置一个单独的servlet,对外保留一个链接,然后通过这个连接传递不同的参数来实现对不同模块降级处理的逻辑

4.一个例子

设计一个统一的管理类,很简单,里面有个系统所有开关的map属性,key表示功能代码,value表示对该模块的降级是否启用,如下

将其配置到spring的配置文件中

系统掉用伪代码

if(demoteManager.getEnabled("createAppDemoteEnable")){

//降级后的业务逻辑-跳转到新页面

}else{

//正常的业务逻辑

}

外界的触发-servlet版本,核心思想在于通过该servlet暴露在外的url传递参数,如http://localhost/demote/?demoteModule=createAppDemote&value=true

servlet类中通过get方法获取demoteModule和value的值,然后spring中调用applicationContext.getBean("").setEnabled(createAppDemote,value);就可以达到动态修改bean属性的目的,因为spring中配置的bean都是单例的,所有一次修改后就一直常驻内存了

4.系统降级的风险点

1)url方式暴露在外能够修改系统级别参数,是非常危险的--这个可以通过url设置白名单来实现

2)服务器集群时--当有多台服务器时必须在每台机器上都访问一下这个url,设置一次,否则只针对目前机器有效

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics