在近期舉辦的qcon london大會上,ben stopford在他的演講中極力主張擁抱去集中化的思想、建構基于服務的系統,并通過流處理工具解決分布式狀态所引起的問題。
stopford目前任職于confluent,參與kafka的開發工作。對他來說,建構基于服務的系統的理由有很多,包括松耦合、邊界上下文、易于擴充等等,這些特性讓我們能夠建構出可以随着時間的推移而不斷改進的系統。但是,通過這種方式,我們實質上是在建立分布式的系統,而分布式系統自有其本身的複雜性,并且在延遲與故障等方面還存在着種種問題。
stopford描述了分布式系統的兩種基本模式:
以請求-響應的方式對服務進行解耦,通常使用rest的服務實作。它很适合于ui以及提問的場景。 事件驅動,這種模式的特征是異步的,或是“fire and forget”的消息傳遞。它非常适合于設計跨服務的複雜依賴。
這兩種模式可以結合使用,例如使用請求-響應模式實作一個rest接口,随後以事件的方式進行背景處理。
stopford随後對異步與基于事件的通信,例如隊列的使用展開了讨論。他認為這種模型非常簡單,隻要做到一次隻取出一條消息,就能夠保證消息的次序。即使将這一方式進行一定程度的擴充,仍然可以保證它的次序,但stopford指出,在某些情況下,我們或許會失去可用性或是次序的保證。他還指出了該方式的另一個缺點,即消息的存在是短期的,是以服務一旦出現故障,就無法回到之前的時間點再次讀取這些消息了。
stopford認為,更好的方法是使用某種分布式日志支援服務的開發,并以kafka為例。kafka是基于日志的概念而設計的,而日志是一種隻增的資料結構。是以讀寫操作都非常高效,對于讀操作來說,隻需定位到某個位置,并進行順序讀取。而對寫操作來說,所做的隻是簡單的添加而已。
分布式的日志系統還能夠為微服務帶來以下好處:
始終線上,這依賴于某種容錯的代理,例如kafka。 負載均衡,每個服務執行個體都将從一個代理中讀取資料。 容錯性,這是因為服務可能會産生故障轉移,但消息的次序仍然保持不變。 倒帶和回放,當系統發現了某個錯誤并修複之後,服務可以找回原始的消息,并進行回放。
但這種方式仍然有一個未解決的問題,即保持服務的一緻性。因為在系統發生故障等一些情況下,很難避免出現一些重複的消息(“即至少一次”的送出機制)。是以,服務在處理他們收到的消息時必須保證幂等性(idempotent)。從邏輯上說,這相當于建立了一種“正好一次”的送出機制。stopford表示,這一功能在kafka中尚未實作(但相關功能已經在開發中了)。
martin kleppmann在本次大會的另一場演講中也提到了服務一緻性的問題。
qcon的參會者已經可以欣賞stopford的演講了,而infoq的讀者很快也能夠欣賞到演講的内容。stopford同時也釋出了這次演講的幻燈片。
本文轉自d1net(轉載)