# 热点处理

只需要加上@AkaliHot这个标注,任意方法均可以获得热点检测,并在热点期间用热点数据进行返回,在热点过后,又会自动调用原本业务逻辑。

举例:比如有一个商品查询的业务,传入SkuCode,返回商品信息。当某个商品进行促销时,访问的量就会增加,但是对于相同的SkuCode而言,其短时间窗口内返回的SkuInfo是一致的,我们的目标是当某个商品sku被大量查询时,框架能够在短时间内把这个商品sku提为热点数据,并通过对其进行缓存返回来降低对下游业务的压力。而当热点值过后,框架又能够自动摘除这个热点值,使其按照原有方式进行查询。

其本质相当于实时的监测了热点,并对其热点数据做了一个短时间内的缓存。

以下示例代表了:当相同的skuCode在5秒内超过50次调用时,会自动把这个skuCode的值提为热点,并用最后一次的返回值直接返回。当调用低于5秒50次调用时,框架会自动的摘除掉这个热点。使其正常的调用你原有代码进行逻辑计算并返回。这一切都是自动的。

@AkaliHot(grade = FlowGradeEnum.FLOW_GRADE_QPS, count = 50, duration = 5)
public SkuInfo getSkuInfo(String skuCode){
  //do your biz and return sku info
}

其中grade参数除了有以QPS作为维度统计,还有以Thread个数作为维度统计。比如:

@AkaliHot(grade = FlowGradeEnum.FLOW_GRADE_THREAD, count = 50, duration = 5)
public SkuInfo getSkuInfo(String skuCode){
  //do your biz and return sku info
}

这就代表了,如果某个skuCode在5秒之内有超过50个线程正在运行,那么就提为热点,并用热点数据直接返回。

# 热点缓存的更新

如果一个方法的参数被提为热点后,在1分钟内都将用热点数据返回。1分钟后如果你的热点依旧存在,那么会触发第二次热点,第二次热点会重新查询你的数据,并缓存起来。在第二分钟内会用这份数据进行返回。以此类推。

所以,请确保你的接口符合在短时间窗口内是能保证幂等性的,如果你的接口返回的数据每时每刻都在发生变化,那么Akali并不适合。这点很重要。

# 对RPC框架的支持度

支持任何RPC框架,诸如dubbo,open feign的provider端的热点处理。你完全可以把@AkaliHot标注在以上框架的provider端,标注在接口方法上或者实现类方法上均可以。

# 对于热点处理的一些忠告

尽量标注在一定时间范围内幂等的方法上,比如查询用户,查询订单等接口,这些接口方法在小范围时间窗口内是相对幂等的。

如果你标注在事务性操作的方法上,比如库存扣减,那么热点触发后,可能会造成业务的错乱。因为这些业务方法本来就不是幂等的。

所以使用之前要对业务进行考量,不能瞎用,这属于使用不当,而不是框架的责任。

Last Updated:  11/27/2023, 4:38:22 PM