Springboot快速教程---Docker搭建與整合Kafka

最近在搭建一個簡易的基於Flink的實時推薦系統中用到了kafka,就快速的整合了下並記錄在此

簡介

什麼是Kafka

Apache Kafka是一個分佈式發佈 - 訂閱消息系統和一個強大的隊列,可以處理大量的數據,並使您能夠將消息從一個端點傳遞到另一個端點。 Kafka適合離線和在線消息消費。 Kafka消息保留在磁盤上,並在羣集內複製以防止數據丟失。 Kafka構建在ZooKeeper同步服務之上。 它與Apache Storm和Spark非常好地集成,用於實時流式數據分析。

術語

  • Broker:Kafka 集羣包含一個或多個服務器,這種服務器被稱爲 broker。

  • Topic:每條發佈到 Kafka 集羣的消息都有一個類別,這個類別被稱爲 Topic。(物理上不同 Topic 的消息分開存儲,邏輯上一個 Topic 的消息雖然保存於一個或多個 broker 上,但用戶只需指定消息的 Topic 即可生產或消費數據而不必關心數據存於何處)。

  • Partition:Partition 是物理上的概念,每個 Topic 包含一個或多個 Partition。

  • Producer:負責發佈消息到 Kafka broker。

  • Consumer:消息消費者,向 Kafka broker 讀取消息的客戶端。

  • Consumer Group:每個 Consumer 屬於一個特定的 Consumer Group(可爲每個 Consumer 指定 group name,若不指定 group name 則屬於默認的 group)。

  • Offset: 消息在partition中的偏移量。每一條消息在partition都有唯一的偏移量,消息者可以指定偏移量來指定要消費的消息。

特性

可擴展性、數據分區、低延遲、處理大量不同消費者

容錯

kafka集羣,每一個服務器爲broker,每一個broker會有多個partition(創建topic後),假如有三個broker,然後一個topic設置了三個分區,那麼每一個broker都會擁有一個分區,然後分區中會產生一個leader,在使用
過程中有消息進來(producer發送數據),leader則會拿到數據,然後會分發(複製)給其他兩個隨從,最終會保持每一個分區都會存在該消息(類似ES的集羣,也許大部分的集羣都是這樣設計的)

消息偏移量

The Kafka cluster durably persists all published records—whether or not they have been consumed—using a configurable retention period. For example, if the retention policy is set to two days, then for the two days after a record is published, it is available for consumption, after which it will be discarded to free up space. Kafka’s performance is effectively constant with respect to data size so storing data for a long time is not a problem.

In fact, the only metadata retained on a per-consumer basis is the offset or position of that consumer in the log. This offset is controlled by the consumer: normally a consumer will advance its offset linearly as it reads records, but, in fact, since the position is controlled by the consumer it can consume records in any order it likes. For example a consumer can reset to an older offset to reprocess data from the past or skip ahead to the most recent record and start consuming from “now”.

https://kafka.apache.org/intro

Kafka集羣持久地保留所有已發佈的記錄 - 無論它們是否已被消耗 - 使用可配置的保留期。例如,如果保留策略設置爲兩天,則在發佈記錄後的兩天內,它可供使用,之後將被丟棄以釋放空間。Kafka的性能在數據大小方面實際上是恆定的,因此長時間存儲數據不是問題。

基於每個消費者保留的唯一元數據是該消費者在日誌中的偏移或位置。這種偏移由消費者控制:通常消費者在讀取記錄時會線性地提高其偏移量,但事實上,由於消費者控制位置,它可以按照自己喜歡的任何順序消費記錄。例如,消費者可以重置爲較舊的偏移量以重新處理過去的數據,或者跳到最近的記錄並從“現在”開始消費。

可查看此博文

使用Docker搭建Kafka開發環境

download images

docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
docker pull sheepkiller/kafka-manager

run zookepper

docker run -d --name zookeeper --publish 2181:2181 \
  --volume /etc/localtime:/etc/localtime \
  --restart=always \
  wurstmeister/zookeeper

run kafka

docker run --name kafka \
  -p 9092:9092 \
  --link zookeeper:zookeeper \
  -e KAFKA_ADVERTISED_HOST_NAME=192.168.1.8 \
  -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
  -d  wurstmeister/kafka  

run kafka manager

docker run -d \
  --link zookeeper:zookeeper \
  -p 9000:9000  \
  -e ZK_HOSTS="zookeeper:2181" \
  hlebalbau/kafka-manager:stable \
  -Dpidfile.path=/dev/null

如果想設置webui 的權限,可以這樣設置

KAFKA_MANAGER_AUTH_ENABLED: "true"
KAFKA_MANAGER_USERNAME: username
KAFKA_MANAGER_PASSWORD: password

web ui in localhost:9000

可以再Gist上查看

SpringBoot整合Kafka

直接看項目

.
|-- README.md
|-- pom.xml
|-- quick-kafka.iml
`-- src
    |-- main
    |   |-- java
    |   |   `-- com
    |   |       `-- quick
    |   |           `-- kafka
    |   |               |-- KafkaApplication.java
    |   |               |-- config
    |   |               |   |-- KafkaTopicConfiguration.java
    |   |               |   `-- KafkaTopicProperties.java
    |   |               |-- controller
    |   |               |   `-- ApiController.java
    |   |               `-- service
    |   |                   |-- ConsumerService.java
    |   |                   `-- ProducerService.java
    |   `-- resources
    |       |-- application.yml
    |       `-- logback.xml
    `-- test
        `-- java

用法很簡單,主要是後面參數的配置(具體看個人應用場景了)

項目啓動

項目啓動後,kafka自動創建了三個topic

mark

在postman中發送一個請求
mark
控制檯日誌顯示發送和接受一個消息

不錯的博文

https://zhuanlan.zhihu.com/p/31731892

代碼在此Github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章