-
Notifications
You must be signed in to change notification settings - Fork 128
SDS的详细设计
SDS设计初衷是提供一个简单、易用的降级工具,它需要提供一个jar,我们业务系统只要依赖它,使用其API,就可以使用常见的限流、熔断和降级功能,当然,它还需要有一个控制台,因为我们需要动态调整限流、熔断策略。所以,其实SDS可以说是由一个执行策略、上报数据的jar和一个可配置策略、查看数据的远程控制台两部分构成。
大家都知道限流的其实就是流量控制,熔断指的是当达到某个条件时,为了自保,会进行断流(参见:https://martinfowler.com/bliki/CircuitBreaker.html ),而降级一般指服务降级,即当达到某个条件时,我们主动或自动的把一些非核心服务降级掉,保证核心服务有足够资源能可靠运行,一般的服务降级都是有损的。为了简单起见,
之所以提及这三个词,是因为这都是SDS的核心能力,为了简单起见,在本文中,我们用降级来泛指这些能力。
这里我们再介绍下和SDS相关一些重要概念。
应用&系统&模块:为了描述方便,本文所说的应用、系统和模块,是类似的概念,指的是可以独立部署的一组服务的集合,即一个Java进程。
应用组:很多公司都有多条业务线,每条业务线可能都会有自己独立的一套业务系统(或应用),比如订单、支付、用户系统,为了方便每条业务线单独管理自己的系统,SDS中有了应用组这一个概念,所以不同应用组内应用的名称可以相同,应用名称只需要保证再其所属的应用组内唯一就行。
降级点:降级点其实就是一个字符串,是SDS给某个资源(比如某个方法、某一行代码)的唯一标识,SDS的职责就是为这个资源提供流控、降级等能力。我们只需要保证降级点这个字符串在应用内唯一就行。
降级点策略:或者我们简称策略,指包含降级相关参数的集合,一个降级点在拿到自己的降级点策略后才能具备降级能力,这一切都是在SDS的jar来做的,当然,我们是在SDS的控制台来配置这些策略。这同时也意味着一个降级策略肯定会归属于一个降级点。
降级预案:或者我们简称预案,预案的本意是指根据评估分析或经验对潜在的或可能发生的突发事件所制定应急处置方案,而在服务端也有类似的道理,当我们发现当前的处置方案无法解决问题时(对于SDS来说就是当前应用内降级点策略无法解决当前问题时),我们会将问题级别升一级,用更高一级或更严一级的预案来应对(对于SDS来说就是批量切换应用内降级点使用的策略,前提是我们给降级点准备了多个策略),前面在介绍降级点策略时提到一个策略一定会归属于某个降级点,那么也意味着我们可以给一个降级点提前配置好多个策略(但某一时刻,我们只可以给降级点使用一个策略,即降级点的当前策略),所以在SDS中我们也有预案的概念,用来代表应用中降级点和归属于它的某个策略的影射关系的集合。
如果上面说了那么多还不能让你明白这些关键概念的话,那么我们从SDS控制台的操作流程来阐述可能会对你有所帮助。通俗的讲,我们初次使用SDS时,在SDS控制台需要做如下操作:
- 新建【应用组】,例如“两轮车事业部”。
- 在“两轮车事业部”应用组下新建【应用】,例如“order”。
- 在应用order下新建两个【预案】,例如“订单系统风控依赖降级一级预案”和“订单系统风控依赖降级二级预案”。
- 在应用order下新建“createOrderRiskCheckPoint”、 “startOrderRiskCheckPoint”和“closeOrderRiskCheckPoint”三个【降级点】(我们假设三个降级点在order中已经使用)。
- 在“订单系统风控依赖降级二级预案”下给降级点“createOrderRiskCheckPoint”和“startOrderRiskCheckPoint” 分别添加一个【降级点策略】。
- 在“订单系统风控依赖降级一级预案”下给降级点“createOrderRiskCheckPoint”、“startOrderRiskCheckPoint”和“closeOrderRiskCheckPoint” 分别添加一个【降级点策略】。
- 以上步骤做完后,order系统中的虽然已经使用了这三个降级点,但我们还没有给它们设置策略,所以它们还不能产生降级行为。这是,我们给应用order设置其【当前预案】设置为“订单系统风控依赖降级二级预案”,那么order系统中的“createOrderRiskCheckPoint”、“startOrderRiskCheckPoint”两个降级点就能拿到我们在第5步中给它们设置的策略。
- 同理,如果我们将应用order的【当前预案】设置为“订单系统风控依赖降级一级预案”,那么order系统中的这三个降级点就能拿到我们在第6步中给它们设置的策略。
如上所述,我们能够通过修改【应用】的【当前预案】来做到快速、批量的切换【降级点】所使用的【当前策略】。
就如前面所说,SDS采用的是传统的C/S架构,只要Java应用依赖并使用了sds-client包,那么它就是一个SDS的客户端,sds-client中包含了限流、熔断和数据统计等功能。SDS-WEB作为Server端主要是为了配置降级策略、提供丰富的仪表盘并且保存客户端上传的统计数据、并应答最新的降级策略,如下图:
那么sds-client.jar是如何和sds-web进行交互的?SDS客户端每10秒钟向SDS服务端发送一次心跳,用于上传SDS客户端在最近一个完整周期(10秒)内的统计和降级数据,并从服务端拉取最新的降级点策略信息。值得注意的是,sds-client.jar的依赖比较少,只靠内存来统计数据,各客户端的数据在服务端才进行聚合展现,服务端借助客户端的心跳来分发最新的降级点策略。