「把 Kafka 做爲長期存儲有問題嗎?」 這是一個很是常見的問題,咱們知道,只要把數據保留時間設置爲「永久」,或者開啓日誌壓縮,數據就會被一直保存sql
把數據長期存儲在 Kafka,這個作法並不瘋狂,不少人已經在這麼用,而且 Kafka 的設計中也涵蓋了這種用法,下面是一些實際應用的場景數據庫
(1)你有一個應用,使用了事件模式,並須要對變動日誌進行存儲,理論上可使用不少系統來存儲日誌,可是 Kafka 直接解決了不少此類場景的問題,例如日誌的不可變,紐約時報就使用 Kafka 來存儲他們全部文章的數據api
(2)在應用中有一個內存緩存,數據源於 Kafka,這時能夠把 Kafka topic 中的日誌壓縮,應用從新啓動時,從偏移量爲0的位置從新讀取數據到緩存緩存
(3)須要對來自 Kafka 的流數據進行流計算,當流計算邏輯發生變化時,咱們但願從新計算一遍,這時就能夠把偏移量置爲0,重頭計算分佈式
(4)Kafka 常被用於捕獲數據庫的變動,關心數據變化的應用就能夠從中獲取變動記錄,作相應的業務操做,這時出現了一個新的應用,須要所有的數據快照,若是對一個大型產品數據執行全量 dump 操做是不現實的,很是耗時,但咱們能夠對 Kafka 中的記錄在0偏移量從新加載一遍性能
這些長期存儲的場景都是真實可行的,由於 Kafka 就是這麼設計的spa
數據在 Kafka 中是持久化到硬盤的,有數據檢查,有多副原本容錯,而且持續累加的數據不會使性能變慢設計
實際應用案例中,已經有存儲 PB 量級數據的 Kafka cluster 在運行日誌
人們之因此對 kafka 長期存儲數據的用法存在疑慮,是由於咱們一般認爲 kafka 是一個消息隊列隊列
使用「消息隊列」時有一個原則:不要在消息隊列中存儲消息
由於,讀消息時就要移除這個消息、消息系統的擴張能力不足、消息系統也缺乏強壯的複製特性
傳統消息系統不重視消息的存儲,而 kafka 認爲這點是很是關鍵的,認爲消息系統的基礎功能就是存儲,即便一個消息很快被消費,那也是須要短暫的存儲,必需要保證消費者可以接收到消息,必須提供容錯存儲機制
因此,kafka 的設計中有如下特色:
kafka 存儲可被從新讀取的持久數據
kafka 是一個分佈式系統,以 cluster 形式運行,能夠彈性的擴展和縮減,有容錯複製系統,具備高可用性
kafka 容許實時的數據流處理,而不是一次處理一條消息
kafka 已經不是一個傳統的消息隊列,而應該歸類到「流處理平臺」
既然 kafka 這麼牛,很適合長期儲存,那麼 kafka 會不會發展爲一個數據庫呢?
答案是不會,主要緣由有2個:
數據庫主要是關於查詢的,kafka 是順序讀寫機制,若是加入隨機訪問機制,對 kafka 沒有什麼好處
kafka 的發展目標不在於成爲第1001個數據庫,而是要成爲主流的流數據處理平臺,成爲現代數字業務中的核心繫統
kafka 已經不是一個簡單的消息系統,kafka 在不斷壯大,有 connector 能夠方便的鏈接其餘系統,有 stream api 進行流計算,最近又推出 KSQL,流處理的代碼都不用咱們寫了,用 sql 就能夠方便的進行流處理