dubbo调优



1.dubbo一个提供方和一个消费方,默认使用单一长连接
如果消费方调用提供方其中一个服务比较慢,则会造成其它服务缓慢,解决办法是设置多个连接。
但连接数过多也会造成服务端连接暴满的问题,需要根据实际情况设置。

全局设置:
<dubbo:protocol name="dubbo" connections="2" />

单个服务设置:
<dubbo:service connections=”2”>或<dubbo:reference connections=”2”>表示该服务使用独立两条长连接。


2.事件分发模式

Dispatcher 
all 所有消息都派发到线程池,包括请求,响应,连接事件,断开事件,心跳等。 
direct 所有消息都不派发到线程池,全部在IO线程上直接执行。 
message 只有请求响应消息派发到线程池,其它连接断开事件,心跳等消息,直接在IO线程上执行。

<dubbo:protocol name="dubbo" port="20880" dispatcher="all" threadpool="fixed" threads="100" />

3.服务提供方,尽量与服务消费方在同一局域网
spring cloud提供调用优先级。优先调用同机房服务,没有则调用同一个城市服务。

4.超时时间设置
根据不同业务设置超时时间,有些后台任务,需要设置长点。默认超时时间为6秒。
面向用户的服务,超时时间不能过长,如果这个服务出现问题,会导致雪崩。

5.读服务可以重试,写服务一般不建议重试

6.设置处理线程池的大小和类型
<dubbo:protocol name="dubbo" port="${dubbo.protocol.port}" server="netty" client="netty" serialization="dubbo" charset="UTF-8" threadpool="fixed" threads="500" queues="0" buffer="8192" accepts="0" payload="8388608"
iothreads=“9” />

默认线程池核心线程数为:200,最大线程数为200,queue为SyncronouseQueue。
考虑下,如果出现请求200个处理线程都不够,再来一个请求会发生什么情况?

底层会抛一个RejectedExecutionException,使用的是dubbo自己的拒绝策略:AbortPolicyWithReport。

这里最好不要设置queues。
如果设置了,因为在请求比较多时,如果服务提供方处理不过来,会将请求存储在queue,但因为是先进先出,所以之前早点的请求会被先处理,处理完后由于有dubbo超时时间这批请求实际是无效的。
接着导致之后新的请求就算服务已经恢复正常速度,由于还要先处理之前旧的请求导致这批请求都无效。

初始化代码:
 public Executor getExecutor(URL url) {
        String name = url.getParameter(Constants.THREAD_NAME_KEY, Constants.DEFAULT_THREAD_NAME);
        int threads = url.getParameter(Constants.THREADS_KEY, Constants.DEFAULT_THREADS);
        int queues = url.getParameter(Constants.QUEUES_KEY, Constants.DEFAULT_QUEUES);
        return new ThreadPoolExecutor(threads, threads, 0, TimeUnit.MILLISECONDS, 
        queues == 0 ? new SynchronousQueue<Runnable>() : 
        (queues < 0 ? new LinkedBlockingQueue<Runnable>() 
        : new LinkedBlockingQueue<Runnable>(queues)),
        new NamedThreadFactory(name, true), new AbortPolicyWithReport(name, url));
    }


7.dubbo调用链监控
使用开源的cat,pinpoint或自研。

8.现在dubbo用的是netty3,nett4之后做了很多优化,其中包括缓存池的利用可以提升不少性能。
期望dubbo之后能有升级。

9.dubbo限流
针对某个接口做限流
服务消费方:
<dubbo:reference>connections

防止服务提供方接收过多连接:
< dubbo:protocol name = "dubbo" accepts = "1000" />

10.请求响应数据大小限制
<dubbo:protocal> payload
默认8M
不要传送大包

11.业务的熔断降级
dubbo默认不提供,可以使用hystrix去做

12.服务提供方及消费者限制调用某个服务的并发数

//限制服务端,这个服务可以同时并发的线程数
<dubbo:service interface="com.foo.BarService" executes="10" />

//限制服务端,这个服务可以同时存在的连接数
<dubbo:service interface="com.foo.BarService" actives="10" />

<dubbo:reference interface="com.foo.BarService" actives="10" />

13.dubbo本身上层有心跳,底层还设置了tcp的keepAlive
这样做的原因可能是担心dubbo线程池无可用线程用于心跳检测,导致服务端连接不释放。

14.服务不能拆的太细
原因:
1.在组装某个业务结果时,涉及远程调用太多
2.服务方过多,消费方建立的socket也会比较多。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值