背景:
该问题源于我的一位同事调用dubbo方法时,在项目组群里咨询我。他调用的方法抛出了超时异常,更为诡异的是过一会(几秒钟),又再次收到了dubbo接口返回值。
问题探寻步骤:
核实下该方法消费者设置的类级别的timeout配置,然后核实了该方法生产者设置的类级别timeout配置。发现消费者设置的超时时间比较短。
dubbo的spring配置建议:
生产者与消费者区分开:spring-dubbo-producer.xml、spring-dubbo-consumer.xml各自有各自的配置
生产者配置:全面一些,消费者不要设置超时时间,这样消费者会默认采用生产者配置。因为生产者及业务实现更贴近实际。
超时时间配置:全局超时时间应该略大于接口级别最长耗时时间,每个接口级别的超时时间略大于方法级别最长超时时间,每个方法级别超时时间略大于实际方法耗时时间。
超时时间优先级:方法级别最高,其次接口级别,再次全局级别。消费者优先级大于生产者级别。
dubbo超时机制的由来:
dubbo底层是netty网络组件,NIO模式。消费端发起远程请求后,线程不会阻塞等待服务器的返回,而是马上返回一个reponseFuture,消费端不断轮询判断结果是否返回。
轮询时为避免死循环,引入的超时机制。
换句话说,假如消费者设置了超时时间,那么时间到了,消费端超时,但是服务端仍旧在执行。