dubbo timeout 优先级以及最佳实践

青乡java

理论

一般,接口都有设置超时时间,不管是http接口,还是dubbo接口。

为什么要设置超时时间?因为不设置的时候,一旦高并发,就会把系统搞挂。

具体就是可能部分交易请求很慢,耗时很久,但是没有设置超时,然后就一直占着dubbo线程池的线程资源,这个时候,就会因为部分慢交易,影响和导致了整个系统,因为其他本来正常的交易,现在由于dubbo线程池满了,也处理不了了,这个时候,系统就崩溃了,所有的交易都耗时很慢。

dubbo超时的维度

有2个维度,一个是作用域粒度,一个是消费者还是生产者。

粒度

有3个
1、所有接口
comsumer/provider

2、接口级别
reference/service

3、方法级别
一般很少用。


优先级

粒度越小,优先级越高,即方法>接口>所有服务。

消费者 生产者

优先级

消费者比生产者优先级高。

总结

如果2个维度都有设置,那么
1、粒度维度优先级更高
2、消费者生产者维度优先级比粒度维护优先级低


举个例子
1、消费者是在所有接口粒度设置60s
2、提供者是在接口级别粒度设置15s

那么这个时候,就是以提供者为准,因为提供者的粒度这个维度更小,并且粒度优先级高于消费者生产者维度优先级,所以,这个时候就以提供者的15s超时为准。


总结

所以dubbo的超时时间优先级为:消费者Method>提供者method>消费者Reference>提供者Service>消费者全局配置consumer>提供者全局配置provider。

最佳实践

image.png
最好在提供者设置超时时间。其实不仅仅是超时时间设置,其他消费者和生产者都有的配置,都应该在提供者设置,因为提供者是写代码的一方,最了解代码,所以超时时间等配置,就应该由你来设置。

只有特殊情况下,特殊场景下,消费者才需要配置,但这个也是属于定制超时时间。

实战

当前现状

网关:comsumer 60s——》统一订单:service 15s;消费者:?——》前置:提供者:无;消费者:30s——》交易:提供者:无;消费者:15s。

优化

前置和交易的提供者目前都没有设置超时时间,所以必须要设置超时时间,因为最佳实践就是提供者设置超时时间,为什么呢?因为提供者最懂服务提供者需要耗时多久,代码是你写的,肯定是你设置超时时间最合适。

最佳实践是设置多久?本来是15s,其实15s都太大了,一般接口耗时几s就已经很大了,现在为了逐渐优化,可以先设置为30s。然后再优化为15s。

目前公司交易的都是15s,大一点就是30s,还有更大的是60s,比如网关,所以网关也需要优化,最多15s,但是实际上线的时候可以逐渐优化,即先优化为30s,然后再优化为15s。不然高并发的时候,把系统拖死了。


非交易接口

比如营销,报备,风控,都是1s,最多3s。不重要的,非核心接口,即失败了也不会影响交易的接口,时间都设置的很短,一般就1s,不然的话,如果设置得很大,会让整个交易链路耗时太久。

参考

https://dubbo.apache.org/zh/d...

image.png

阅读 169

解决问题

11 声望
3 粉丝
0 条评论
你知道吗?

解决问题

11 声望
3 粉丝
宣传栏