zuul隔离机制
文章转载自:https://blog.csdn.net/farsight1/article/details/80078099
ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常。查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高于100那么就拒绝服务了,返回500。
信号量隔离
既然默认值太小,那么就在gateway的配置提高各个路由的信号量再实验。
routes:
linkflow:
path: /api1/**
serviceId: lf
stripPrefix: false
semaphore:
maxSemaphores: 2000
oauth:
path: /api2/**
serviceId: lf
stripPrefix: false
semaphore:
maxSemaphores: 1000
两个路由的信号量分开提高到2000和1000。我们再用gatling测试一下。
setUp(scn.inject(rampUsers(200) over (3 seconds)).protocols(httpConf))
这是我们的模型,3s内启动200个用户,顺序访问5个API。所以会有1000个request。机器配置只有2核16G,并且是docker化的数据库。所以整体性能不高。

看结果仍然有57个KO,但是比之前1000个Request有900个KO的比例好很多了。
线程隔离
Edgware版本的spring cloud提供了另一种基于线程池的隔离机制。实现起来也非常简单,
zuul:
ribbon-isolation-strategy: THREAD
thread-pool:
use-separate-thread-pools: true
thread-pool-key-prefix: zuulgw hystrix:
threadpool:
default:
coreSize: 50
maximumSize: 10000
allowMaximumSizeToDivergeFromCoreSize: true
maxQueueSize: -1
execution:
isolation:
thread:
timeoutInMilliseconds: 60000
use-separate-thread-pools的意思是每个路由都有自己的线程池,而不是共享一个。thread-pool-key-prefix会指定一个线程池前缀方便调试。hystrix的部分主要设置线程池的大小,这里设置了10000,其实并不是越大越好。线程池越大削峰填谷的效果越显著,也就是时间换空间。系统的整体负载会上升,导致响应时间越来越长,那么当响应时间超过某个限度,其实系统也算是不可用了。后面可以看到数据。

这次没有500的情况了,1000个Request都正常返回了。
比较
从几张图对比下两种隔离的效果,上图是信号量隔离,下图是线程隔离。
响应时间分布


直观上能发现使用线程隔离的分布更好看一些,600ms内的响应会更多一些。
QPS


两张图展示的是同一时刻的Request和Response的数量。
先看信号量隔离的场景,Response per second是逐步提升的,但是达到一个量级后,gateway开始拒绝服务。猜测是超过了信号量的限制或是超时?
线程隔离的这张就比较有意思了,可以看到Request per second上升的速度要比上面的快,说明系统是试图接收更多的请求然后分发给线程池。再看在某个时间点Response per second反而开始下降,因为线程不断的创建消耗了大量的系统资源,响应变慢。之后因为请求少了,负载降低,Response又开始抬升。所以线程池也并非越大越好,需要不断调试寻找一个平衡点。
小结
线程池提供了比信号量更好的隔离机制,并且从实际测试发现高吞吐场景下可以完成更多的请求。但是信号量隔离的开销更小,对于本身就是10ms以内的系统,显然信号量更合适。
zuul隔离机制的更多相关文章
- Hibernate逍遥游记-第15章处理并发问题-001事务并发问题及隔离机制介绍
1. 2.第一类丢失更新 3.脏读 4.虚读.幻读 5.不可重复读 6.第二类丢失更新 7.数据库的锁机制 8.数据库事务的隔离机制
- Yarn的资源隔离机制
源调度和资源隔离是YARN作为一个资源管理系统,最重要和最基础的两个功能.资源调度由ResourceManager完成,而资源隔离由各个NodeManager实现,在文章“Hadoop YARN中内存 ...
- 理解MySql事务隔离机制、锁以及各种锁协议
一直以来对数据库的事务隔离机制的理解总是停留在表面,其内容也是看一遍忘一边.这两天决定从原理上理解它,整理成自己的知识.查阅资料的过程中发现好多零碎的概念假设串起来足够写一本书,所以在这里给自己梳理一 ...
- [MySQL数据库之事务、读现象、数据库锁机制、多版本控制MVCC、事务隔离机制]
[MySQL数据库之事务.读现象.数据库锁机制.多版本控制MVCC.事务隔离机制] 事务 1.什么是事务: 事务(Transaction),顾名思义就是要做的或所做的事情,数据库事务指的则是作为单个逻 ...
- dart系列之:dart优秀的秘诀-隔离机制
目录 简介 dart中的隔离机制 生成一个Isolate Isolate之间的交互 一个例子 总结 简介 之前介绍了很多dart中的异步编程技巧,不知道大家有没有发现一个问题,如果是在java的异步编 ...
- Mysql引擎、隔离机制、存储结构、索引
目录 数据库常用的两种引擎 两种引擎差异对比 如何选择引擎 两个引擎索引结构 查找mysql数据存储位置方式 MyISAM InnoDB 1. 非独立表空间 2. 独立表空间 3. idb文件存的哪些 ...
- hibernate缓存机制和事务隔离机制
一级缓存( Session缓存) } 一级缓存的管理 ◦ 应用程序调用Session的save().update().saveOrUpdate().get()或loa ...
- mysql 事务,锁,隔离机制
mysql架构 锁 为了解并发问题,引入锁,mysql中锁分为读锁和写锁,即share lock和exclusive lock.故名思义,share lock之间不互斥,share lock和excl ...
- mysql隔离机制
转 MySQL隔离级别 mysql-Innodb事务隔离级别-repeatable read详解(转)
随机推荐
- Java 中的 SPI 机制是什么鬼?高级 Java 必须掌握!
作者:sigangjun blog.csdn.net/sigangjun/article/details/79071850 SPI的全名为:Service Provider Interface,大多数 ...
- arm-linux-readelf 的使用
1. 读 elf 文件开始的文件头部 [arm@localhost gcc]$ armlinuxreadelf h hello ELF Header: Magic: 7f 45 4c 46 ...
- Twain协议部分翻译
转载:https://blog.csdn.net/a848691591/article/details/41006807 4.1 性能 应用程序与源进行性能协商的能力使人们能够控制TWAIN兼容的程序 ...
- c_数据结构_二叉树的遍历实现
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #d ...
- LeetCode第九题—— Palindrome Number(判断回文数)
题目描述 Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same ...
- 【JZOJ1667】【BZOJ1801】【luoguP2051】中国象棋
description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮.请问有多少种放置方法?中国象棋中炮的行走方式大家应该很清楚吧. analysis \(DP\),容 ...
- scala中Tuple简单使用
/** * Tuple简单使用记录 * 最大22个参数 */ object TupleUse { def main(args: Array[String]): Unit = { // 简单Tuple ...
- VS2010-MFC(MFC常用类:MFC异常处理)
转自:http://www.jizhuomi.com/software/236.html 上一节讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C ...
- Spark 读写数据、抽象转换 拾遗
读 package com.test.spark import org.apache.spark.sql.{Dataset, Row, SaveMode, SparkSession} /** * @a ...
- day 84 Vue学习之vue-cli脚手架下载安装及配置
Vue学习之vue-cli脚手架下载安装及配置 1. 先下载node.js,下载地址:https://nodejs.org/en/download/ 找个目录保存,解压下载的文件,然后配置环境变量 ...