介紹kafka基本原理,以及用Golang實現一個kafka的publisher和consumer
什麼是Kafka
Kafka是一種分散式,基於pub/sub模式的消息隊列 (Message Queue,簡稱MQ)。
消息隊列
消息隊列 (Message Queue)顧名思義就是一個存放消息(Message)的佇列(Queue),主要用來幫助兩個不同服務間的溝通。
在消息隊列的架構中通常由 Producer, Message Queue 和 Consumer所組成。
- 生產者 (Producer): 負責生產消息的服務
- 消息隊列 (Message Queue): 負責存放生產者消息的佇列
- 消費者 (Consumer): 負責消費佇列中消息的服務
消息隊列有兩種模式
- 點對點模式: 一對一的模式,消費者主動拉取消息,收到後就把消息刪掉,一個消息只能給一個消費者使用。
- 發布/訂閱模式 (pub/sub): 很多個消費者訂閱某個主題,消費者會主動去拉取隊列,看有沒有想要的消息。好處是消費者可以根據自己的消費速度來拉取資料,壞處是沒辦法即時獲取消息,而且不斷輪詢也會耗費資源。在這種模式下消費者消費完不會清除消息,消息會在自己設定的時限後刪掉。
使用Message Queue的優點 (TODO)
- 將兩個服務解耦合,當某個服務壞掉時,不會影響整個系統
- 讓請求變成Async,先回response接著才做事情
- 緩衝request,用於生產大於消費的狀況
- 放到queue中可保證順序,當高併發時會很好處理
Kafka架構與專有名詞解釋 (8)
Kafka架構由四個組件組成
- Producer (生產者): 負責發送消息到 kafka broker
- Consumer (消費者): 負責消化 kafka broker 中的消息
- Kafka Broker: 執行kafka程序的機器,可以將多台broker組合成一個kakfa cluster。
- Zookeeper: 控制中心,負責管理及維護kafka cluster的狀態
Kafka 相關名詞
- Topic: kafka會將不同種類的資料放在不同的Topic中。
- Partition:
1. 一個Topic可以分成很多個Partition,每個Partition會存在於不同的
broker,讓kafka可以做負載均衡。
Ex: 生產者產生了Topic1的兩個消息,他會將第一個消息丟到Topic1的Partition 0,第二個消息就可能會丟到Topic1的Partition1中。
2. 每個Partition中又可分成leader和follower,leader負責接受與傳送消息以及複製一份資料到follower中。follower只負責備份。
3. 不同Partition中放的資料會不一樣,在同一個Partition中資料是有序的。
- Offset: 每個Partition中都會用offset來標記目前消費者已經取到哪一個資料了,是kafka用來保證partition內順序的機制。
- Consumer group: 將很多個Consumer組合成一個Consumer Group,可以增加消費者的消費能力,但有個限制是同個Group中的Consumer不能消費同一個Partition的資料,否則會有拿取同一份資料,並且處理兩次的問題。
總整理
- (藍箭頭) producer只會傳送到每個Partition的leader
- (綠箭頭) leader會複製資料到follower中
- (橘箭頭) 同一個consumer group 中的consumer,必須消費不同partition的資料
Kafka常用指令
啟動Kafka
先到官網下載kafka後,進到kafka的資料夾# STEP1 啟動zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties# STEP2 啟動kafka server
bin/kafka-server-start.sh config/server.properties
Topic相關指令
# 創建一個Topic
bin/kafka-topics.sh --create --topic [Topic_Name] --bootstrap-server localhost:9092# 列出所有Topic
bin/kafka-topics.sh --list --bootstrap-server localhost:9092# 某個Topic詳細資訊
bin/kafka-topics.sh --describe --topic [Topic_Name] --bootstrap-server localhost:9092-----------------------------------------
--create, --list, --describe: 要對Topic執行的動作 --bootstrap-server 指定了kafka cluster的位置--topic 指定了Topic的名稱--replication-factor 指定想要的副本數--partitions 指定了分區的個數
Producer
bin/kafka-console-producer.sh --topic [Topic_Name] --bootstrap-server localhost:9092> 接著輸入想要傳的消息
Consumer
bin/kafka-console-consumer.sh --topic [Topic_Name] --from-beginning --bootstrap-server localhost:9092
用Go實作Kafka consumer和producer
Kafka Producer
Kafka Consumer
執行步驟
先到官網下載kafka後,進到kafka的資料夾# STEP1 啟動zookeeper
bin/zookeeper-server-start.sh config/zookeeper.properties# STEP2 啟動kafka server
bin/kafka-server-start.sh config/server.properties# STEP3 創立一個名字為 quickstart-events 的topic
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092# STEP4 執行 producer.go
go run producer.go# STEP5 執行 consumer.go
go run consumer.go
producer.go 開始發送消息到quickstart-events 這個topic
consumer.go 會到quick-events 這個topic 接收消息