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