在各類系統(tǒng)設(shè)計(jì)中我們經(jīng)常會(huì)使用這兩者做信息的傳遞喉誊、系統(tǒng)的解耦,但是很難說(shuō)出在什么場(chǎng)景上我們使用標(biāo)準(zhǔn)服務(wù)接口纵顾,什么場(chǎng)景使用標(biāo)準(zhǔn)消息伍茄,好像是都可以用。尤其在平臺(tái)系統(tǒng)需要支撐各類業(yè)務(wù)場(chǎng)景的設(shè)計(jì)上施逾,這類問(wèn)題往往會(huì)是一個(gè)很難權(quán)衡的點(diǎn)敷矫。我們先看一下這兩種方式的特點(diǎn)(并非是優(yōu)缺點(diǎn))。
標(biāo)準(zhǔn)服務(wù)接口交互
高時(shí)效:耗時(shí)即為方法處理時(shí)間
強(qiáng)一致:理論意義上的強(qiáng)一致汉额,直接接口調(diào)用為強(qiáng)一致曹仗,soa調(diào)用需要分布式事務(wù)支持,明確能得到執(zhí)行結(jié)果蠕搜,對(duì)執(zhí)行結(jié)果有后續(xù)處理
語(yǔ)義清晰:有較清晰的函數(shù)名怎茫、參數(shù)、返回值以及類型妓灌,執(zhí)行目的一目了然
強(qiáng)耦合:受下游服務(wù)SLA影響而波動(dòng)
擴(kuò)展性低:對(duì)接不同業(yè)務(wù)時(shí)需要增加代碼/配置以調(diào)用不同的邏輯實(shí)現(xiàn)
標(biāo)準(zhǔn)消息交互
弱耦合:僅僅是數(shù)據(jù)的依賴轨蛤,無(wú)系統(tǒng)依賴
流量緩沖:可以積壓防止下游服務(wù)承接不住
擴(kuò)展性高:消息能夠被多個(gè)使用方訂閱而不需要上游系統(tǒng)有任何變更
無(wú)交互:僅僅是數(shù)據(jù)的傳遞,執(zhí)行結(jié)果和上游服務(wù)無(wú)關(guān)
再回到我們的系統(tǒng)設(shè)計(jì)上虫埂,需要申明一點(diǎn)的是沒(méi)有最好的設(shè)計(jì)祥山,只有最適合的設(shè)計(jì)。以內(nèi)容創(chuàng)作的場(chǎng)景來(lái)舉例掉伏,用戶投稿的過(guò)程中判斷內(nèi)容的安全性即時(shí)提醒用戶安全風(fēng)險(xiǎn)沒(méi)風(fēng)險(xiǎn)則上傳至平臺(tái)并推薦給其他用戶缝呕,這種方式可以做到最佳的用戶體驗(yàn)澳窑。但是以我們現(xiàn)在的安全把控粒度我們需要檢查內(nèi)容是否涉黃、涉暴岳颇、自殺自殘等很多違反社區(qū)規(guī)范的行為照捡,整個(gè)模型、策略執(zhí)行下來(lái)早已超出2话侧、3分鐘之外栗精。對(duì)于強(qiáng)體驗(yàn)的C端應(yīng)用來(lái)說(shuō)真的無(wú)法容忍≌芭簦基于這個(gè)技術(shù)限制的背景悲立,所以就需要反向推動(dòng)安全檢測(cè)能力和投稿能力獨(dú)立,內(nèi)容安全業(yè)務(wù)負(fù)責(zé)檢查內(nèi)容的安全性新博,投稿業(yè)務(wù)負(fù)責(zé)保障用戶能夠把內(nèi)容上傳到平臺(tái)并保障其體驗(yàn)薪夕。也就有了用戶先上傳內(nèi)容,安全檢查異步進(jìn)行這種方式赫悄。
用戶的積分系統(tǒng)
一般而言用戶積分的積累可由很多種途徑獲取原献,比如下單、評(píng)論埂淮、分享等姑隅,積分和訂單是兩個(gè)完全不相關(guān)的領(lǐng)域,積分的過(guò)程也無(wú)須對(duì)下單等流程有影響倔撞,甚至說(shuō)不應(yīng)該感受到有積分的存在讲仰,為了做到這一點(diǎn)可以通過(guò)訂閱交易下單等業(yè)務(wù)的動(dòng)作事件來(lái)完成積分的統(tǒng)計(jì)。
開(kāi)放平臺(tái)
一般和有一些研發(fā)能力的外部業(yè)務(wù)方合作時(shí)痪蝇,就會(huì)使用到開(kāi)放平臺(tái)來(lái)把平臺(tái)的一部分能力提供給合作方鄙陡,由開(kāi)放平臺(tái)提供開(kāi)發(fā)者認(rèn)證管理以及統(tǒng)一的鑒權(quán)、路由轉(zhuǎn)發(fā)等躏啰,舉個(gè)較為常用的電商商品管理的場(chǎng)景趁矾,第三方開(kāi)發(fā)者在淘寶平臺(tái)經(jīng)營(yíng)了一家淘寶店,想通過(guò)自己的ERP系統(tǒng)同步管理淘寶店的商品并且能夠直接給商品做滿減活動(dòng)给僵,第三方在上傳商品的時(shí)候需要明確知道淘寶商品也已上傳成功且返回商品id愈魏,創(chuàng)建活動(dòng)也是類似要求,最后需要將淘寶商品id和活動(dòng)id做關(guān)聯(lián)想际。所以開(kāi)放平臺(tái)場(chǎng)景上需要同步請(qǐng)求內(nèi)部系統(tǒng)培漏,并且返回相關(guān)數(shù)據(jù)。
有沒(méi)有這兩種方式結(jié)合的場(chǎng)景呢胡本?即既有用標(biāo)準(zhǔn)接口又用標(biāo)準(zhǔn)數(shù)據(jù)的場(chǎng)景牌柄?
全鏈路打點(diǎn)系統(tǒng)
我們以美團(tuán)開(kāi)源的分布式監(jiān)控系統(tǒng)Cat來(lái)舉例,Cat是一個(gè)實(shí)時(shí)和接近全量的監(jiān)控系統(tǒng)侧甫,為美團(tuán)各業(yè)務(wù)線提供系統(tǒng)的性能指標(biāo)珊佣、健康狀況蹋宦、監(jiān)控告警等,Cat在整體的設(shè)計(jì)上有一些要求
- 故障容忍:CAT本身故障不應(yīng)該影響業(yè)務(wù)正常運(yùn)轉(zhuǎn)咒锻,CAT掛了冷冗,應(yīng)用不該受影響,只是監(jiān)控能力暫時(shí)減弱
- 高吞吐惑艇,準(zhǔn)實(shí)時(shí):為快速發(fā)現(xiàn)故障蒿辙、快速定位故障提供時(shí)效性
此外在監(jiān)控和性能分析功能上有如下場(chǎng)景要求: - 一段代碼的執(zhí)行時(shí)間,一段代碼可以是URL執(zhí)行耗時(shí)滨巴,也可以是SQL的執(zhí)行耗時(shí)思灌。
- 一段代碼的執(zhí)行次數(shù),比如拋出異常記錄次數(shù)恭取,或者一段邏輯的執(zhí)行次數(shù)泰偿。
- 定期執(zhí)行某段代碼,比如定期上報(bào)一些核心指標(biāo):內(nèi)存使用率蜈垮、GC耗跛、線程數(shù)等指標(biāo)。
-
關(guān)鍵的業(yè)務(wù)監(jiān)控指標(biāo)攒发,比如監(jiān)控訂單數(shù)调塌、交易額、支付成功率等晨继。
所以希望用戶的打點(diǎn)需要有明確場(chǎng)景含義才能夠方便后續(xù)的數(shù)據(jù)收集及處理上針對(duì)不同場(chǎng)景做聚合烟阐、計(jì)算搬俊。Cat為上述場(chǎng)景設(shè)計(jì)了四類帶有明確含義的接口Cat.newTransaction紊扬、Cat.logEvent、Cat.MetricForCount唉擂、Cat.MetricForDuration餐屎,并通過(guò)SDK供業(yè)務(wù)研發(fā)集成使用。
再介紹一個(gè)比較常見(jiàn)的任務(wù)提交到反饋的場(chǎng)景玩祟,有一個(gè)比較明顯的不同點(diǎn)是系統(tǒng)需要讓下游做一件比較耗時(shí)的任務(wù)腹缩,同時(shí)也希望獲得任務(wù)運(yùn)行的結(jié)果,比如BI報(bào)表生成空扎。通常是提交任務(wù)時(shí)實(shí)時(shí)返回任務(wù)id藏鹊,表示任務(wù)提交成功,內(nèi)部執(zhí)行完耗時(shí)的任務(wù)后再去通知業(yè)務(wù)系統(tǒng)转锈。
任務(wù)作業(yè)系統(tǒng)
總結(jié)
當(dāng)明確想要讓這個(gè)系統(tǒng)幫你“做”“什么”盘寡,并且關(guān)心這個(gè)系統(tǒng)的“結(jié)果”,如果對(duì)時(shí)效有要求那就建議使用用標(biāo)準(zhǔn)服務(wù)接口進(jìn)行交互撮慨,如果對(duì)時(shí)效無(wú)要求則可以參考任務(wù)作業(yè)系統(tǒng)竿痰,通過(guò)標(biāo)準(zhǔn)的服務(wù)接口交互快速返回脆粥,在有結(jié)果后通過(guò)回調(diào)告知業(yè)務(wù)系統(tǒng)。
當(dāng)僅僅是做數(shù)據(jù)傳遞及事件感知影涉,不想對(duì)上游系統(tǒng)有影響也不需要上游知道是否有這樣的系統(tǒng)存在变隔,則通過(guò)標(biāo)準(zhǔn)消息或事件來(lái)交互,如果在業(yè)務(wù)邏輯處理的過(guò)程中希望對(duì)該數(shù)據(jù)有有確含義的處理但并不想影響自身系統(tǒng)蟹倾,則可以參考Cat監(jiān)控系統(tǒng)匣缘,通過(guò)sdk對(duì)明確對(duì)數(shù)據(jù)的加工方式再提交到下游系統(tǒng)。