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。