springcloud線上發佈超時之grpc優化

springcloud線上發佈超時系列文章:
springcloud線上發佈超時方案之feign優化(ribbon飢餓加載)
springcloud線上發佈超時方案之grpc優化
springcloud線上發佈超時方案之終極殺招:預熱(測試用例)

上一章我們說到了
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分鐘,這裏的一分鐘也是由於其他資源沒初始化導致。

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