作者:我爱技术交流 | 来源:互联网 | 2023-09-17 10:54
rpc服务设计经验:http:www.infoq.comcnpresentationssystem-stability-and-optimization-from-soa-plan
rpc服务设计
- 经验:http://www.infoq.com/cn/presentations/system-stability-and-optimization-from-soa-planning-and-managemen
包的划分
接口设计原则:
异常区分
接口设计
基于dubbo的问题
A服务–> B服务
中间网络异常:访问超时
B服务宕机:访问超时
B服务rpc框架异常:抛出rpc框架异常
B服务系统异常:内部异常或者业务异常
dubbo服务为例,默认重试2次,如果有多个提供值默认随机选另外一个,重试之内在调不通调用b服务跑出RpcException,如果配置上mock降级,返回null,看业务
dubbo服务化最佳实战
服务分为:原子服务(订单的crud等),核心(业务)服务,只做查询的查询服务等,接口 入参 出参 要明确 拒绝:Map query(Map)
RpcException问题看业务A—->B—>C,业务场景是否可以降级等
- 服务的配置尽量在服务提供者方面配置完善,考虑该服务相关问题
接口方法的是否重试,并发量,超时时间,是否mock, 复杂均衡策略,失效转移策略,综合接口是查询,幂等等考虑
分布式rpc调用分析
电商常用的 优惠券,订单服务, 支付服务
Paste_Image.png
三个独立的服务,单独的db库;先来考虑下单的服务调用
这里可以利用,消息队列的特性(保证消息至少成功消费一次),发一条添加刚才扣掉的优惠券消息
- 如果下单成功,就去支付,而此时支付成功但是返回结果的时候失败了?如何处理?一般此时的订单就在支付中的状态
支付失败,提示支付失败即可
- 分布式rpc调用三种状态: 失败,成功, 超时(可能成功可能失败需要特别思考)
分布式调用
非实时、非强一致性
- 走mq消息实现方式:同时做好防止重复消费,幂等性等
实时,强一致性
Paste_Image.png
将分布式事务,分解成多个本地事务,然后结合mq回滚
先创建一个状态为:不可见的订单,锁定优惠券(失败)发送废单消息
锁定优惠券成功,扣减库存(失败),也发送 废单消息
扣减库存成功修改订单为可见状态
只要是 废单消息 消息(回库存,回劵劵等)