多外部下游服务线程隔离

news/2024/6/14 22:45:00 标签: spring boot, spring cloud

一、问题背景        

        我们的系统中有一个微服务(以下简称A服务)需要调用多个部署在各省(市)的外部服务(简称B服务,一共有30多个B服务),不同省(市)网络、硬件性能不同,所以省市系统的处理数据能力有很大差异,平均响应时间超过5秒,部分省系统平均响应时间超过10秒,A服务调用所有B服务超时时间设置为30秒。

二、问题现象

        恰逢其会,某日某省网络不知什么原因出现问题,A服务调用该省B服务推送数据大量超时,因为,因为超时时间较长,导致A的上游服务请求积压,A服务的连接池被沾满,导致A服务不能继续接收请求,导致业务终端几个小时,也就是一个外部服务的错误导致全国所有省市的用户都不能使用系统服务。

三、解决思路

        计划使用Hystrix的线程隔离功能,实现A服务调用各省B服务时的线程隔离,从而因各种原因导致的某省B服务响应能力不佳时,其他省市用户仍能正常使用业务。

        使用Hystrix命令来实现线程隔离时,有三个关键的Key:groupKey、commandKey和threadPoolKey,groupKey缺省为@HystrixCommand标注的类名,commandKey缺省是@HystrixCommand标注的方法名,threadPoolKey缺省与groupKey相同,这三个键均可以通过注解来修改。Hystrix根据threadPoolKey进行隔离,不同的threadPoolKey对应不同的线程池。根据系统实际情况,应该把各省(市)B服务的URL作为threadPoolKey。如果采用注解的方式来配置线程隔离,因为threadPool是需要提前配置的,所以就需要用HystrixCommand进行30多处注解,在分发用户的请求时,如果不使用反射,那么就意味着有一个30多个分支的switch-case,实在是丑陋之极,所以决定使用继承HystrixCommand类的方法。

四、代码片段

class MyCommand extends HystrixCommand<BaseRes> {
    private String url; //省B服务的地址
    private String msg; //发送到省的数据

    public MyCommand(String url, String msg){
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory
                .asKey("Send2ProvinceCommandGroup"))
                .andCommandKey(HystrixCommandKey.Factory.asKey("Send2ProvinceCommand"))
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey(url))
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                        .withExecutionTimeoutInMilliseconds(10000)));
        this.url = url;
        this.msg = msg;
    }
    @Override
    protected BaseRes run(){
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.getForObject(url, BaseRes.class);
    }
    @Override
    protected BaseRes getFallback(){
         return BaseRes.getInstance(ErrorCodeEnum.FORWARD_PROVINCE_AUTH_FAILURE);
     }
}

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

相关文章

[C#基础训练]FoodRobot食品管理部分代码

参考代码&#xff1a; using System; using System.Collections.Generic;namespace FoodRobotDemo {public class FoodInfo{ public string Name { get; set; } public int Id { get; set; } public int Count { get; set; }}public class FoodRobot{private …

个人用户免费,亚马逊正式推出 AI 编程服务 CodeWhisperer

IT 之家 4 月 14 日消息&#xff0c;亚马逊于 2022 年 6 月以预览版的形式&#xff0c;推出了 AI 辅助编程服务 CodeWhisperer。亚马逊于今天宣布该服务正式上线&#xff0c;并免费向个人用户开放。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、…

一张逻辑图讲清楚OS在做什么:浅谈OS

本文旨在通过思维导图的方式、对os主要的知识点简短介绍&#xff0c;让读者能短时间快速把os是什么、干什么给串起来。当别人问起来时&#xff0c;可以用3-5分钟讲清楚。如果读者对os有更加深入的兴趣&#xff0c;可点对点针对某一内容再做进一步研究。通常对于互联网从业者来说…

Fabric.js 图案笔刷

本文简介 带尬猴&#xff0c;我是德育处主任 Fabric.js 有图案画笔功能&#xff0c;这个功能可以简单理解成“刮刮卡”效果。 如果只是看 Fabric.js 文档可能还不太明白 图案画笔 PatternBrush 是如何使用。 本文将讲解如何配置这款画笔的基础属性。 图案画笔&#xff08;笔…

31一维信号滤波(限幅滤波、中值滤波、均值滤波、递推平均滤波),MATLAB程序已调通,可直接运行。

一维信号滤波&#xff08;限幅滤波、中值滤波、均值滤波、递推平均滤波&#xff09;&#xff0c;MATLAB程序已调通&#xff0c;可直接运行。 31matlab、中值滤波、信号处理 (xiaohongshu.com)

基于单片机设计的防煤气泄漏装置

一、前言 煤气泄漏是一个严重的安全隐患&#xff0c;可能导致火灾、爆炸以及对人体健康的威胁。为了提高家庭和工业环境中煤气泄漏的检测和预防能力&#xff0c;设计了一种基于单片机的防煤气泄漏装置。 单片机选择STC89C52作为主控芯片。为了检测煤气泄漏&#xff0c;采用了…

C语言--strcmp函数(介绍与自己实现)

strcmp函数&#xff1a;字符串比较函数。 用法&#xff1a;strcmp(str1,str2)。str1&#xff0c;str2可以是字符串常量或者字符串变量&#xff0c;返回值为整形。 str1小于str2,返回负值&#xff0c;str1等于str2,返回为0&#xff0c;str1大于str2,返回正值 那么两个字符串是…

JavaScript中的可变(Mutable)和不可变(Immutable)

JavaScript中的可变&#xff08;Mutable&#xff09;和不可变&#xff08;Immutable&#xff09; 在JavaScript中&#xff0c;可变&#xff08;Mutable&#xff09;和不可变&#xff08;Immutable&#xff09;主要是指数据类型的特性。 【可变指即使没有创建一个全新的值&…