分布式学习(二)

72 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

  • SpringCloud的限流zuul

  • 令牌桶:

    想象有一个木桶,系统按照固定速率,例如10ms每次,往桶里加入Token,如果桶已经满了就不再添加。新请求来临时,会各自拿走一个Token,如果没有Token 就拒绝服务。这里如果一段时间没有请求时,桶内就会积累一些token,下次一旦有突发流量,只要token足够,也能一次处理。

    总结下令牌桶算法的特点,令牌桶即可以控制进入系统的请求请求量,同时允许突发流

  • 漏桶

    限定流出的速度,请求放到桶里面去,如果满了,就终止服务。

  • 使用guava的RateLimiter类---只能单机使用,因为这个类只存在这个服务器上。redis集群部署(也是一主多从)会保证全局一致性。

    RateLimiter.tryAcquire(时间),等待获取令牌如果超过一定时间就结束请求。

    RateLimiter.acquire(),获取令牌。

  • **漏桶和令牌桶的区别:**从上面的例子估计大家也能看出来了,漏桶只能以固定的速率去处理请求,而令牌桶可以以桶子最大的令牌数去处理请求

  • redis实现:

    hmset rateLimit 
    last_ms 20 			-- 最后时间毫秒
    now_permits 20		-- 当前可用的令牌
    max_permits 40		-- 令牌桶最大数量
    rate 10    --1ms生成多少个令牌
    
    lua的逻辑是:
    if(last_ms == null){ // 如果没有记录上一次操作的时间 那么就是第一次请求
    	now_permits = max_permits - 1; // 初始化40个数量
        last_ms = CURRENT_TIME;
    } else { // 获取一个token
        now_permits = (CURRENT_TIME - last_ms) * 1000 * rate + now_permits;
        now_permits = Math.min(now_permits,max_permits);
        if(now_permits <=0 ) {
        	return false;
        }    
        now_permits--;
        return true ;
    }
    
  • redis的缓存击穿

    key过期了,然后大量的请求进来。

  • 分布式和集群:

    集群就是一台机干不了,我就搞两台机。--nginx进行负载均衡

    分布式是微服务,一个业务拆分成多个业务,分布在不同的服务器上。