Sentinel(https://github.com/alibaba/Sentinel)是一个限流组件。在互联网系统高可用设计中,限流作为一种托底的手段,保护系统不会被流量冲垮而出现未知的异常。
Sentinel系统的具体设计,可以参考官方文档,同时也可以参考 这个 , 这里只说一下大概的逻辑:
1. Sentinel限流算是是通过滑动窗口实现,滑动窗口算法可以有效解决计数器法的临界问题,关于限流的4种算法,可以参考 这里
2. Sentinel通过类似链表的方式,组装了N个solt(最新版本为8个), 这些slot各司其职,作用如下:
NodeSelectorSlot
负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;ClusterBuilderSlot
则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;StatisticsSlot
则用于记录,统计不同维度的 runtime 信息;SystemSlot
则通过系统的状态,例如 load1 等,来控制总的入口流量;AuthoritySlot
则根据黑白名单,来做黑白名单控制;FlowSlot
则用于根据预设的限流规则,以及前面 slot 统计的状态,来进行限流;DegradeSlot
则通过统计信息,以及预设的规则,来做熔断降级;
每个请求都会经过这些solt, 这些slot按照指定的顺序放入到SlotChain, 前3个用于统计,后面4个根据统计结果给出不同的操作,每个请求都会经过前面3个slot, 后面4个如果违反任何一个,都会通过抛出异常来短路返回。业务根据抛出的异常进行相应的处理。
sentinel除了本地模式,还有集群模式,这里就不细说
可以参考我的注解版 https://github.com/zhaoyb/Sentinel