阿里Sentine个人记录

阿里Sentine个人记录
这个方法是入口,里面会一路走下:
阿里Sentine个人记录
这里获取一个链条,上面是一个个的slot。会从一个hashmap里面通过最开始的ket去取,如果没有的话就会新建一个:
阿里Sentine个人记录
这里面放的就是那些关键的slot,说明一个key,一条链

每个slot里具体执行的东西看这个:https://www.jianshu.com/p/7936d7a57924

ResourceWrapper
sentinel 控制的对象即为资源,调用entry方法的时候会new 一个资源对象,资源由一个全局唯一的资源名称标识。
Context
sentinel 的处理的上下文,包含了上下文名称,一个调用链一个context,可以显示创建或者在调用entry的时候隐式创建。
Node
持有运行时的资源的各种统计数据。

一个 resource 在同一个Context 中有且仅有一个DefaultNode 与之对应
一个 resource 全局有且仅有一个ClusterNode

Entry
代表一次对资源的访问,每访问一个资源都会创建一个Entry,在context中以一个双向链表存在。
必须调用exit() 方法的原因就在于这个链表:exit方法中会判断上下文的当前 entry 是不是 this,此时其他entry掉用exit会发现不想等,从而抛出异常。

加入A方法里调用三个其他方法,那么就是一个context,三个entry。
如果B方法也调用那三个党法,那么现在就有两个context。然后这三个方法的总体会保存在clusterNode里,在走到statisticSlot的时候会进行线程数++和passCount++,用的atomicInteger

关于时间滑动窗口看这个:https://www.jianshu.com/p/6ee4b7bdb844
关于时间边界的问题,sentinel是把一秒默认拆分成两个500ms,个人觉得是不是有点少。。。
statisticSlot在计算线程数和QPS的时候,每个单独的chain会通过clusterNode来计算:
阿里Sentine个人记录
阿里Sentine个人记录

令牌桶和rateLimiter:https://blog.csdn.net/tianyaleixiaowu/article/details/74942405
下面这段话解释Sentinel里的rateLimit和warmUp
阿里Sentine个人记录
在Sentinel里的话,就是storePermits如果小于一定值,比如最大令牌数的一半,说明再提高QPS就有风险,那么就匀速的使用,所以叫warmUp,如果storePermit大于安全值里,说明空闲的令牌(storePermits)比较多,就可以加速QPS。
匀速算法的话就是链接里的解释,就是记住上次的请求时间,如果QPS=5的话,那么这个时间到下个1/5=200ms之间就不允许请求通过。
storePermit怎么算?: 下一次请求允许时间-当前时间 内的permits