executes參數的官方定義是:“服務提供者每服務每方法最大可並行執行請求數”,那么現在的問題是假設executes=1,同時有兩個請求達到服務器,第一個請求自然能處理,但是第二個請求會怎么處理呢?我通過實驗發現dubbo的客戶端會直接報錯。可以推理出dubbo並不會用隊列的方式將第二個請求緩存起來等待后面線程有空后處理。
Dubbo為什么不會將請求插入隊列然后一個一個處理呢?我想可能是因為隊列其實也在消耗內存資源,客戶端的發包速度快於服務端的處理速度必然會讓隊列越來越長最后導致服務端崩潰,所以隊列並不是一個好的選擇。
及時的報錯可以讓工程師能快速做出反應,他們會以增加服務器的方式來應付正在增長的負載。
實驗的代碼在 https://github.com/ralgond/dubbo-example/releases/tag/v0.0.5
具體實驗如下:
首先確保producer.xml(在工程dubbo-example-provider中)的配置如下:
<dubbo:service executes="1" version="0.0.1" group="dubbo" ref="greetingService" interface="com.github.ralgond.de.sdk.GreetingService"/>
接着就啟動com.github.ralgond.de.provider.ApiProvider2。
啟動成功后,快速點擊啟動按鈕來啟動多個並行的客戶端com.github.ralgond.de.consumer.ApiSleepConsumer。