网站热力图用ps怎么做福州如何做百度的网站
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:29
当前位置: 首页 > news >正文
网站热力图用ps怎么做,福州如何做百度的网站,嘉兴做营销型网站设计,wordpress 底部插件应用场景 现代互联网很多业务场景#xff0c;比如秒杀、下单、查询商品详情#xff0c;最大特点就是高并发#xff0c;而往往我们的系统不能承受这么大的流量#xff0c;继而产生了很多的应对措施#xff1a;CDN、消息队列、多级缓存、异地多活。 但是无论如何优化…应用场景 现代互联网很多业务场景比如秒杀、下单、查询商品详情最大特点就是高并发而往往我们的系统不能承受这么大的流量继而产生了很多的应对措施CDN、消息队列、多级缓存、异地多活。 但是无论如何优化终究由硬件的物理特性决定了我们系统性能的上限如果强行接收所有请求往往造成雪崩。 这时候限流熔断就发挥作用了限制请求数快速失败保证系统满负载又不超限。 极致的优化就是将硬件使用率提高到 100%但永远不会超过 100% 常用限流算法
- 计数器 直接计数简单暴力举个例子 比如限流设定为 1 小时内 10 次那么每次收到请求就计数加一并判断这一小时内计数是否大于上限 10没超过上限就返回成功否则返回失败。 这个算法的缺点就是在时间临界点会有较大瞬间流量。 继续上面的例子理想状态下请求匀速进入系统匀速处理请求 但实际情况中请求往往不是匀速进入假设第 n 小时 59 分 59 秒的时候突然进入 10 个请求全部请求成功到达下一个时间区间时刷新计数。那么第 n1 小时刚开始又打进 10 个请求等于瞬间进入 20 个请求肯定不符合 “1 小时 10 次” 的规则这种现象叫做 “突刺现象”。 为解决这个问题计数器算法经过优化后产生了滑动窗口算法 我们将时间间隔均匀分隔比如将一分钟分为 6 个 10 秒每一个 10 秒内单独计数总的数量限制为这 6 个 10 秒的总和我们把这 6 个 10 秒成为 “窗口”。 那么每过 10 秒窗口往前滑动一步数量限制变为新的 6 个 10 秒的总和如图所示 那么如果在临界时收到 10 个请求图中灰色格子在下一个时间段来临时橙色部分又进入 10 个请求但窗口内包含灰色部分所以已经到达请求上线不再接收新的请求。 这就是滑动窗口算法。 但是滑动窗口仍然有缺陷为了保证匀速我们要划分尽可能多的格子而格子越多每一个格子能够接收的请求数就越少这样就限制了系统瞬间处理能力。
- 漏桶 漏桶算法其实也很简单假设我们有一个固定容量的桶流速系统处理能力固定如果一段时间水龙头水流太大水就溢出了请求被抛弃了。 用编程的语言来说每次请求进来都放入一个先进先出的队列中队列满了则直接返回失败。另外有一个线程池固定间隔不断地从这个队列中拉取请求。 消息队列、jdk 的线程池都有类似的设计。
- 令牌桶 令牌桶算法比漏桶算法稍显复杂。 首先我们有一个固定容量的桶桶里存放着令牌token。桶一开始是空的token 以一个固定的速率往桶里填充直到达到桶的容量多余的令牌将会被丢弃。每当一个请求过来时就会尝试从桶里移除一个令牌如果没有令牌的话请求无法通过。 漏桶和令牌桶算法的区别 漏桶的特点是消费能力固定当请求量超出消费能力时提供一定的冗余能力把请求缓存下来匀速消费。优点是对下游保护更好。 令牌桶遇到激增流量会更从容只要存在令牌则可以一并消费掉。适合有突发特征的流量如秒杀场景。 限流方案 一、容器限流
- Tomcat tomcat 能够配置连接器的最大线程数属性该属性 maxThreads 是 Tomcat 的最大线程数当请求的并发大于 maxThreads 时请求就会排队执行 (排队数设置accept-count)这样就完成了限流的目的。 Connectorport8080protocolHTTP/1.1connectionTimeout20000maxThreads150redirectPort8443/2. Nginx Nginx 提供了两种限流手段一是控制速率二是控制并发连接数。 控制速率 我们需要使用 limit_req_zone 配置来限制单位时间内的请求数即速率限制示例配置如下 limit_req_zone \(binary_remote_addr zonemylimit:10m rate2r/s;第一个参数\)binary_remote_addr 表示通过 remoteaddr 这个标识来做限制“binary” 的目的是缩写内存占用量是限制同一客户端 ip 地址。 第二个参数zonemylimit:10m 表示生成一个大小为 10M名字为 one 的内存区域用来存储访问的频次信息。 第三个参数rate2r/s 表示允许相同标识的客户端的访问频次这里限制的是每秒 2 次还可以有比如 30r/m 的。 并发连接数 利用 limit_conn_zone 和 limit_conn 两个指令即可控制并发数示例配置如下 limit_conn_zone \(binary_remote_addr zoneperip:10m; limit_conn_zone \)server_name zoneperserver:10m; server { …limit_conn perip 10; # 限制同一个客户端iplimit_conn perserver 100; }只有当 request header 被后端处理后这个连接才进行计数 二、服务端限流
- Semaphore JUC 包中提供的信号量工具它的内部维护了一个同步队列我们可以在每个请求进来的时候尝试获取信号量获取不到可以阻塞或者快速失败 简单样例 Semaphore sp new Semaphore(3); sp.require(); // 阻塞获取 System.out.println(执行业务逻辑); sp.release();2. RateLimiter Guava 中基于令牌桶实现的一个限流工具使用非常简单通过方法 create() 创建一个桶然后通过 acquire() 或者 tryAcquire() 获取令牌 RateLimiter rateLimiter RateLimiter.create(5); // 初始化令牌桶每秒往桶里存放5个令牌 rateLimiter.acquire(); // 自旋阻塞获取令牌返回阻塞的时间单位为秒 rateLimiter.tryAcquire(); // 获取令牌返回布尔结果超过超时时间默认为0单位为毫秒则返回失败RateLimiter 在实现时允许暴增请求的突发情况存在。 举个例子我们有一个速率为每秒 5 个令牌的 RateLimiter 当令牌桶空了的时候如果继续获取一个令牌那么会在下一次补充令牌的时候返回结果 但如果直接获取 5 个令牌并不是等待桶内补齐 5 个令牌后再返回而是仍旧会在令牌桶补充下一个令牌的时候直接返回而预支令牌所需的补充时间会在下一次请求时进行补偿 public void testSmoothBursty() {RateLimiter r RateLimiter.create(5);for (int i 0; i 2; ) { System.out.println(get 5 tokens: r.acquire(5)s);System.out.println(get 1 tokens: r.acquire(1)s);System.out.println(get 1 tokens: r.acquire(1)s);System.out.println(get 1 tokens: r.acquire(1)s);System.out.println(end);} }/**
- 控制台输出
- get 5 tokens: 0.0s 初始化时桶是空的直接从空桶获取5个令牌
- get 1 tokens: 0.998068s 滞后效应需要替前一个请求进行等待
- get 1 tokens: 0.196288s
- get 1 tokens: 0.200391s
- end
- get 5 tokens: 0.195756s
- get 1 tokens: 0.995625s 滞后效应需要替前一个请求进行等待
- get 1 tokens: 0.194603s
- get 1 tokens: 0.196866s
- end */3. Hystrix Netflix 开源的熔断组件支持两种资源隔离策略THREAD默认或者 SEMAPHORE 线程池每个 command 运行在一个线程中限流是通过线程池的大小来控制的信号量command 是运行在调用线程中但是通过信号量的容量来进行限流 线程池策略对每一个资源创建一个线程池以进行流量管控优点是资源隔离彻底缺点是容易造成资源碎片化。 使用样例 // HelloWorldHystrixCommand要使用Hystrix功能 public classHelloWorldHystrixCommandextendsHystrixCommand{ private final String name; publicHelloWorldHystrixCommand(String name){ super(HystrixCommandGroupKey.Factory.asKey(ExampleGroup)); this.name name; } // 如果继承的是HystrixObservableCommand要重写Observable construct() Override protectedStringrun(){ return Hello name; } } 调用该 command String result new HelloWorldHystrixCommand(HLX).execute(); System.out.println(result); // 打印出Hello HLX Hystrix 已经在 2018 年停止开发官方推荐替代项目 Resilience4j 更多使用介绍可查看Hystrix 熔断器的使用
- Sentinel 阿里开源的限流熔断组件底层统计采用滑动窗口算法限流方面有两种使用方式API 调用和注解内部采插槽链来统计和执行校验规则。 通过为方法增加注解 SentinelResource(String name) 或者手动调用 SphU.entry(String name) 方法开启流控。 使用 API 手动调用流控示例 Test public void testRule() {// 配置规则.initFlowRules();int count 0;while (true) {try (Entry entry SphU.entry(HelloWorld)) {// 被保护的逻辑System.out.println(run count times);} catch (BlockException ex) {// 处理被流控的逻辑System.out.println(blocked after count);break;}} }// 输出结果 // run 1 times // run 2 times // run 3 times关于 Sentinel 的详细介绍可查看Sentinel - 分布式系统的流量哨兵 三、分布式下限流方案 线上环境下如果对共用资源如数据库、下游服务做统一流量限制那么单机限流显然不能满足而需要分布式流控方案。 分布式限流主要采取中心系统流量管控的方案由一个中心系统统一管控流量配额。 这种方案的缺点就是中心系统的可靠性所以一般需要备用方案在中心系统不可用时退化为单机流控。 \1. Tair 通过 incr 方法实现简单窗口 实现方式是使用 incr() 自增方法来计数并与阈值进行大小比较。 public boolean tryAcquire(String key) {// 以秒为单位构建tair的keyString wrappedKey wrapKey(key);// 每次请求1初始值为0key的有效期设置5sResultInteger result tairManager.incr(NAMESPACE, wrappedKey, 1, 0, 5);return result.isSuccess() result.getValue() threshold; }private String wrapKey(String key) {long sec System.currentTimeMillis() / 1000L;return key : sec; }【备注】incr 方法的参数说明 // 方法定义 Result incr(int namespace, Serializable key,int value,int defaultValue,int expireTime)/* 参数含义 namespace - 申请时分配的 namespace key - key 列表不超过 1k value - 增加量 defaultValue - 第一次调用 incr 时的 key 的 count 初始值第一次返回的值为 defaultValue value。 expireTime - 数据过期时间单位为秒可设相对时间或绝对时间Unix 时间戳。 */2. Redis 通过 lua 脚本实现简单窗口 与 Tair 实现方式类似不过 redis 的 incr() 方法不能原子性的设置过期时间所以需要使用 lua 脚本在第一次调用返回 1 时设置下过期时间为 1 秒。 local current current redis.call(incr,KEYS[1]) if tonumber(current) 1 then redis.call(expire,KEYS[1],1) end return current3. Redis 通过 lua 脚本实现令牌桶 实现思路是获取令牌后用 SET 记录 “请求时间” 和 “剩余 token 数量”。 每次请求令牌时通过这两个参数和请求的时间、流速等参数进行计算返回是否获取令牌成功。 获取令牌 lua 脚本 local ratelimit_info redis.pcall(HMGET,KEYS[1],last_time,current_token) local last_time ratelimit_info[1] local current_token tonumber(ratelimit_info[2]) local max_token tonumber(ARGV[1]) local token_rate tonumber(ARGV[2]) local current_time tonumber(ARGV[3]) local reverse_time 1000/token_rateif current_token nil thencurrent_token max_tokenlast_time current_time elselocal past_time current_time-last_timelocal reverse_token math.floor(past_time/reverse_time)current_token current_tokenreverse_tokenlast_time reverse_timereverse_tokenlast_timeif current_tokenmax_token thencurrent_token max_tokenend endlocal result 0 if(current_token0) thenresult 1current_token current_token-1 end redis.call(HMSET,KEYS[1],last_time,last_time,current_token,current_token) redis.call(pexpire,KEYS[1],math.ceil(reverse_time(max_token-current_token)(current_time-last_time))) return result初始化令牌桶 lua 脚本 local result1 redis.pcall(HMSET,KEYS[1],last_mill_second,ARGV[1],curr_permits,ARGV[2],max_burst,ARGV[3],rate,ARGV[4]) return result
- 上一篇: 网站让百度收录应该怎么做小学校园门户网站建设
- 下一篇: 网站认证医药公司网站模板
相关文章
-
网站让百度收录应该怎么做小学校园门户网站建设
网站让百度收录应该怎么做小学校园门户网站建设
- 技术栈
- 2026年03月21日
-
网站群信息管理系统合肥宣传片制作公司六维时空
网站群信息管理系统合肥宣传片制作公司六维时空
- 技术栈
- 2026年03月21日
-
网站群系统破解版胶州建设信息网站
网站群系统破解版胶州建设信息网站
- 技术栈
- 2026年03月21日
-
网站认证医药公司网站模板
网站认证医药公司网站模板
- 技术栈
- 2026年03月21日
-
网站容量如何删除在凡科上做的网站
网站容量如何删除在凡科上做的网站
- 技术栈
- 2026年03月21日
-
网站容量做淘宝客网站用什么系统吗
网站容量做淘宝客网站用什么系统吗
- 技术栈
- 2026年03月21日
