KANG's BLOG

Let's have some fun

分布式限流算法及方案介绍

业务场景 现代互联网很多业务场景,比如秒杀、下单、查询商品详情,最大特点就是高并发,而往往我们的系统不能承受这么大的流量,继而产生了很多的应对措施:CDN、消息队列、多级缓存、异地多活。 但是无论如何优化,终究由硬件的物理特性决定了我们系统性能的上限,如果强行接收所有请求,往往造成雪崩。 这时候限流熔断就发挥作用了,限制请求数,快速失败,保证系统满负载又不超限。 极致的优化,就是将硬件使用率提高到100%,但永远不会超过100% 常用限流算法 计数器 直接计数,简单暴力,举个例子: 比如限流设定为1小时内10次,那么每次收到请求就计数加一,并判断这一小时内计数是否大于上限10,没超过上限就返回成功,否则返回失败。 这个算法的缺点就是在时间临界点会有较大瞬间流量。

Hystrix熔断器的使用

一、Hystrix使用样例: Feign中默认集成了Hystrix,可以通过@FeignClient注解标记资源并使用配置文件或API对资源进行设置,这里介绍Hystrix原生设置和使用方式 maven坐标: <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.8</version> </dependency> 原生Hystrix的command定义方式: // 定义一个Command继承HystrixCommand public class HelloWorldHystrixCommand extends HystrixCommand { private final String name; public HelloWorldHystrixCommand(String name) { super(HystrixCommandGroupKey.

Sentinel - 分布式系统的流量哨兵

Sentinel - 分布式系统的流量哨兵 介绍 sentinel是阿里开源的分布式流控组件,支持Dubbo、Servlet、Spring Boot / Cloud、gRPC等扩展方式,提供了流量控制、熔断降级、系统负载保护等措施来保障服务稳定。 Sentinel极为轻量,仅有200k,且无过多依赖。性能方面,25wQPS下不会对性能产生显著影响。 GitHub: https://github.

lua脚本实现令牌桶

通过lua脚本实现原子操作 令牌桶实现 local ratelimit_info=redis.pcall("HMGET",KEYS[1],"last_mill_second","curr_permits","max_burst","rate","app") local last_mill_second=ratelimit_info[1] local curr_permits=tonumber(ratelimit_info[2]) local max_burst=tonumber(ratelimit_info[3]) local rate=tonumber(ratelimit_info[4]) local app=tostring(ratelimit_info[5]) if app == nil then return 0 end local local_curr_permits=max_burst; if(type(last_mill_second) ~='boolean' and last_mill_second ~=nil) then local reverse_permits=math.