dubbo超時原理以及解決方案
本篇主要記錄dubbo中關於超時的常見問題,實現原理,解決的問題
超時問題
為了檢查對dubbo超時的理解,嘗試回答如下幾個問題,如果回答不上來或者不確定那么說明此處需要再多研究研究。
我只是針對個人的理解提問題,並不代表我理解的就是全面深入的,但我的問題如果也回答不了,那至少說明理解的確是不夠細的。
- 超時是針對消費端還是服務端?
- 超時在哪設置?
- 超時設置的優先級是什么?
- 超時的實現原理是什么?
- 超時解決的是什么問題?
問題解答
RPC場景
本文所有問題均以下圖做為業務場景,一個web api做為前端請求,product service是產品服務,其中調用comment service(評論服務)獲取產品相關評論,comment service從持久層中加載數據。
超時是針對消費端還是服務端?
-
如果是爭對消費端,那么當消費端發起一次請求后,如果在規定時間內未得到服務端的響應則直接返回超時異常,但服務端的代碼依然在執行。
-
如果是爭取服務端,那么當消費端發起一次請求后,一直等待服務端的響應,服務端在方法執行到指定時間后如果未執行完,此時返回一個超時異常給到消費端。
dubbo的超時是爭對客戶端的,由於是一種NIO模式,消費端發起請求后得到一個ResponseFuture,然后消費端一直輪詢這個ResponseFuture直至超時或者收到服務端的返回結果。雖然超時了,但僅僅是消費端不再等待服務端的反饋並不代表此時服務端也停止了執行。
按上圖的業務場景,看看生成的日志:
product service:報超時錯誤,因為comment service 加載數據需要5S,但接口只等1S 。
Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout. start time: 2017-08-05 18:14:52.751, end time: 2017-08-05 18:14:53.764, client elapsed: 6 ms, server elapsed: 1006 ms, timeout: 1000 ms, request: Request [id=0, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=getCommentsByProductId, parameterTypes=[class java.lang.Long], arguments=[1], attachments={traceId=6299543007105572864, spanId=6299543007105572864, input=259, path=com.jim.framework.dubbo.core.service.CommentService, interface=com.jim.framework.dubbo.core.service.CommentService, version=0.0.0}]], channel: /192.168.10.222:53204 -> /192.168.10.222:7777 at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:107) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.remoting.exchange.support.DefaultFuture.get(DefaultFuture.java:84) ~[dubbo-2.5.3.jar:2.5.3] at com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:96) ~[dubbo-2.5.3.jar:2.5.3] ... 42 common frames omitted
comment service : 並沒有異常,而是慢慢悠悠的執行自己的邏輯:
2017-08-05 18:14:52.760 INFO 846 --- [2:7777-thread-5] c.j.f.d.p.service.CommentServiceImpl : getComments start:Sat Aug 05 18:14:52 CST 2017 2017-08-05 18:14:57.760 INFO 846 --- [2:7777-thread-5] c.j.f.d.p.service.CommentServiceImpl : getComments end:Sat Aug 05 18:14:57 CST 2017
從日志來看,超時影響的是消費端,與服務端沒有直接關系。
超時在哪設置?
消費端
- 全局控制
<dubbo:consumer timeout="1000"></dubbo:consumer>
服務端
- 全局控制
<dubbo:provider timeout="1000"></dubbo:provider>
詳細見下面博客: