Java后端 Dubbo retries 超时重试机制的解决方案


Posted in Java/Android onApril 14, 2022

异常日志

[com.alibaba.dubbo.rpc.filter.TimeoutFilter] -  [DUBBO] invoke time out. method: sendMessagearguments: [{****内容****}] , url is dubbo://*.*.*.*:20882/cn.demo.api.IDemoProviderApi?anyhost=true&application=demo&dubbo=2.8.4&generic=false&interface=cn.demo.api.IDemoProviderApi&methods=sendMessage,resetSendCount&pid=13008&revision=0.0.1-SNAPSHOT&side=provider&timeout=6000×tamp=1521449123489&version=1.0, invoke elapsed 10863 ms., dubbo version: 2.8.4, current host: 127.0.0.1 

异常原因

dubbo服务提供方,通过注解方式暴露的,参数设置如下:

@Service(version = "1.0", timeout = 6000)

消费方调用dubbo服务,请求超时,dubbo服务有超时重试机制,所以对于提交的业务,会有3次调用.

解决方案

修改dubbo服务提供方.将timeout超时设为20000ms.或者设置retries=“0”.禁用超时重试机制.

xml方式(消费方):

<!-- 需要消费的api --> 
 <dubbo:consumer check="false" id="dubboConsumerConfig" retries="0"/>

注解方式(提供方):

@Service(version = "1.0", timeout = 20000)

Dubbo超时重试机制

1、请求服务超时,但是最终程序执行了3次,对于提交订单的业务,只能是新增一个订单,这样是不可以的.

2、dubbo:provider 可以设置超时时间 timout,以及如果超时允许被重连的次数 retries.

3、dubbo:reference 可以设置超时时间,以及如果超时 timout,允许重连服务的次数 retries;如果服务方有设置retries,消费方可以不设置该参数.

4、dubbo:reference retries 的默认值和consumer一样,而consumer默认为2次

dubbo:consumer

retries

default.retries

int

可选

2

#--------以下为转载--------

1.超时设置

DUBBO消费端设置超时时间需要根据业务实际情况来设定,
如果设置的时间太短,一些复杂业务需要很长时间完成,导致在设定的超时时间内无法完成正常的业务处理。
这样消费端达到超时时间,那么dubbo会进行重试机制,不合理的重试在一些特殊的业务场景下可能会引发很多问题,需要合理设置接口超时时间。
比如发送邮件,可能就会发出多份重复邮件,执行注册请求时,就会插入多条重复的注册数据。

(1)合理配置超时和重连的思路

1.对于核心的服务中心,去除dubbo超时重试机制,并重新评估设置超时时间。
2.业务处理代码必须放在服务端,客户端只做参数验证和服务调用,不涉及业务流程处理

(2)Dubbo超时和重连配置示例

<!-- 服务调用超时设置为5秒,超时不重试--> 
<dubbo:service interface="com.provider.service.DemoService" ref="demoService"  retries="0" timeout="5000"/>

2.重连机制

dubbo在调用服务不成功时,默认会重试2次。
Dubbo的路由机制,会把超时的请求路由到其他机器上,而不是本机尝试,所以 dubbo的重试机器也能一定程度的保证服务的质量。
但是如果不合理的配置重试次数,当失败时会进行重试多次,这样在某个时间点出现性能问题,调用方再连续重复调用,
系统请求变为正常值的retries倍,系统压力会大增,容易引起服务雪崩,需要根据业务情况规划好如何进行异常处理,何时进行重试。

参考:https://www.cnblogs.com/binyue/p/5380322.html

补充:下面介绍下dubbo RPC 不能直接传递数组类型。

今天遇到一个大坑,提供的一个RPC接口批量查Redis数据,由于数据类型不定,采用<String,Object>的map作为返回类型,查到的结果集其中有一个是数组类型,代码没报问题,但一直RPC异常,各种狗屎的尝试排查,终于定位到问题。

最简单的解决方案是将所有的value都转化成String类型。

目测是dubbo序列化不允许直接传递数组类型,后面再研究。

到此这篇关于Dubbo retries 超时重试机制的问题的文章就介绍到这了!

Java/Android 相关文章推荐
Java方法重载和方法重写的区别到底在哪?
Jun 11 Java/Android
Java实战之用Swing实现通讯录管理系统
Jun 13 Java/Android
ConstraintValidator类如何实现自定义注解校验前端传参
Jun 18 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
springboot项目以jar包运行的操作方法
Jun 30 Java/Android
Java生成读取条形码和二维码的简单示例
Jul 09 Java/Android
Lombok的详细使用及优缺点总结
Jul 15 Java/Android
浅谈sql_@SelectProvider及使用注意说明
Aug 04 Java/Android
Java网络编程之UDP实现原理解析
Sep 04 Java/Android
Java并发编程之原子性-Atomic的使用
Mar 16 Java/Android
SpringBoot中获取profile的方法详解
Apr 08 Java/Android
Spring中bean集合注入的方法详解
Jul 07 Java/Android
Java数组详细介绍及相关工具类
Apr 14 #Java/Android
Java8利用Stream对列表进行去除重复的方法详解
Apr 14 #Java/Android
详解Flutter网络请求Dio库的使用及封装
Apr 14 #Java/Android
详细介绍Java中的CyclicBarrier
Apr 13 #Java/Android
Java8 Stream API 提供了一种高效且易于使用的处理数据的方式
Apr 13 #Java/Android
Java的Object类的九种方法
Apr 13 #Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 #Java/Android
You might like
用PHP生成自己的LOG文件
2006/10/09 PHP
PHP实现MVC开发得最简单的方法――模型
2007/04/10 PHP
比较简单实用的PHP无限分类源码分享(思路不错)
2011/10/13 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
AngularJS 单元测试(一)详解
2016/09/21 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
webpack4简单入门实例
2018/09/06 Javascript
写一个Vue Popup组件
2019/02/25 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python修改Excel数据的实例代码
2013/11/01 Python
python中使用pyhook实现键盘监控的例子
2014/07/18 Python
python在控制台输出进度条的方法
2015/06/20 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
Python实现图片转字符画的代码实例
2019/02/22 Python
python如何制作缩略图
2019/04/30 Python
python通过实例讲解反射机制
2019/10/17 Python
解决python DataFrame 打印结果不换行问题
2020/04/09 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
坎儿井导游词
2015/02/09 职场文书
党员年终个人总结
2015/02/14 职场文书
小学生读书笔记
2015/07/01 职场文书
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android