昨天我們在調用gRPC的連線時,提到了一個叫做同步傳輸。
在gRPC中,有兩個傳輸的函式,分別為newBlockingStub()跟newStub(),今天就來說明一下,什麼是同步傳輸/非同步傳輸吧!
同步(阻塞式)
當Client端發起一個request,會持續等待server端返回response,在這個等待的過程中,程式會被卡住(亦即阻塞),直到server端發回response或者是發生超時,才會繼續執行程式。
這種同步傳輸的方式當同時調用多個連線同時進行的話,可能會導致資源浪費。
非同步(非阻塞式)
當Client端發起一個request,此時Client並不會等到server端返回response,而是繼續執行下面的程式,這就是非同步傳輸(非阻塞)。
使用非同步傳輸的話,Client端可以使用回調函式、Future或者是Promise等函式處理接下來的事情。
在了解完同步/非同步之後,我們回到這兩個函式身上。
newBlockingStub()是屬於同步傳輸;而newStub()屬於非同步傳輸。兩個在資料傳輸上是不同的。
昨天我們在建立Client端連線的時候,我們有調用一個IronManServiceGrpc中的newBlockingStub(),表示我們的這個傳輸是採用同步傳輸的方式。程式碼如下:
xxxServiceGrpc.xxxServiceBlockingStub service = xxxServiceGrpc.newBlockingStub(managedChammel);
而另外一種非同步傳輸,我們則會調用另外一個函式newStub(),程式碼如下:
xxxServiceGrpc.xxxServiceStub service = xxxServiceGrpc.newStub(managedChammel);
以上就是兩種不同的傳輸方式,在我們調用gRPC程式的過程中,可能會需要不同的傳輸方式,那我們可以依據實際需求來選擇適合的傳遞方式。