springcloud线上发布超时系列文章:
springcloud线上发布超时之feign(ribbon饥饿加载)
> 上一章我们说到了 springcloud线上发布超时之feign(ribbon饥饿加载) 在本章我们说说grpc的饥饿加载,grpc连接也是一样的问题,发布后,如果超时时间设置的比较短,第一次请求一般会报超时,当高并发情况下发布系统时,会出现一段时间的超时。
问题原因与上一章描述的差不多,就是容器初始化后grpc连接没有初始化,在第一次调用时才会去初始化连接以及相关拦截器等上下文,而grpc暂时没有饥饿加载相关的配置,下面描述下解决方案
这里采用的方案,是在容器初始化好后手动调用下grpc请求,这样就会在承载流量前会初始化好相关资源,减少出错数。 代码如下:
@Slf4j @Service public class GrpcService { @GrpcClient("grpc-server") private Channel serverChannel; @Value("${grpc.timeout:1000}") private int grpcTimeout; @Autowired private RecommendMetrics recommendMetrics; @PostConstruct private void firstGrpcGet() { try { log.warn("GrpcService.firstGrpcGet start"); HelloApi.HelloRequest.Builder requestBuilder = HelloApi.HelloRequest.newBuilder(); HelloApi.HelloRequest request = requestBuilder.build(); HelloerGrpc.HelloerBlockingStub stub = HelloerGrpc.newBlockingStub(serverChannel); stub.withDeadlineAfter(grpcTimeout, TimeUnit.MILLISECONDS).doHello(request); log.warn("GrpcService.firstGrpcGet end"); }catch (Exception e){ log.error("GrpcService.firstGrpcGet error"+e.getMessage()); } }
上面介绍的是一种方案,当然还有其他方法,加上手动饥饿加载后,超时fallback持续5分钟缩短为1分钟,这里的一分钟也是由于其他资源没初始化导致。
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句