Java编程——服务器设计方案之应用限流

news/2024/7/5 19:21:28 标签: java, 大数据, 数据库

前言

在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。

比如最近就有个这样的需求,我作为客户端要向kafka生产数据,而kafka的消费者则再源源不断的消费数据,并将消费的数据全部请求到web服务器,虽说做了负载(有4台web服务器)但业务数据的量也是巨大的,每秒钟可能有上万条数据产生。如果生产者直接生产数据的话极有可能把web服务器拖垮。

对此就必须要做限流处理,每秒钟生产一定限额的数据到kafka,这样就能极大程度的保证web的正常运转。

其实不管处理何种场景,本质都是降低流量保证应用的高可用。

常见算法

对于限流常见有两种算法:

漏桶算法

令牌桶算法

漏桶算法比较简单,就是将流量放入桶中,漏桶同时也按照一定的速率流出,如果流量过快的话就会溢出(漏桶并不会提高流出速率)。溢出的流量则直接丢弃。

如下图所示:

这种做法简单粗暴。

漏桶算法虽说简单,但却不能应对实际场景,比如突然暴增的流量。

这时就需要用到令牌桶算法:

令牌桶会以一个恒定的速率向固定容量大小桶中放入令牌,当有流量来时则取走一个或多个令牌。当桶中没有令牌则将当前请求丢弃或阻塞。

相比之下令牌桶可以应对一定的突发流量.

RateLimiter实现

对于令牌桶的代码实现,可以直接使用Guava包中的RateLimiter。

调用结果如下:

代码可以看出以每秒向桶中放入两个令牌,请求一次消耗一个令牌。所以每秒钟只能发送两个请求。按照图中的时间来看也确实如此(返回值是获取此令牌所消耗的时间,差不多也是每500ms一个)。

使用有几个值得注意的地方:

允许先消费,后付款,意思就是它可以来一个请求的时候一次性取走几个或者是剩下所有的令牌甚至多取,但是后面的请求就得为上一次请求买单,它需要等待桶中的令牌补齐之后才能继续获取令牌。

总结

   针对于单个应用的限流够用了,如果是分布式环境可以借助Redis来完成。
    程序员学习交流群:878249276,欢迎一到五年的工程师加入,合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!复制代码

http://www.niftyadmin.cn/n/1383214.html

相关文章

apache虚拟主机配置

常用的配置&#xff1a; <VirtualHost *:80> ServerAdmin romyredidai.com DocumentRoot "D:/var/www/user_admin/" ServerName user_admin.redidai.com ErrorLog "logs/romy-redidai.com-error.log" CustomLog "logs/romy-redidai.com-access.…

利用 DBHelper实现登录功能

一&#xff0e; 用DBHelper 与mysql 连接 实现最简单的登录验证。 &#xff08;1&#xff09;连接好mysql数据库&#xff0c;如果无法连接&#xff0c;先打开mysql服务。新建一个数据库&#xff0c;名字为text&#xff0c;再新建一个数据表&#xff0c;名字为user&#xff0c;…

Session与Cookie底层原理

2019独角兽企业重金招聘Python工程师标准>>> 学习目录 1.会话入门 2.cookie 3.session 4.自定义缓存 5.自定义Token &#xff16;.表单重复提交&#xff08;Http重复提交&#xff09; 一、会话管理入门 1.2、软件中的会话 打开浏览器 -> 浏览商品列表 -> 加…

Maven下载慢的解决方案

2019独角兽企业重金招聘Python工程师标准>>> 在使用maven构建的项目中&#xff0c;打开pom文件&#xff0c;将maven仓库指定为国内阿里云提供的仓库地址 如下配置&#xff1a; <!--设置maven 仓库为阿里云提供的maven仓库 国外的maven仓库慢--><repositori…

160 为什么不建议varchar(256),而是varchar(255)

数据库中的 varchar(255) MySQL | ver < 4.1&#xff1a; VARCHAR以字节为单位存储&#xff0c;所以假设全部为常用汉字&#xff08;UTF-8 3字节编码长度&#xff09;&#xff0c;则VARCHAR(255)共可存放约85个汉字&#xff1b; MySQL | ver > 4.1&#xff1a; VARCH…

【有奖征文】怎样做好linux安全运维

怎样做好linux安全运维什么叫安全&#xff0c;概括为三大类数据&#xff08;信息&#xff09;安全运行&#xff08;系统&#xff09;安全物理&#xff08;实体&#xff09;安全那么怎么才算做到企业安全了数据&#xff08;信息&#xff09;安全 指数据库的安全这里我用的数据库…

MySQL运维案例分析:Binlog中的时间戳

摘要&#xff1a; 本文从一个典型的案例入手来讲述Binlog中时间戳的原理和实践&#xff0c;通过本文你可以了解时间戳在Binlog中的作用及产生方法&#xff0c;以便在出现一些这方面怪异的问题时&#xff0c;做到心中有数&#xff0c;胸有成竹。本文选自《MySQL运维内参》 背景 …

关于laravel的相关文章链接

296 laravel Excel V3.1 导出方法详解 295 laravel中获取控制器类名称和方法名称 293 Laravel给request变量赋值&#xff0c;追加参数&#xff0c;修改参数 290 laravel中的子查询 289 PHP闭包函数 280 laravel中的监听器和事件 275 ubuntu20.04安装laravel8 274 Larave…