消息中間件一般用于各個模塊、系統之間的異步通信,降低各個模塊之間的耦合性。
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:上面總結的,有什么不足之處,歡迎更正補充。