一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
利用redis实现令牌桶限流
前文
本文主要内容为对于分布式系统限流的一种实现方案令牌桶的一种理解。通过redis中对于令牌的存储,保证分布式系统中各服务对于令牌的操作实现共享。以此方式利用令牌桶实现对于请求的限流。
什么是令牌桶
令牌桶是一种常用的限流算法。具体来讲,也就是我们有个令牌桶,而令牌桶决定了可以执行的请求。系统会以一个恒定的速率进行令牌桶令牌的放置。当请求到来时,需要首先查询以下是否当前有可用令牌。如果成功获取到令牌则请求继续执行,如果获取令牌失败则请求会被遗弃。而我们方案中的redis,也就是主要作为令牌桶限流方案中的桶的角色。
利用redis实现令牌桶
利用redis实现令牌桶的方案思路主要如上图所示:
首先初始化一个特定的线程,该线程为一个定时任务,从项目启动阶段开始执行,以恒定的速率向redis令牌桶中进行令牌的放置。需要注意的是,如果这里采用的分布式系统,当放置令牌的任务部署为多个是,需要注意采用分布式锁进行限制,不然会造成令牌产生速率异常的问题。放置的令牌同样有一个上限,达到上限后将暂停放置,直到令牌被再次获取。
再来看请求端,当请求到来时,首先到redis中进行令牌的获取。这里的令牌为了简单,我们可以直接存储为键值类型,值也就是当前令牌余量。首先会到redis中调用get(key)得到令牌值,如果大于0则进行减一操作,并将其重新存储到令牌桶之中。如果未获得令牌,则该请求会被遗弃。建议处理令牌的请求,写在网关层进行统一处理。以此方式也就能够达到令牌桶限流的目的。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。