RPC(Remote Procedure Call Protocol):远程过程调用
RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
Dubbo
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。
Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
Dubbo的超时机制
超时策略:
1.客户端
当消费端发起一次请求后,如果在规定时间内未得到服务端的响应则直接返回超时异常,但服务端的代码依然在执行。
<dubbo:consumer timeout="1000"></dubbo:consumer>
2.服务端
当消费端发起一次请求后,一直等待服务端的响应,服务端在方法执行到指定时间后如果未执行完,此时返回一个超时异常给到消费端。
<dubbo:provider retries="0" threads="500" dispatcher="message" threadpool="cached" filter="timeout" timeout="2000"/>
Dubbo的重试机制
dubbo的重试策略
1.客户端
<dubbo:reference id="xxxx" interface="xx" check="true" async="false" retries="1" timeout="2000"/>
<dubbo:method name="listOrderByQuery" retries="2"/>
可以对retries 可设置重试次数,默认为2次,
<dubbo:reference interface="" check="false" id="OrderService" registry="" group="${referenceGroup}" version="1.0.0">
<dubbo:method name="listOrderByQuery" retries="2"/>
<dubbo:method name="getRecord" retries="2"/>
<dubbo:method name="getOrderById" retries="2"/>
</dubbo:reference>
也可以对某个方法单独去设置重试次数
重试次数需要谨慎考虑,可能会带来数据重复问题,比如说金融行业,对用户金额重复操作。
方案:
1.对于核心的服务中心,去除dubbo超时重试机制,并重新评估设置超时时间。
(1)、去掉超时重试机制
<dubbo:provider delay="-1" timeout="6000" retries="0"/>
(2)、重新评估设置超时时间
<dubbo:service interface="*.*" ref="*" timeout="延长服务时间"/>
2.业务处理代码必须放在服务端,客户端只做参数验证和服务调用,不涉及业务流程处理,对操作数据进行幂等处理,保证流程的唯一性。
网友评论