在近期舉辦的QCon London大會(huì)上,Ben Stopford在他的演講中極力主張擁抱去集中化的思想、構(gòu)建基于服務(wù)的系統(tǒng),并通過流處理工具解決分布式狀態(tài)所引起的問題。
Stopford目前任職于Confluent,參與Kafka的開發(fā)工作。對(duì)他來說,構(gòu)建基于服務(wù)的系統(tǒng)的理由有很多,包括松耦合、邊界上下文、易于擴(kuò)展等等,這些特性讓我們能夠構(gòu)建出可以隨著時(shí)間的推移而不斷改進(jìn)的系統(tǒng)。但是,通過這種方式,我們實(shí)質(zhì)上是在創(chuàng)建分布式的系統(tǒng),而分布式系統(tǒng)自有其本身的復(fù)雜性,并且在延遲與故障等方面還存在著種種問題。
Stopford描述了分布式系統(tǒng)的兩種基本模式:
以請(qǐng)求-響應(yīng)的方式對(duì)服務(wù)進(jìn)行解耦,通常使用REST的服務(wù)實(shí)現(xiàn)。它很適合于UI以及提問的場(chǎng)景。 事件驅(qū)動(dòng),這種模式的特征是異步的,或是“fire and forget”的消息傳遞。它非常適合于設(shè)計(jì)跨服務(wù)的復(fù)雜依賴。這兩種模式可以結(jié)合使用,例如使用請(qǐng)求-響應(yīng)模式實(shí)現(xiàn)一個(gè)REST接口,隨后以事件的方式進(jìn)行后臺(tái)處理。
Stopford隨后對(duì)異步與基于事件的通信,例如隊(duì)列的使用展開了討論。他認(rèn)為這種模型非常簡(jiǎn)單,只要做到一次只取出一條消息,就能夠保證消息的次序。即使將這一方式進(jìn)行一定程度的擴(kuò)展,仍然可以保證它的次序,但Stopford指出,在某些情況下,我們或許會(huì)失去可用性或是次序的保證。他還指出了該方式的另一個(gè)缺點(diǎn),即消息的存在是短期的,因此服務(wù)一旦出現(xiàn)故障,就無法回到之前的時(shí)間點(diǎn)再次讀取這些消息了。
Stopford認(rèn)為,更好的方法是使用某種分布式日志支持服務(wù)的開發(fā),并以Kafka為例。Kafka是基于日志的概念而設(shè)計(jì)的,而日志是一種只增的數(shù)據(jù)結(jié)構(gòu)。因此讀寫操作都非常高效,對(duì)于讀操作來說,只需定位到某個(gè)位置,并進(jìn)行順序讀取。而對(duì)寫操作來說,所做的只是簡(jiǎn)單的添加而已。
分布式的日志系統(tǒng)還能夠?yàn)槲⒎?wù)帶來以下好處:
始終在線,這依賴于某種容錯(cuò)的代理,例如Kafka。 負(fù)載均衡,每個(gè)服務(wù)實(shí)例都將從一個(gè)代理中讀取數(shù)據(jù)。 容錯(cuò)性,這是因?yàn)榉?wù)可能會(huì)產(chǎn)生故障轉(zhuǎn)移,但消息的次序仍然保持不變。 倒帶和回放,當(dāng)系統(tǒng)發(fā)現(xiàn)了某個(gè)錯(cuò)誤并修復(fù)之后,服務(wù)可以找回原始的消息,并進(jìn)行回放。但這種方式仍然有一個(gè)未解決的問題,即保持服務(wù)的一致性。因?yàn)樵谙到y(tǒng)發(fā)生故障等一些情況下,很難避免出現(xiàn)一些重復(fù)的消息(“即至少一次”的提交機(jī)制)。因此,服務(wù)在處理他們收到的消息時(shí)必須保證冪等性(idempotent)。從邏輯上說,這相當(dāng)于創(chuàng)建了一種“正好一次”的提交機(jī)制。Stopford表示,這一功能在Kafka中尚未實(shí)現(xiàn)(但相關(guān)功能已經(jīng)在開發(fā)中了)。
Martin Kleppmann在本次大會(huì)的另一場(chǎng)演講中也提到了服務(wù)一致性的問題。
QCon的參會(huì)者已經(jīng)可以欣賞Stopford的演講了,而InfoQ的讀者很快也能夠欣賞到演講的內(nèi)容。Stopford同時(shí)也發(fā)布了這次演講的幻燈片。
查看英文原文:Microservices for a Streaming World