zuul隔离机制

摘要:
查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高于100那么就拒绝服务了,返回500。线程隔离Edgware版本的springcloud提供了另一种基于线程池的隔离机制。实现起来也非常简单,zuul:ribbon-isolation-strategy:THREADthread-pool:use-separate-thread-pools:truethread-pool-key-prefix:zuulgwhystrix:threadpool:default:coreSize:50maximumSize:10000allowMaximumSizeToDivergeFromCoreSize:truemaxQueueSize:-1execution:isolation:thread:timeoutInMilliseconds:60000use-separate-thread-pools的意思是每个路由都有自己的线程池,而不是共享一个。小结线程池提供了比信号量更好的隔离机制,并且从实际测试发现高吞吐场景下可以完成更多的请求。

文章转载自: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化的数据库。所以整体性能不高。

zuul隔离机制第1张

看结果仍然有57个KO,但是比之前1000个Request有900个KO的比例好很多了。

线程隔离

Edgware版本的spring cloud提供了另一种基于线程池的隔离机制。实现起来也非常简单,

zuul:
  ribbon-isolation-strategy: THREAD
  thread-pool:
    use-separate-thread-pools: truethread-pool-key-prefix: zuulgw
     
hystrix:
  threadpool:
    default:
      coreSize: 50maximumSize: 10000allowMaximumSizeToDivergeFromCoreSize: truemaxQueueSize: -1execution:
        isolation:
          thread:
            timeoutInMilliseconds: 60000

use-separate-thread-pools的意思是每个路由都有自己的线程池,而不是共享一个。
thread-pool-key-prefix会指定一个线程池前缀方便调试。
hystrix的部分主要设置线程池的大小,这里设置了10000,其实并不是越大越好。线程池越大削峰填谷的效果越显著,也就是时间换空间。系统的整体负载会上升,导致响应时间越来越长,那么当响应时间超过某个限度,其实系统也算是不可用了。后面可以看到数据。

zuul隔离机制第2张

这次没有500的情况了,1000个Request都正常返回了。

比较

从几张图对比下两种隔离的效果,上图是信号量隔离,下图是线程隔离。

响应时间分布

zuul隔离机制第3张

zuul隔离机制第4张

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

QPS

zuul隔离机制第5张

zuul隔离机制第6张

两张图展示的是同一时刻的Request和Response的数量。

先看信号量隔离的场景,Response per second是逐步提升的,但是达到一个量级后,gateway开始拒绝服务。猜测是超过了信号量的限制或是超时?

线程隔离的这张就比较有意思了,可以看到Request per second上升的速度要比上面的快,说明系统是试图接收更多的请求然后分发给线程池。再看在某个时间点Response per second反而开始下降,因为线程不断的创建消耗了大量的系统资源,响应变慢。之后因为请求少了,负载降低,Response又开始抬升。所以线程池也并非越大越好,需要不断调试寻找一个平衡点。

小结

线程池提供了比信号量更好的隔离机制,并且从实际测试发现高吞吐场景下可以完成更多的请求。但是信号量隔离的开销更小,对于本身就是10ms以内的系统,显然信号量更合适。

免责声明:文章转载自《zuul隔离机制》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇用google在线播放器播放MP3和FLVlinux系统通过ssh拉取gitee项目 设置权限下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

UCOSII使用之信号量,邮箱

信号量在ucos-II中,为了实现任务之间的同步,用到的同步机制有:信号量,邮箱和消息队列。其中这里我主要说下对信号量的使用经验。信号量在创建时,      调用OSSemCreate(INT16U cnt)函数。cnt为信号量的初始值。对cnt赋予不同的值,所起到的作用不同。如果Semp = OSSemCreate(0), 该信号量表示等待一个事件或者多...

以ajax请求方式进行文件下载操作失败的原因及解决方案

一、失败的原因 那是因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。 二、解...

HttpClient+ ResourceBundle接口配置优化

本文主要包含HttpClient接口测试,ResourceBundle读取配置文件中的接口地址信息。 ResourceBundle可读取.properties文件,.properties的格式是key value。.properties可以配置接口请求中的域名(ip)和路径等信息。.properties应该存放src->main->resour...

线程池:Execution框架

每问题每线程:在于它没有对已创建线程的数量进行任何限制,除非对客户端能够抛出的请求速率进行限制。 下边 有些图片看不到,清看原地址:http://www.360doc.com/content/10/1027/21/495229_64583490.shtml 无限制创建线程的缺点: 1.线程生命周期的开销:线程的创建和关闭并不是“免费的”。 2.资源消耗量:...

iOS开发网络数据之AFNetworking使用

http网络库是集XML解析,Json解析,网络图片下载,plist解析,数据流请求操作,上传,下载,缓存等网络众多功能于一身的强大的类库。最新版本支持session,xctool单元测试。网络获取数据一直是手机软件的重中之重,如果处理的不好,会造成很差的用户体验。随着ASIHTTPRequest的停止更新,更换网络库是必然的事情,AFNetworking...

第二章 进程同步(二)——> 重点

2.4  进程同步2.4.1  进程同步的基本概念 1.  两种形式的制约关系 (1)间接相互制约关系:互斥问题(往往是互斥设备)---是同步的特例 (2)直接相互制约关系:同步问题 注:     互斥问题:共享变量的修改冲突   同步问题:操作顺序冲突,先后关系 2. 临界资源 许多硬件资源如打印机、磁带机等,都属于临界资源,诸进程间应采取互斥方式,实现...