成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

gRPC為什么使用截止時間而不是超時時間?

開發 前端
截止時間相當于設置整個請求生命周期的時間,也就是這個請求,我要多久拿到結果。很明顯,這個時間應該在客戶端發起請求的時候設置。

在 HTTP 請求中,我們發送請求的時候,可以設置一個請求超時時間-connectTimeout,即在指定的時間內,如果請求沒有到達服務端,為了避免客戶端一直進行不必要的等待,就會拋出一個請求超時異常。

但是在微服務系統中,我們卻很少設置請求超時時間,一般都是用另外一個概念代替,那就是請求截止時間。

這是什么原因呢?今天我們就來簡單聊一聊這個話題。

在微服務中我們客戶端的請求在服務端往往會有比較復雜的鏈條,我想起來 Spring Cloud Sleuth 官方給的一個請求鏈路追蹤的圖,我們直接拿來看下:

圖片

這張圖中,請求從客戶端發起之后,在服務端一共經歷了四個 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]]]

好啦,一個簡單的小細節,感興趣的小伙伴不妨去試試啦~

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2013-03-25 10:14:18

NginxApache

2020-09-15 09:23:19

C++WindowsC#

2021-02-26 05:30:25

元素For-Each代碼

2019-04-19 11:56:48

框架AI開發

2021-03-26 11:50:28

Linuxexals

2021-06-30 12:47:12

標簽HTML分辨率

2012-10-10 16:52:21

CentOSDebianUbuntu

2021-10-30 19:57:00

HTTP2 HTTP

2021-08-14 09:04:58

TypeScriptJavaScript開發

2016-09-19 09:15:49

Windows 10鎖屏超時

2020-02-20 09:55:46

LinuxPython數據

2017-09-11 19:58:06

PostgreSQLMySQL數據庫

2020-06-02 14:17:55

QWER排列鍵盤打印機

2023-11-02 08:20:54

SocketZygoteAndroid

2020-07-24 09:20:44

MapObject前端

2025-03-04 00:25:55

Go開發者切片

2024-06-24 00:00:00

AVIFJPEG圖像格式

2023-09-29 11:50:10

接口編程代碼

2025-02-12 08:47:07

SpringAPI接口

2019-09-24 09:33:53

MySQLB+樹InnoDB
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲午夜视频在线观看 | 国产一区欧美一区 | 日日操操 | 日韩在线不卡 | 免费黄视频网站 | 国产乱码久久久久久 | 国产精品久久久久久久久久久久久久 | 干干干操操操 | 亚洲巨乳自拍在线视频 | 欧美精品一区二区三区一线天视频 | 欧美在线视频一区二区 | 99免费视频| 成人av电影免费在线观看 | 在线观看欧美一区 | 成人影院免费视频 | 日韩欧美网 | 中文字幕在线不卡 | 91免费入口| 五月天婷婷综合 | 超碰精品在线观看 | av电影手机在线看 | 中文字幕视频在线 | 国产欧美在线播放 | 久久这里只有精品首页 | 亚洲欧美日韩精品久久亚洲区 | 久久新| 91在线精品一区二区 | 天天影视亚洲综合网 | 亚洲精品一区二区冲田杏梨 | 久久99视频精品 | 欧美日本韩国一区二区三区 | 91精品国产99久久 | 久久精品国产一区二区电影 | 91黄在线观看 | 国产欧美精品区一区二区三区 | 日韩欧美在线视频一区 | 久久久久久久99 | 涩涩视频在线观看 | 天天av天天好逼 | 一级片av | 免费一区二区在线观看 |