当前位置:首页 >探索 >gRPC为什么使用截止时间而不是超时时间? 也就是截止这个请求

gRPC为什么使用截止时间而不是超时时间? 也就是截止这个请求

2024-06-28 19:58:37 [百科] 来源:避面尹邢网

gRPC为什么使用截止时间而不是使用时间时间超时时间?

作者:江南一点雨 开发 前端 截止时间相当于设置整个请求生命周期的时间,也就是截止这个请求,我要多久拿到结果。使用时间时间很明显,截止这个时间应该在客户端发起请求的使用时间时间时候设置。

在 HTTP 请求中,截止我们发送请求的使用时间时间时候,可以设置一个请求超时时间-connectTimeout,截止即在指定的使用时间时间时间内,如果请求没有到达服务端,截止为了避免客户端一直进行不必要的使用时间时间等待,就会抛出一个请求超时异常。截止

但是使用时间时间在微服务系统中,我们却很少设置请求超时时间,截止一般都是使用时间时间用另外一个概念代替,那就是请求截止时间。

gRPC为什么使用截止时间而不是超时时间? 也就是截止这个请求

这是什么原因呢?今天我们就来简单聊一聊这个话题。

gRPC为什么使用截止时间而不是超时时间? 也就是截止这个请求

在微服务中我们客户端的请求在服务端往往会有比较复杂的链条,我想起来 Spring Cloud Sleuth 官方给的一个请求链路追踪的图,我们直接拿来看下:

gRPC为什么使用截止时间而不是超时时间? 也就是截止这个请求

图片

这张图中,请求从客户端发起之后,在服务端一共经历了四个 SERVICE,对于这样的请求,如果我们还是按照之前发送普通 HTTP 请求的方式,设置一个 connectTimeout 显然是不够的。

我举个例子:

假设我们发送一个请求,为该请求设置 connectTimeout 为 5s,那么这个时间只对第一个服务 SERVICE1 有效,也就是请求在 5s 之内没有到达 SERVICE1,那么就会抛出连接超时异常;请求如果在 5s 之内到达 SERVICE1,那么就不会抛出异常,但是!!!,请求到达 SERVICE1 并不意味着请求结束,后面从 SERVICE1 到 SERVICE2,从 SERVICE2 到 SERVICE3,从 SERVICE3 到 SERVICE4,还有四个 HTTP 请求待处理,这些请求超时了怎么办?很明显,connectTimeout 属性对于后面几个请求就鞭长莫及了。

所以,对于这种场景,我们一般使用截止时间来处理。

截止时间相当于设置整个请求生命周期的时间,也就是这个请求,我要多久拿到结果。很明显,这个时间应该在客户端发起请求的时候设置。

gRPC 中提供了对应的方法,我们可以非常方便的设置请求的截止时间 DeadLineTime,如下:

public class LoginClient { 
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build();
LoginServiceGrpc.LoginServiceStub stub = LoginServiceGrpc.newStub(channel).withDeadline(Deadline.after(3, TimeUnit.SECONDS));
login(stub);
}

private static void login(LoginServiceGrpc.LoginServiceStub stub) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
stub.login(LoginBody.newBuilder().setUsername("javaboy").setPassword("123").build(), new StreamObserver<LoginResponse>() {
@Override
public void onNext(LoginResponse loginResponse) {
System.out.println("loginResponse.getToken() = " + loginResponse.getToken());
}

@Override
public void onError(Throwable throwable) {
System.out.println("throwable = " + throwable);
}

@Override
public void onCompleted() {
countDownLatch.countDown();
}
});
countDownLatch.await();
}
}

服务端通过 Thread.sleep 做个简单的休眠就行了,超时之后,客户端的 onError 方法会被触发,抛出如下异常:

throwable = io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: deadline exceeded after 2.939621462s. [closed=[], open=[[buffered_nanos=285550823, remote_addr=localhost/127.0.0.1:50051]]]

好啦,一个简单的小细节,感兴趣的小伙伴不妨去试试啦~

责任编辑:武晓燕 来源: 江南一点雨 gRPC服务端设置

(责任编辑:娱乐)

    推荐文章
    • 花呗升级和不升级区别在哪里 贷款利率会下降吗?

      花呗升级和不升级区别在哪里 贷款利率会下降吗?对于很多年轻人来说,无论是在线上的电商平台支付,还是在线下的实体商店支付,使用花呗都是一件比较平常的事情。有不少花呗用户都收到了花呗服务升级提示,花呗升级和不升级区别在哪里?花呗不升级还能用吗?花呗升 ...[详细]
    • 缩小数字攻击面的十种安全控制措施

      缩小数字攻击面的十种安全控制措施缩小数字攻击面的十种安全控制措施作者:安全牛 2023-07-18 12:37:58安全 根据近年来企业攻击面管理的优秀实践,安全研究人员总结了能够有效缩小数字攻击面的十种安全控制措施。 研究显示,随 ...[详细]
    • 老码农的管理拙见

      老码农的管理拙见老码农的管理拙见原创 精选 作者:曹洪伟 2023-07-16 22:34:55开发 项目管理 当考虑问题的时候,应该想得更远一些。关注未来的两到五年内问题并不罕见,陷入细节和战术工作中可能会分散注意 ...[详细]
    • 网络安全如何促进可持续发展

      网络安全如何促进可持续发展网络安全如何促进可持续发展2023-07-24 09:46:18安全 人们不会立即将网络安全与可持续发展联系起来。然而,严格的互联网安全对于人们用于绿色生活和进行环境研究的许多产品和努力至关重要。 网 ...[详细]
    • 汇率变动对股价的影响的有哪些 主要表现是什么?

      汇率变动对股价的影响的有哪些  主要表现是什么?外汇行情与股价有密切的联系。一般来说,如果一国的货币是实行升值的基本方针,股价便会上涨,一旦其货币贬值,股价即随之下跌。所以外汇的行情会带给股市以很大的影响。在当代国际贸易迅速发展的潮流中,汇率对一国 ...[详细]
    • 推荐 八个炫酷的数据可视化大屏项目!

      推荐 八个炫酷的数据可视化大屏项目!推荐 八个炫酷的数据可视化大屏项目!作者:CUGGZ 2022-08-17 09:01:16大数据 数据可视化 今天来推荐 8 个炫酷的数据可视化大屏项目!希望能够帮助到你! 大家好,我是 CUGGZ ...[详细]
    • Spring 中的父子容器是咋回事?

      Spring 中的父子容器是咋回事?Spring 中的父子容器是咋回事?作者:江南一点雨 2023-07-12 08:23:50开发 前端 Spring 容器中的父子容器现在大家应该明白了吧?可以给非 ListableBeanFacto ...[详细]
    • 研究报告称 GPT

      研究报告称 GPT研究报告称 GPT-4 “智力”明显下降作者:IT之家 2023-07-20 12:16:31人工智能 来自斯坦福大学和加州大学伯克利分校的研究团队近日对 GPT-4 进行了深入研究,对比了今年 3 ...[详细]
    • 清明假期火车票开售 想要去哪里游玩记得提前预订车票

      清明假期火车票开售 想要去哪里游玩记得提前预订车票需要注意啦,清明节一共放假三天的时间,而且高速也会免费通行。现在消息指出,清明假期火车票开售啦,节前一天北京前往郑州、武汉等地车票热销,想要去哪里游玩,记得提前预订车票。同时,3月20日可以购买4月3 ...[详细]
    • 编程必备!25个让你眼前一亮的JavaScript代码技巧

      编程必备!25个让你眼前一亮的JavaScript代码技巧编程必备!25个让你眼前一亮的JavaScript代码技巧作者:前端小智 2023-07-16 22:37:46开发 前端 JavaScript一行代码是节省时间和代码的强大方式。它们可以用来在一行代 ...[详细]
    热点阅读