kafka學習筆記

消息中間件一般用于各個模塊、系統之間的異步通信,降低各個模塊之間的耦合性。


Kafka作為一個分布式的流平臺,這到底意味著什么?

我們認為,一個流處理平臺具有三個關鍵能力:

? ? 發布和訂閱消息(流),在這方面,它類似于一個消息隊列或企業消息系統。

? ? 以容錯的方式存儲消息(流)。

? ? 在消息流發生時處理它們。


什么是kakfa的優勢?

它應用于2大類應用:

? ? 構建實時的流數據管道,可靠地獲取系統和應用程序之間的數據。

? ? 構建實時流的應用程序,對數據流進行轉換或反應。

要了解kafka是如何做這些事情的,讓我們從下到上深入探討kafka的能力。

首先幾個概念:

? ? kafka作為一個集群運行在一個或多個服務器上。

? ? kafka集群存儲的消息是以topic為類別記錄的。

? ? 每個消息(也叫記錄record,我習慣叫消息)是由一個key,一個value和時間戳構成。

kafka有四個核心API:

? ? 應用程序使用Producer API發布消息到1個或多個topic(主題)。

? ? 應用程序使用Consumer API來訂閱一個或多個topic,并處理產生的消息。

? ? 應用程序使用Streams API充當一個流處理器,從1個或多個topic消費輸入流,并生產一個輸出流到1個或多個輸出topic,有效地將輸入流轉換到輸出流。

? ?Connector API允許構建或運行可重復使用的生產者或消費者,將topic連接到現有的應用程序或數據系統。例如,一個關系數據庫的連接器可捕獲每一個變化。


Kafka所使用的基本術語:

Topic

Kafka將消息種子(Feed)分門別類,每一類的消息稱之為一個主題(Topic).

Producer

發布消息的對象稱之為主題生產者(Kafka topic producer)

Consumer

訂閱消息并處理發布的消息的種子的對象稱之為主題消費者(consumers)

Broker

已發布的消息保存在一組服務器中,稱之為Kafka集群。集群中的每一個服務器都是一個代理(Broker). 消費者可以訂閱一個或多個主題(topic),并從Broker拉數據,從而消費這些已發布的消息。

Kafka的保證(Guarantees)

? ? 生產者發送到一個特定的Topic的分區上,消息將會按照它們發送的順序依次加入,也就是說,如果一個消息M1和M2使用相同的producer發送,M1先發送,那么M1將比M2的offset低,并且優先的出現在日志中。

????? ??? ??? ??消費者收到的消息也是此順序。

? ? 如果一個Topic配置了復制因子(replication factor)為N, 那么可以允許N-1服務器宕機而不丟失任何已經提交(committed)的消息。

kafka作為一個消息系統

Kafka的流與傳統企業消息系統相比的概念如何?

傳統的消息有兩種模式:隊列和發布訂閱。 在隊列模式中,消費者池從服務器讀取消息(每個消息只被其中一個讀取); 發布訂閱模式:消息廣播給所有的消費者。這兩種模式都有優缺點,隊列的優點是允許多個消費者瓜分處理數據,這樣可以擴展處理。但是,隊列不像多個訂閱者,一旦消息者進程讀取后故障了,那么消息就丟了。而發布訂閱允許你廣播數據到多個消費者,由于每個訂閱者都訂閱了消息,所以沒辦法縮放處理。

kafka中消費者組有兩個概念:隊列:消費者組(consumer group)允許同名的消費者組成員瓜分處理。發布訂閱:允許你廣播消息給多個消費者組(不同名)。

kafka的每個topic都具有這兩種模式。

kafka有比傳統的消息系統更強的順序保證。

傳統的消息系統按順序保存數據,如果多個消費者從隊列消費,則服務器按存儲的順序發送消息,但是,盡管服務器按順序發送,消息異步傳遞到消費者,因此消息可能亂序到達消費者。這意味著消息存在并行消費的情況,順序就無法保證。消息系統常常通過僅設1個消費者來解決這個問題,但是這意味著沒用到并行處理。

kafka做的更好。通過并行topic的parition ——kafka提供了順序保證和負載均衡。每個partition僅由同一個消費者組中的一個消費者消費到。并確保消費者是該partition的唯一消費者,并按順序消費數據。每個topic有多個分區,則需要對多個消費者做負載均衡,但請注意,相同的消費者組中不能有比分區更多的消費者,否則多出的消費者一直處于空等待,不會收到消息。


kafka的安裝和啟動

Zookeeper安裝

①、進入Zookeeper解壓目錄,C:\softdownload\zookeeper\conf

②、將“zoo_sample.cfg”重命名為“zoo.cfg”。

③、配置啟動日記目錄,用#注解調 dataDir=/tmp/zookeeper

dataDir=C:\\softdownload\\zookeeper\\data

④、系統環境變量中添加:ZOOKEEPER_HOME =?C:\softdownload\zookeeper

⑤、編輯系統變量path,加上: ZOOKEEPER_HOME%\bin;

⑥、確認zoo.cfg文件中默認的Zookeeper端口(默認端口2181)。

打開新的cmd,進入安裝目錄:cd C:\softdownload\zookeeper\bin,輸入zkserver,運行Zookeeper。

安裝Kafka

①、進入Kafka配置目錄,C:\softdownload\kafka\config

編輯文件“server.properties”

找到并用#注解“log.dirs=/tmp/kafka-logs”

添加自己的日記目錄:log.dirs=C:\softdownload\kafka\kafka-logs

②、如果Zookeeper在某些其他的機器或集群上運行,可以將“zookeeper.connect:2181”修改為自定義IP與端口。在這里使用了同一個機器,所以沒其他做修改。文件中的Kafka端口和broker.id也是可以配置的。默認設置不變。機器的localhost也為127.0.0.1,這里我也修改為ipv4的,防止localhost為ipv6時受影響。

③、Kafka會按照默認,在9092端口上運行,并連接zookeeper的默認端口:2181。

在zookeeper的基礎上,運行Kafka服務

進入Kafka安裝目錄,C:\softdownload\kafka,切換到命令行窗口,運行kafka。

輸入命令:.\bin\windows\kafka-server-start.bat .\config\server.properties

創建主題Topic

1. 現在創建主題,命名為“test”,replication factor=1(因為只有1個Kafka服務器在運行)。如果集群中所運行的Kafka服務器不止1個,可以相應增加replication-factor,從而提高數據可用性和系統容錯性。

2. 在C:\softdownload\kafka\bin\windows打開新的命令行。

3. 輸入下面的命令,回車:

kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

創建Producer及Consumer來測試服務器。

1.在C:\softdownload\kafka\bin\windows打開新的命令行。

2.輸入以下命令,啟動producer,可以輸入消息:

kafka-console-producer.bat --broker-list localhost:9092 --topic test

0.9版本以上新命令:.\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test --producer.config .\config\producer.properties

3.在同樣的位置C:\softdownload\kafka\bin\windows再次打開新的命令行。

4.現在輸入下列命令啟動consumer,可以獲取消息:

kafka-console-consumer.bat --zookeeper localhost:2181 --topic test

0.9版本以上新命令:.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test?--new-consumer --from-beginning --consumer.config .\config\consumer.properties

5.兩個命令行窗口,producer可以輸入任何消息,consumer可以獲取消息。

使用JavaAPI連接遠程服務器,要在service.properties配置host.name=192.168.111.111(遠程IP地址),這主要是因為,kafka默認是監聽localhost的端口,如果不配置新端口名的話,就解析監聽不到消息。


PS:上面總結的,有什么不足之處,歡迎更正補充。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、Kafka簡介 Kafka (科技術語)。Kafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者規...
    邊學邊記閱讀 1,766評論 0 14
  • 原文:InfoQ 作者 郭俊 簡介 Kafka是一種分布式的,基于發布/訂閱的消息系統。使用Scala編寫...
    小小少年Boy閱讀 397評論 0 1
  • 本文轉載自http://dataunion.org/?p=9307 背景介紹Kafka簡介Kafka是一種分布式的...
    Bottle丶Fish閱讀 5,491評論 0 34
  • 一、為什么需要消息系統 1.解耦: 允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。 2.冗...
    java成功之路閱讀 1,494評論 0 3
  • 前兩天的早晨7:00多一點,從睡夢中被電話吵醒。手機上顯示出一個陌生的手機號。還是摁下了接聽鍵,一個似乎狠熟悉的聲...
    左右中閱讀 89評論 0 0