ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java GRPC超时机制

2022-06-27 00:04:28  阅读:561  来源: 互联网

标签:TesseractServiceGrpc Java GRPC gRPC token deadline url 超时


所谓困难,则是激发个人抵制困难的机会,激发新能力的机会;

---

Java的gRPC没有没有Timeout机制,不过在其中增加了Deadline机制;但使用时容易出错,以下为我踩的几个坑;

引入gRPC超时机制的原因是因为其他服务请求gRPC所在服务,若gRPC一直执行不完,会导致任务堆积;

创建后持续报错:

io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: ClientCall started after deadline exceeded: -175.597476157s from now 这种超时时间特别长;观察我的实现是在init时添加了deadline,那么从init时就开始计时了,而当真正开始执行前,就已经超时了,因此导致了超时 于是进行了修改,修改为当开始执行的时候开始设置超时时间;   进行过上述修改后,依然会报错,但超时的时间缩短了,在日志中会出现io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: ClientCall started after deadline exceeded: -0.013832392s from now 但是添加StopWatch,真实操作时间并没有超时,这个问题是比较诡异的,尝试为设置时间和进行请求的过程加了一个锁,发现问题居然解决了;仔细看了代码,发现了问题所在,gRPC提供的deadline机制是非线程安全的;出现超时的原因也就呼之欲出了。、。。   展示代码: 初始化:
@PostConstruct
private void init() {
  tesseractServiceBlockingStub = initAuthGRCTesseractStub(tesseractGrpcUrl,
          tesseractToken);
}

////////
public TesseractServiceGrpc
        .TesseractServiceBlockingStub initAuthGRCTesseractStub(String url, String token) {
  log.info("oAuth GRPC Init url:{},interiorToken:{}", url, token);
  // 构建channel 单例
  ManagedChannel channel = genChannel(url);
  Metadata extraHeaders = genMetadata(token);
  TesseractServiceGrpc.TesseractServiceBlockingStub simpleStub = TesseractServiceGrpc
          .newBlockingStub(channel)
          .withInterceptors();
  TesseractServiceGrpc.TesseractServiceBlockingStub stub = MetadataUtils
          .attachHeaders(simpleStub, extraHeaders);
  log.info("Tesseract oAuth GRPC Init success");
  return stub;
}

注意:在初始化时不要设置超时时间

调用:(在调用时设置超时时间)

UserInfo userInfo;
synchronized(this.class){
   userInfo = stub
        .withDeadlineAfter(AUTH_MAX_TIMEOUT, TimeUnit.MICROSECONDS)
    .getUserInfo(token);
}

当然直接用synchronized不太优雅,同学们可以自行使用自认为更优雅的锁,只要保证在设置超时与进行gRPC在同一个锁内即可;

标签:TesseractServiceGrpc,Java,GRPC,gRPC,token,deadline,url,超时
来源: https://www.cnblogs.com/kongqueting/p/16414744.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有