rpc服務(wù)設(shè)計(jì)
- 經(jīng)驗(yàn):http://www.infoq.com/cn/presentations/system-stability-and-optimization-from-soa-planning-and-managemen
包的劃分
xxx-api : api給調(diào)用方使用
xxx-core:業(yè)務(wù)實(shí)現(xiàn) 【具體可以再分吧】
xxx-job: 任務(wù)
xxx-web :部署 maven profile環(huán)境【沒有統(tǒng)一的配置中心】
接口設(shè)計(jì)原則:
異常區(qū)分
rpc框架異常
系統(tǒng)異常
業(yè)務(wù)異常
接口設(shè)計(jì)
業(yè)務(wù)成功
是否重試 【rpc框架配置】
異常處理
基于dubbo的問題
A服務(wù)--> B服務(wù)
中間網(wǎng)絡(luò)異常:訪問超時(shí)
B服務(wù)宕機(jī):訪問超時(shí)
B服務(wù)rpc框架異常:拋出rpc框架異常
B服務(wù)系統(tǒng)異常:內(nèi)部異臣跸福或者業(yè)務(wù)異常
dubbo服務(wù)為例靶橱,默認(rèn)重試2次饱普,如果有多個(gè)提供值默認(rèn)隨機(jī)選另外一個(gè),重試之內(nèi)在調(diào)不通調(diào)用b服務(wù)跑出RpcException,如果配置上mock降級琉苇,返回null,看業(yè)務(wù)
dubbo服務(wù)化最佳實(shí)戰(zhàn)
分包: api,core柳畔,web; 建議將服務(wù)接口,服務(wù)模型郭赐,服務(wù)異常等均放在API包中
粒度:服務(wù)接口盡可能大粒度薪韩,每個(gè)服務(wù)方法應(yīng)代表一個(gè)功能,而不是某功能的一個(gè)步驟捌锭,否則將面臨分布式事務(wù)問題俘陷,
服務(wù)分為:原子服務(wù)(訂單的crud等),核心(業(yè)務(wù))服務(wù)观谦,只做查詢的查詢服務(wù)等拉盾,接口 入?yún)?出參 要明確 拒絕:Map query(Map)
版本:每個(gè)接口都應(yīng)該有版本號
兼容性: 服務(wù)接口增加方法,或服務(wù)模型增加字段坎匿,可向后兼容(刪除方法或刪除字段盾剩,將不兼容雷激,枚舉類型新增字段也不兼容,需通過變更版本號升級)
異常:處理RpcException框架異常告私,其他的不建議跑出異常屎暇,建議定義 code和msg描述問題,查找問題的時(shí)候在b服務(wù)的機(jī)器上面查詢驻粟,異常帶來反序列化等性能問題根悼,
RpcException問題看業(yè)務(wù)A---->B--->C,業(yè)務(wù)場景是否可以降級等
- 服務(wù)的配置盡量在服務(wù)提供者方面配置完善蜀撑,考慮該服務(wù)相關(guān)問題
接口方法的是否重試挤巡,并發(fā)量,超時(shí)時(shí)間酷麦,是否mock, 復(fù)雜均衡策略矿卑,失效轉(zhuǎn)移策略,綜合接口是查詢沃饶,冪等等考慮
分布式服務(wù)中母廷,所有的服務(wù)都可能不可靠,對一個(gè)服務(wù)內(nèi)的 調(diào)用確保一個(gè)服務(wù) 的相關(guān)業(yè)務(wù)
服務(wù)級別:細(xì)粒度服務(wù)提供數(shù)據(jù)操作糊肤,不涉及業(yè)務(wù)的基礎(chǔ)服務(wù)琴昆,以及業(yè)務(wù)聚合服務(wù),避免分布式事務(wù)
分布式rpc調(diào)用分析
電商常用的 優(yōu)惠券馆揉,訂單服務(wù)业舍, 支付服務(wù)
- 流程:
三個(gè)獨(dú)立的服務(wù),單獨(dú)的db庫升酣;先來考慮下單的服務(wù)調(diào)用
下單之前用戶必然要先選擇優(yōu)惠券舷暮,所以下單之前要調(diào)用扣減優(yōu)惠券走rpc調(diào)用(失敗到此結(jié)果提示扣減優(yōu)惠券失敗)噩茄,調(diào)用成功走用戶下單流程
如果下單失敗脚牍,必然要回滾扣掉的優(yōu)惠券,怎么操作巢墅?走rpc添加優(yōu)惠券,如果此時(shí)優(yōu)惠券服務(wù)超時(shí)了就添加不成功了
這里可以利用券膀,消息隊(duì)列的特性(保證消息至少成功消費(fèi)一次)君纫,發(fā)一條添加剛才扣掉的優(yōu)惠券消息
- 如果下單成功,就去支付芹彬,而此時(shí)支付成功但是返回結(jié)果的時(shí)候失敗了蓄髓?如何處理?一般此時(shí)的訂單就在支付中的狀態(tài)
支付失敗舒帮,提示支付失敗即可
- 分布式rpc調(diào)用三種狀態(tài): 失敗会喝,成功陡叠, 超時(shí)(可能成功可能失敗需要特別思考)
分布式調(diào)用
非實(shí)時(shí)、非強(qiáng)一致性
- 走mq消息實(shí)現(xiàn)方式:同時(shí)做好防止重復(fù)消費(fèi)肢执,冪等性等
實(shí)時(shí)枉阵,強(qiáng)一致性
- 參考蘑菇街創(chuàng)建訂單流程
將分布式事務(wù),分解成多個(gè)本地事務(wù)预茄,然后結(jié)合mq回滾
先創(chuàng)建一個(gè)狀態(tài)為:不可見的訂單兴溜,鎖定優(yōu)惠券(失敗)發(fā)送廢單消息
鎖定優(yōu)惠券成功耻陕,扣減庫存(失斪净铡),也發(fā)送 廢單消息
扣減庫存成功修改訂單為可見狀態(tài)
只要是 廢單消息 消息(回庫存诗宣,回劵劵等)