作者 | A N M Bazlur Rahman
譯者 | 劉雅夢
策劃 | 丁曉昀
Baemin 是一家快速增長的送餐服務公司,它已經成功地從單體架構過渡到了更靈活的基於微服務的系統。這一轉變的基石是事件驅動架構的實現,這是 Baemin 架構之旅的一個方面,正如最近的一篇博客文章所描述的那樣。該架構的突出特點包括通過分層的事件訂閱者細緻地分離了關注點,以及戰略性地使用事件存儲來提高可靠性。Baemin 利用通用的關係數據庫管理系統(RDBMS)並採用事務發件箱模式(Transactional Outbox Pattern),構建了一個可擴展且可靠的健壯框架。
最初,Baemin 努力克服單體架構的局限性,但隨著公司規模的擴大,這種局限性變得越來越明顯。系統無法處理激增的流量和訂單,導致了大量的錯誤。向微服務的遷移於 2019 年 11 月完成,為下一階段奠定了基礎:採用事件驅動的架構。該架構對於實現各種微服務之間的松耦合、增強系統的彈性和靈活性至關重要。
Baemin 事件驅動架構的本質在於發布領域事件,而不是命令或請求。這種微妙但關鍵的區別可以減少不同系統之間的依賴關係。在傳統的基於命令的系統中,一個服務的更改可能需要另一個服務也進行更改,從而導致緊密耦合的架構。通過關注領域事件,Baemin 確保每個微服務獨立運行,並訂閱與其領域相關的事件。
在 Baemin 的事件驅動架構中,事件和訂閱者被組織為三層,以確保模塊化和可擴展性。第一層,應用程式事件和第一訂閱服務層,利用 Spring 框架的應用程式事件來管理內部、特定於領域的任務,並通過 AWS 簡單通知服務(SNS)發布這些事件。第二層,內部事件和第二訂閱服務層,處理的任務雖不是領域的核心,但卻是必不可少的。例如,在登錄過程中,該層負責一些次要任務,例如從其他設備中註銷。最後,第三層稱為外部事件和第三訂閱服務層,用於發布外部系統將使用的事件。這些事件是通用的,以避免創建與外部系統的依賴關係。這種分層的方法允許 Baemin 在保持松耦合架構的同時確保了每個微服務都能獨立運行。
事件驅動架構的挑戰之一是確保事件發布的可靠性。Baemin 通過引入事件存儲系統來解決這一問題。該存儲系統使用與其領域存儲相同的關係數據庫管理系統(RDBMS),從而確保了事務數據的一致性。事件存儲充當緩衝區,捕獲事件並確保它們能可靠地發布。
該架構採用事務發件箱模式(Transactional Outbox Pattern)來確保數據一致性和可靠的事件發布。此模式對領域數據和事件數據使用相同的存儲,從而實現可靠的事件發布機制。下圖是其最終的設計,展示了不同類型的事件、事件存儲系統和訂閱者層之間的交互。
儘管如此,最終的設計還是值得注意的,因為它通過不同層次的事件訂閱者細緻地分離了關注點。使用事件存儲來確保可靠性以及關注松耦合的領域事件是其突出的特點。
總而言之,Baemin 的架構轉型為解決規模問題的組織提供了豐富的見解。通過對事件訂閱者進行分層,並利用由通用 RDBMS 支持的事件存儲,Baemin 精心打造了一個不僅滿足其當前需求,而且非常適合未來的可擴展增強系統。
原文連結:
https://www.infoq.com/news/2023/09/delivery-hero-uses-eda/
GitHub 變 Twitter?強「喂」新推薦算法引公憤,開發者從「編程烏托邦」被驅趕到了信息繭房
小型開發者的生存之戰:Unity 想要我們的全部收入!我們要破產了
40 多名直接下屬、從不 1 對 1 溝通,老黃如此管理下的英偉達能在 AI 晶片領域稱霸多久?
AI 大模型熱潮來襲,看機密計算如何應對敏感數據安全挑戰
文章來源: https://twgreatdaily.com/f88f1041df6975813b6920da1f2bf5c3.html