springcloud线上发布超时之grpc

springcloud线上发布超时系列文章:
springcloud线上发布超时之feign(ribbon饥饿加载)
springcloud线上发布超时之grpc

上一章我们说到了
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分钟,这里的一分钟也是由于其他资源没初始化导致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章