1. 程式人生 > >【圖文詳細 】Kafka訊息佇列——Kafka 的各種 API 操作

【圖文詳細 】Kafka訊息佇列——Kafka 的各種 API 操作

7.1、Kafka 的 API 分類 

1、The Producer API  允許一個應用程式釋出一串流式的資料到一個或者多個 Kafka Topic。 
 
2、The Consumer API  允許一個應用程式訂閱一個或多個 Topic ,並且對釋出給他們的流式資料進行處理。 
 
3、The Streams API  允許一個應用程式作為一個流處理器,消費一個或者多個 Topic 產生的輸入流,然後生產一 個輸出流到一個或多個 Topic 中去,在輸入輸出流中進行有效的轉換。 
 
4、The Connector API  允許構建並執行可重用的生產者或者消費者,將 Kafka Topic 連線到已存在的應用程式或者數 據系統。比如,連線到一個關係型資料庫,捕捉表(table)的所有變更內容。 

http://kafka.apache.org/11/documentation.html#producerapi

7.2、Kafka 的 Message 消費語義 

資料傳輸的事務定義通常有以下三種級別:

最多一次(At most once): 訊息不會被重複傳送,最多被傳輸一次,但也有可能漏傳

最少一次(At least one): 訊息不會被漏傳送 ,最少被傳輸一次,但也有可能被重複傳輸

精確的一次(Exactly once): 不會漏傳輸也不會重複傳輸,每個訊息都傳輸被一次而且僅僅 被傳輸一次,這是大家所期望的 
 
大多數訊息系統聲稱可以做到“精確的一次”,但是仔細閱讀它們的的文件可以看到裡面存 在誤導,比如沒有說明當 consumer 或 producer 失敗時怎麼樣,或者當有多個 consumer 並 行時怎麼樣,或寫入硬碟的資料丟失時又會怎麼樣。kafka 的做法要更先進一些。當釋出消 息時,Kafka 有一個“committed”的概念,一旦訊息被提交了,只要訊息被寫入的分割槽的所 在的副本 broker 是活動的,資料就不會丟失。如果 producer 釋出訊息時發生了網路錯誤, 但又不確定實在提交之前發生的還是提交之後發生的,這種情況雖然不常見,但是必須考慮 進去,現在 Kafka 版本還沒有解決這個問題,將來的版本正在努力嘗試解決。 
 
並不是所有的情況都需要“精確的一次”這樣高的級別,Kafka 允許 producer 靈活的指定級 別。比如 producer 可以指定必須等待訊息被提交的通知,或者完全的非同步傳送訊息而不等 待任何通知,或者僅僅等待 leader 宣告它拿到了訊息(followers 沒有必要)。 
 
現在從 consumer 的方面考慮這個問題,所有的副本都有相同的日誌檔案和相同的 offset,consumer 維護自己消費的訊息的 offset,如果 consumer 不會崩潰當然可以在記憶體中儲存這 個值,當然誰也不能保證這點。如果 consumer 崩潰了,會有另外一個 consumer 接著消費 訊息,它需要從一個合適的 offset 繼續處理。這種情況下可以有以下選擇: 
 
consumer 可以先讀取訊息,然後將 offset 寫入日誌檔案中,然後再處理訊息。這存在一種 可能就是在儲存 offset 後還沒處理訊息就 crash 了,新的 consumer 繼續從這個 offset 處理, 那麼就會有些訊息永遠不會被處理,這就是上面說的“最多一次”。 
 
consumer 可以先讀取訊息,處理訊息,最後記錄 offset,當然如果在記錄 offset 之前就 crash 了,新的 consumer 會重複的消費一些訊息,這就是上面說的“最少一次”。 
 
“精確一次”可以通過將提交分為兩個階段來解決:儲存了 offset 後提交一次,訊息處理成 功之後再提交一次。但是還有個更簡單的做法:將訊息的 offset 和訊息被處理後的結果儲存 在一起。比如用 Hadoop ETL 處理訊息時,將處理後的結果和 offset 同時儲存在 HDFS 中,這 樣就能保證訊息和 offser 同時被處理了。 

7.3、Kafka 生產者 Java API 

 見程式碼 KafkaProducer JavaDoc: 

http://kafka.apache.org/11/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProduc er.html

7.4、Kafka 消費者 Java API 

KafkaConsumer JavaDoc:

http://kafka.apache.org/11/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsu mer.html 


 
Kafka 提供了兩套 API 給 Consumer

1、The high-level Consumer API

2、The SimpleConsumer API 
 
第一種高度抽象的 Consumer API,它使用起來簡單、方便,但是對於某些特殊的需求我們可 能要用到第二種更底層的 API 那麼先介紹下第二種 API 能夠幫助我們做哪些事情