使用Apache Kafka對電子商務系統進行擴充套件的思路 - Bogdan
案例:我們正面臨一個以同步方式過度耦合到大量外部元件的遺留電子商務系統。由於這種高耦合度,我們的系統可能面臨多個問題,例如:
- 當需要時卻難以擴充套件
- 高負載下效能低
- 外部服務不可用造成的不可用
- 由於協調部署,難以維護
解決方案
下面將介紹針對上述場景的可能解決方案。它的靈感來自於構建資料密集型應用程式的一些設計原則。一些用於瞭解這些的更深入的資源可以是:
- Martin Kleppmann 的演講“徹底改變資料庫”
- Martin Kleppmann 的著作“設計資料密集型應用程式”和“理解流處理”
所提出的解決方案的主要思想是將所有主資料項轉換並聚合為單個派生項,該派生項隨後可以儲存到資料來源中並在需要時進行查詢。
由於我們已經使用Kafka生態系統來解決這個問題,最終的解決方案將是一個Kafka Streams 拓撲以及幾個Kafka Connect元件,這些元件將透過發件箱模式或更改資料捕獲的各種實現風格從資料來源中提取資料併發布將其傳送到 Kafka,以便在流應用程式中攝取。
流拓撲將使用產品 ID作為分割槽鍵來合併所有 Kafka 主題中存在的資料。所有合併連線的結果將釋出到 Kafka 主題中,然後可以寫入資料庫。
Kafka生產的資料聚合稱為SaleProduct,我們可以在SaleProduct資料庫之上構建一個新服務(REST API、GraphQL API)。前端應用程式可以查詢這個新端點,並且這個端點可以將產品作為響應提供服務,而無需任何中間處理。
結論
總之,讓我們重新審視我們的系統面臨的上述列舉的問題,看看其中是否仍然存在:
- “需要時難以擴充套件”——在當前的解決方案中,元件不再難以擴充套件,因為 Kafka 拓撲可以透過新增分割槽輕鬆擴充套件。我們可以為新的SaleProduct資料儲存選擇特定的資料庫技術,該技術也可以輕鬆擴充套件(例如:Cassandra 資料庫)。此外,SaleProduct API是一個簡單的無狀態服務,可以橫向擴充套件。
- “高負載下的低效能”——透過使用來自“本地”資料庫的單個查詢替換所有用於聚合資料的同步 HTTP 請求,將顯著提高高負載下的效能。此外,查詢不會執行任何Join連線,資料可以直接儲存在所需的表示中(例如:JSON、XML 等)。
- “由於外部服務不可用而產生的不可用”——如果在之前的場景中,外部元件的不可用會導致所謂的“產品服務”的不可用,在當前的解決方案中,這是已經被避免了,因為我們有資料已經儲存在我們的“本地”資料來源中。必須保持可用的單一元件必須是資料庫本身。
- “由於協調部署而難以維護”——這不再是一個問題,因為我們不再在空間或時間上與任何外部服務耦合。
不過,我必須說這不是一個高可用的解決方案,並且有兩個主要缺點:
- 面對最終一致性: 我們在CAP 定理中選擇A(可用性)和P(分割槽容限),我現在要說的是:使用這種方法,我們必須準備好面對最終的一致性!
- 資料治理:通常,在大型複雜企業中,很難像當前解決方案中那樣使用(檢索和派生)主資料和構建派生資料孤島。透過檢視Zhamak Dehghani 的資料網格,可以看到一些關於採用這種方法的概念。
相關文章
- 使用Kafka重新架構電子商務系統 - DinaKafka架構
- 如何使用 SEGW 的 redefine 功能對 SAP 標準 OData 服務進行擴充套件套件
- 如何從微服務角度建立可擴充套件的電子商務資料模型? - fabric微服務套件模型
- 擴充套件一下使用reduce的思路套件
- 用擴充套件的方式在 PHP 中使用 Kafka套件PHPKafka
- 對xxl-job進行simpleTrigger並動態建立任務擴充套件套件
- MemQ:可替代Kafka的高效、可擴充套件的雲原生PubSub系統MQKafka套件
- 使用LVM對系統盤進行擴容LVM
- windows系統磁碟擴容/擴充套件Windows套件
- Thinkphp實戰利用鉤子使用行為擴充套件 (Hook)PHP套件Hook
- dart系列之:你的地盤你做主,使用Extension對類進行擴充套件Dart套件
- Linux 檔案系統擴充套件Linux套件
- 使用KEDA和Kafka在 Kubernetes 上自動擴充套件 - PiotrKafka套件
- 擴充套件我們的分析處理服務(Smartly.io):使用 Citus 對 PostgreSQL 資料庫進行分片套件SQL資料庫
- LVM : 擴充套件檔案系統的容量LVM套件
- tf.tile()進行張量擴充套件套件
- Spring(11) - Introductions進行類擴充套件方法Spring套件
- 進行Windows Azure SQL Database的水平擴充套件GVWindowsSQLDatabase套件
- PHP 系統樹圖擴充套件元件PHP套件元件
- 單體系統如何實現動態演進擴充套件套件
- 百富收購電子支付服務公司擴充套件歐洲業務版圖套件
- Springboot執行緒池的使用和擴充套件Spring Boot執行緒套件
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- 讀構建可擴充套件分散式系統:方法與實踐15可擴充套件系統的基本要素套件分散式
- Activiti擴充套件的使用者任務屬性套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 擴充套件.Django-許可權系統套件Django
- [外掛擴充套件]系統主題管理套件
- Apache Cassandra——可擴充套件微服務應用程式的持久資料儲存Apache套件微服務
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- 汽車汽配行業B2B電子商務系統行業
- 可擴充套件性對物聯網管理系統有哪些影響?套件
- DoorDash使用 Kafka 和 Flink 構建可擴充套件的實時事件處理Kafka套件事件
- CentOS 系統下 PHP 怎麼新增擴充套件?CentOSPHP套件
- uboot和系統移植擴充套件--主Makefile分析boot套件
- MySQL中InnoDB引擎對索引的擴充套件MySql索引套件
- C++ 對C的擴充套件有哪些C++套件
- 如何重構CRM系統,滿足擴充套件的需求套件