Kafka不是資料庫

2021-10-16 01:14:04 字數 1706 閱讀 7443

kafka 是一種訊息**,在過去幾年中迅速流行起來。訊息**已經存在很長時間了,它們是一種專門用於在生產者和消費者系統之間「緩衝」訊息的資料儲存。kafka 已經相當流行,因為它是開源的,並且能夠支援海量的訊息。

訊息**通常用於解耦資料的生產者和消費者。例如,我們使用乙個類似 kafka 的訊息**來緩衝客戶生成的 webhook,然後將它們批量載入到資料倉儲中。

在這個場景中,訊息**提供了從客戶傳送事件到 fivetran 將它們載入到資料倉儲之間的事件持久儲存。

但是,kafka 有時候也被描述為是一種比訊息**更大的東西。這個觀點的支持者將 kafka 定位為一種全新的資料管理方式,kafka 取代了關聯式資料庫,用於儲存事件的最終記錄。與讀寫傳統資料庫不同,在 kafka 中,先是追加事件,然後從表示當前狀態的下游檢視中讀取資料。這種架構被看成是對「資料庫的顛覆」。

原則上,以一種同時支援讀和寫的方式實現這個架構是有可能的。但是,在這個過程中,最終會遇到資料庫管理系統幾十年來遇到的所有難題。你或多或少需要在應用程式層開發乙個功能齊全的 dbms,而你可能不會做得太好,畢竟乙個資料庫需要很多年才能做好。你需要處理髒讀、幻讀、寫偏移等問題,還要應付匆忙實現的資料庫存在的所有其他問題。

acid 困境

將 kafka 作為資料儲存的乙個最基本的問題是它沒有提供隔離機制。隔離意味著在全域性內,所有事務(讀和寫)都是沿著某些一致的歷史記錄發生的。

檢查使用者購物車中每個物品的庫存水平。

如果某個物品沒有庫存,則中止結賬。

如果所有物品都有庫存,從庫存中減去它們,並確認。

假設我們使用 kafka 來實現這個流程。我們的架構可能看起來像這樣:

我們現在遇到的問題叫做寫偏移。當結賬事件被處理時,從庫存檢視中讀取的資料可能已經過時。如果兩個使用者同時嘗試購買相同的物品,他們都將購買成功,那麼我們便沒有足夠的庫存**給他們。

這種基於事件溯源的架構存在很多類似這樣的隔離異常,讓使用者感到很困惑。更糟糕的是,研究表明,允許異常存在的架構也存在安全漏洞,給了黑客竊取資料的機會。

將 kafka 作為傳統資料庫的補充

如果你只是將 kafka 作為傳統資料庫的補充,這些問題就可以避免:

當使用資料庫作為資料入口,從資料庫讀取事件的最佳方法是通過 cdc(變更資料捕獲)。市場上有幾個很棒的 cdc 框架,例如 debezium和 maxwell,以及來自現代 sql 資料庫的原生 cdc。cdc 還提供了優雅的運維解決方案。在進行資料恢復時,可以清除下游的所有內容,並從(持久化的)oltp 資料庫重新構建。

不要隨意構建錯誤的資料庫

幾十年來,資料庫社群已經總結了一些重要的經驗教訓。這些教訓都是在造成資料損壞、資料丟失和讓使用者遭受損失的情況下獲得的,並為此付出了慘重的代價。如果你不小心構建了乙個錯誤的資料庫,那麼你會發現自己只不過是在重新經歷這些經驗教訓。

實時流式訊息**是管理快速變化的資料的乙個很好的工具,但你仍然需要乙個傳統的 dbms 來實現事務隔離。要實現乙個「顛覆性的資料庫」,可以使用 oltp 資料庫進行准入控制,使用 cdc 進行事件生成,並將資料的下游副本變成物化檢視。

[點這裡:2020python高薪實戰學習大合集](

[拿走不謝!python 3.9 官方中文文件,限時領!] (

[限時!速領!14張高畫質python速查表,效率提公升必備!] (

[github標星3w+,80個python案例,帶你輕鬆玩轉python學習!] (

Mongo DB是不是資料庫?

與關係型資料庫相比,mongodb的缺點 1 mongodb不支援事務操作。所以事務要求嚴格的系統 如果銀行系統 肯定不能用它。這點和優點 1 是對應的 2 mongodb占用空間過大 關於其原因,在官方的faq中,提到有如下幾個方面 1 空間的預分配 為避免形成過多的硬碟碎片,mongodb每次空...

Kafka從SQL Server資料庫同步資料

前提 已安裝 vmware station,linux centos xshell,xftp,zookeeper,kafka 一 安裝confluent的connector 開始安裝 1 解壓至 kafka home connector 資料夾下,kafka home本人的是 usr local k...

不是什麼時候都需要資料庫

記得kent beck寫tdd的時候曾經不用資料庫,而moin沒有資料庫。其實沒有什麼好奇怪,在簡單的情況下 當然以前我也說過,在最要求極端效能的情況下 資料庫都是不能滿足要求的 簡單的情況下,資料庫顯得過於複雜,沒有檔案簡單。而在效能要求的情況下資料庫沒有檔案直接訪問效能把握起來簡單 我們經常說的...