“出租車(chē)”交互示例
讓我們仔細(xì)看看什么是 REST API。它基本上是一種交互模式瑞佩;系統(tǒng)可以相互交互的方式。
REST API 交互:
為了理解這兩種交互形式,讓我們考慮一個(gè)等效的現(xiàn)實(shí)生活用例潭千,即用戶從代理處訂購(gòu)出租車(chē)。
現(xiàn)在借尿,用戶問(wèn)這個(gè)問(wèn)題:“我的出租車(chē)什么時(shí)候到達(dá)刨晴?” 在 REST API 措辭中,請(qǐng)求的用戶是“消費(fèi)者”路翻,響應(yīng)的機(jī)構(gòu)或個(gè)人是“提供者”(又名“生產(chǎn)者”)
上面顯示的這種實(shí)時(shí)交互與REST API的工作方式完全匹配狈癞。它轉(zhuǎn)化為以下內(nèi)容:
現(xiàn)在讓我們換個(gè)問(wèn)題:“我的車(chē)準(zhǔn)備好了嗎?”
由于答案不是預(yù)期的茂契,消費(fèi)者將繼續(xù)直到他們最終收到預(yù)期的答案蝶桶。從人類的角度來(lái)看,這種情況是相當(dāng)重復(fù)和煩人的掉冶。
以上從消費(fèi)者到生產(chǎn)者的重復(fù)查詢集模仿了以下 API真竖。
REST API 限制
那么烫沙,這兩個(gè)例子有什么區(qū)別呢琳要?是時(shí)候了贮缅!
信息的價(jià)值隨著時(shí)間的推移而降低唇聘。但是,對(duì)于所有信息旁振,速率的下降并不相同获询。
讓我們?cè)倏匆幌隆按蜍?chē)”的例子來(lái)理解“信息價(jià)值與時(shí)間的比例”
駕駛室的估計(jì)到達(dá)時(shí)間可能僅在駕駛室到達(dá)之前是相關(guān)的。
最重要的是拐袜,當(dāng)用戶積極等待出租車(chē)以便及時(shí)到達(dá)某個(gè)地方時(shí)吉嚣,沒(méi)有什么比這個(gè)“你的車(chē)已經(jīng)到了”通知更重要了。而一旦行程開(kāi)始蹬铺,這個(gè)通知就沒(méi)有任何價(jià)值了尝哆。
還有很多其他此類實(shí)時(shí)場(chǎng)景,其中很少有:
- 股市
- 庫(kù)存
- 送餐服務(wù)
在很短的時(shí)間內(nèi)具有很高的價(jià)值甜攀。
一個(gè)人可以問(wèn)“我的騎行準(zhǔn)備好了嗎秋泄?”
機(jī)器很容易提供資源的狀態(tài),例如“準(zhǔn)備好/未準(zhǔn)備好”规阀。但預(yù)測(cè)(“10 分鐘內(nèi)到達(dá)”)很少見(jiàn)恒序。
要具有相關(guān)性,它必須是準(zhǔn)確的谁撼。如果它在預(yù)計(jì)的時(shí)間還沒(méi)有準(zhǔn)備好怎么辦歧胁?如果提前準(zhǔn)備好呢?這是一個(gè)非常復(fù)雜的問(wèn)題厉碟。它們是處理這個(gè)問(wèn)題的簡(jiǎn)單得多的方法喊巍。
如果我們能問(wèn)“什么時(shí)候準(zhǔn)備好告訴我”,問(wèn)題就迎刃而解了箍鼓。
REST API 交互模式意味著消費(fèi)者總是發(fā)起與提供者的交互崭参。這就是它的工作原理。因此款咖,使用 REST API 無(wú)法要求“知道它何時(shí)準(zhǔn)備就緒”何暮。你猜怎么著?
這正是事件驅(qū)動(dòng) API 提供的價(jià)值铐殃。
事件驅(qū)動(dòng)的 API 交互:
事件驅(qū)動(dòng)的 API 交互模式不同于 REST API海洼。我們將在下面看到,如何背稼。有多種形式,其中兩種流行的是:
- 網(wǎng)絡(luò)鉤子
- 流媒體
Webhook(用“taxi-ride”場(chǎng)景描述)
讓我們回到上面討論的“出租車(chē)”示例玻蝌。并使用“告訴我我的旅程何時(shí)準(zhǔn)備就緒”交互模式蟹肘。
我們可以在這里清楚地看到差異〈侍郏現(xiàn)在該事件由提供者(生產(chǎn)者)發(fā)起,在本例中為出租車(chē)代理帘腹。消費(fèi)者必須定義生產(chǎn)者可以調(diào)用的端點(diǎn)(即 URL)贰盗,以便將通知發(fā)送給消費(fèi)者。一旦信息準(zhǔn)備好阳欲,就會(huì)通知消費(fèi)者舵盈。
這種交互類型稱為Webhook,是異步 API 的首選樣式球化。
這種交互構(gòu)成了均勻驅(qū)動(dòng)架構(gòu)的基礎(chǔ)秽晚。
API 流式處理(用“出租車(chē)”場(chǎng)景描述)
讓我們稍微改變一下提供者的能力。而不是回答“準(zhǔn)備好/未準(zhǔn)備好”筒愚,現(xiàn)在的答案是出租車(chē)的當(dāng)前狀態(tài)赴蝇。
機(jī)器告訴資源狀態(tài)是很自然的。
這將允許另一種交互:API Streaming巢掺。
上面的API版本是:
消費(fèi)者實(shí)時(shí)接收狀態(tài)的每個(gè)變化句伶。
通常,Webhook旨在從應(yīng)用程序到應(yīng)用程序陆淀,而Streaming更針對(duì)于與用戶端的人進(jìn)行實(shí)時(shí)交互考余,直接實(shí)時(shí)消費(fèi)信息。
現(xiàn)在從微服務(wù)架構(gòu)模式的角度來(lái)看這個(gè)
設(shè)計(jì)微服務(wù)有不同的方法轧苫,本博客主要關(guān)注微服務(wù)架構(gòu)模式楚堤,請(qǐng)求驅(qū)動(dòng)和事件驅(qū)動(dòng)。
什么是微服務(wù)浸剩?
它是一個(gè)松耦合钾军、高度可測(cè)試、獨(dú)立部署绢要、定義清晰的業(yè)務(wù)領(lǐng)域邊界并由相對(duì)較小的團(tuán)隊(duì)輕松維護(hù)的應(yīng)用程序吏恭。
請(qǐng)求驅(qū)動(dòng)的微服務(wù)
電子商務(wù)應(yīng)用示例
優(yōu)點(diǎn)
- 有明確的流程控制,看編排器的代碼重罪,我們可以確定動(dòng)作的順序樱哼。
權(quán)衡取舍
- 單點(diǎn)故障 如果 Orchestrator 服務(wù)出現(xiàn)故障,這將是單點(diǎn)故障剿配。當(dāng)此服務(wù)關(guān)閉時(shí)搅幅,整個(gè)流程將不會(huì)執(zhí)行。
- 重播數(shù)據(jù)以進(jìn)行恢復(fù)并不容易 沒(méi)有簡(jiǎn)單的方法可以通過(guò)重新處理對(duì)依賴服務(wù)的失敗調(diào)用來(lái)恢復(fù)操作呼胚。
- 緊密耦合的服務(wù)(相對(duì)) 如果依賴服務(wù)之一出現(xiàn)故障茄唐,則很有可能排除對(duì)其他服務(wù)的調(diào)用。依賴服務(wù)的 Rest API 不能輕易修改。如果改變了沪编,API的消費(fèi)者也需要修改呼盆。因此,微服務(wù)不是松耦合的蚁廓。
事件驅(qū)動(dòng)的微服務(wù)
讓我們將之前的請(qǐng)求驅(qū)動(dòng)應(yīng)用程序轉(zhuǎn)換為事件驅(qū)動(dòng)的電子商務(wù)應(yīng)用程序访圃。
事件驅(qū)動(dòng)架構(gòu)的優(yōu)勢(shì)
- 松耦合服務(wù) 消息的生產(chǎn)者不需要知道哪個(gè)服務(wù)有興趣接收它。這使得以后在不影響現(xiàn)有功能的情況下添加附加功能變得更加容易相嵌。
- 異步 當(dāng)您發(fā)出一個(gè)事件時(shí)腿时,它是異步的,這意味著微服務(wù)可以立即繼續(xù)其工作饭宾,而無(wú)需等待事件的使用者完成批糟。這意味著事件峰值不會(huì)減慢用戶界面或其他關(guān)鍵功能。
- 可擴(kuò)展性 由于微服務(wù)專注于做好一件事而不與其他服務(wù)緊密耦合捏雌,因此您可以單獨(dú)擴(kuò)展具有最大工作負(fù)載的服務(wù)跃赚,以確保每個(gè)微服務(wù)的工作日志都是最新的。
- 恢復(fù) 事件是易于存儲(chǔ)的時(shí)間點(diǎn)事實(shí)性湿,并且與任何其他數(shù)據(jù)自然分離纬傲。
- 可維護(hù)性 事件可以通過(guò)重放事件日志簡(jiǎn)單地丟棄并用新模式重新填充。不再需要復(fù)雜的數(shù)據(jù)遷移肤频!
權(quán)衡取舍
- 沒(méi)有中央?yún)f(xié)調(diào) 器 沒(méi)有明確的中央位置(協(xié)調(diào)器)來(lái)定義整個(gè)流程叹括。
- 回滾很復(fù)雜 管理分布式事務(wù)可能很復(fù)雜。有多個(gè)服務(wù)消耗一個(gè)事件宵荒,因此汁雷,如果其中一個(gè)服務(wù)發(fā)生異常,那么整個(gè)流程應(yīng)該發(fā)生什么或?qū)崿F(xiàn)回滾過(guò)程是具有挑戰(zhàn)性的报咳。
結(jié)論
兩種模式都有好處侠讯,權(quán)衡取舍,它們的適用性還取決于用例暑刃。還可以根據(jù)應(yīng)用需求選擇使用混合架構(gòu)厢漩。但是,如果有機(jī)會(huì)實(shí)現(xiàn)事件驅(qū)動(dòng)的微服務(wù)岩臣,那肯定會(huì)為構(gòu)建松散耦合的微服務(wù)提供良好的基礎(chǔ)溜嗜。
本文使用 文章同步助手 同步