调用别人的接口或第三方接口怎么做熔断 原创 2021-05-14 18:49:36.0 阅读(3175)次 在我们开发过程中总会遇到开发服务接口给别人调用,或者让别人的服务提供接口给你调用。别人的服务调用我们的服务接口的情况,我们为了保护自己的服务不被高并发或者说大量请求压垮,往往会做限流或者熔断。但是我们调用别人的服务接口需要做限流或熔断么? 我们举个例子: 我们系统有个场景就是要将产生的预警信息快速同步给下游第三方服务中,实时性要求比较高。预警信息是从kafka中消费的,每一条预警信息都要发给多个第三方服务。大致流程如下:  图中一条预警信息从kafka拉取后会被包装成3个同步第三方的Http请求放到一个线程池中执行。也就是说三个第三方服务的请求发送处理是在同一个线程池中执行。 我们把线程池设置最大100线程数,测试完成后,我们上线不久就发现kafka消息堆积的很严重,这跟我们预期差很大。后来看了下日志,其中一个要同步预警的第三方接口不通,不能正常访问,每次都要等60秒超时,如上图所示,第一个第三方服务了出问题了。这时我们看了下日志,发现大部分线程都处理的非常慢,很多线程都被第一个第三方服务的同步任务占用了。以致于预警消息消费非常慢,kafka堆了很多消息,再过不久估计kafka就要跨掉了。。 再一个问题是因为我们线程被占,其他第三方服务也收不到实时预警了,或者只收到少量预警,功能可用性严重受到影响。上线前我们没有想过这些问题,没想到一个第三方出问题居然也会影响到其他第三方实时收消息。 那既然发现了问题的原因就好解决了。 首先我们把调用第三方服务的Http请求的超时时间设置短一点,之前60秒超时太长了,我们的场景要求实时性比较高,60秒响应实在是让人受不了,于是将超时时间改成15秒。这样尽量让线程回到线程池,不影响其他正常的第三方服务。 其次针对调用出问题的第三方服务接口做熔断,超时或不能正常请求的,超过一定阈值就不再同步给它,等过一定时间再解除熔断,这样就不会让线程被有问题的第三方接口一直占着,影响我们的服务和其他第三方正常同步预警的服务,这也是不得已而为之。总之为了大局,只能这么做了。 熔断代码我们只能自己实现了,熔断的逻辑可以根据自己的业务来定义,熔断的触发阈值可以配置到配置文件中,这样触发熔断的灵敏度可以根据场景随时更改。 代码如何实现,请看《[调用别人的接口或第三方接口怎么做熔断(二)](http://www.classinstance.cn/detail/153.html "调用别人的接口或第三方接口怎么做熔断(二)")》 微服务 架构 上一篇:java Md5工具类获取字符串的Md5值 下一篇:调用别人的接口或第三方接口怎么做熔断(二)
相关文章 调用别人的接口或第三方接口怎么做熔断(二)(1674) LOG_PATH_IS_UNDEFINED/info.log (No such file or directory)(2446) dubbo项目consumer和provider的启动顺序问题(3728) feign加入熔断器之后转发不了token等header信息(2701) spring cloud config取不到配置@Value报错: Could not resolve placeholder 'xxxx' in value (12346) feign报错java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0(4411) spring cloud gateway 获得响应body记录日志问题(2912) spring cloud gatewayThe ‘Access-Control-Allow-Origin’ header contains multiple values “*, *”, but only one is allowed.(5413) feign接口类扫瞄找不到的问题,required a bean of type 'xx.xx.xxxFeignClient' that could not be found(3657) Caused by: java.net.BindException: Address already in use: connect(3176) 推荐文章 spring cloud+feign+mybatis中使用seata0.9实现分布式事务(7) spring cloud gateway报错Only one connection receive subscriber allowed(82) spring cloud中Feign调用诡异报错MethodNotAllowed: status 405 reading(116) elasticsearch7.1保存时报错: Validation Failed: 1: type is missing;(7) 聊聊数据保存到MySQL后数据乱码的问题(1) 使用spring4实现websocket连接(1) jquery对象与dom对象互转(1) linux使用epel源yum安装iftop、nload、nginx等(2) linux下nginx安装其他模块(1) solr时区设置解决时间多8小时问题(1) 热门文章 feign报错:cannot retry due to redirection, in streaming mode(13012) spring cloud config取不到配置@Value报错: Could not resolve placeholder 'xxxx' in value (12151) 修改seata server启动服务端口(9473) spring cloud集成分布式事务中间件seata报错 not support register type: null(9196) spring cloud中Feign调用诡异报错MethodNotAllowed: status 405 reading(8902) seata并发测试报错:get global lock fail, xid:192.168.64.1:18091:2025291279, lockKeys:stock_info:1(7973) spring cloud+feign+mybatis中使用seata0.9实现分布式事务(7163) spring boot整合apache dubbo时报错ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Z(5790) spring cloud gateway报错Only one connection receive subscriber allowed(5449) spring cloud gatewayThe ‘Access-Control-Allow-Origin’ header contains multiple values “*, *”, but only one is allowed.(5275) 标签列表 java java java java java java java基础 微服务 异常处理 mysql clickhouse clickhouse clickhouse clickhouse clickhouse spring cloud spring boot linux elasticsearch feign jdbc spring js docker postgresql solr seata nginx maven gateway hsqldb 数据库 架构 大数据分析 分布式事务 redis canal dubbo hadoop 消息队列 win10 websocket springmvc git html select2 mybatis jenkins rocketmq quartz activemq 数据库集群 ajax bat 电脑 笔记 eclipse 设计模式 阿里云 github freemarker jvm jquery javamail redission redission对象 hystrix http hibernate springmail svn ubuntu ueditor xheditor zookeeper 分布式 小程序 开发工具 gitlab