kafka的docker部署及nodejs使用

董永強發表於2019-04-09

前置環境條件

kafka映象選擇:

wurstmeister/kafka

安裝步驟

  1. docker pull wurstmeister/kafka
  2. git clone github.com/wurstmeiste…

專案需要完整的clone下來,而不是隻建立docker-compose.yml配置檔案,否則啟動時候就會報DockerFile找不到的錯誤。高手另說。。。

  1. 進入clone下的目錄,編輯docker-compose.yml檔案,將KAFKA_ADVERTISED_HOST_NAME欄位修改為實際ip地址
version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 10.6.19.121
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
複製程式碼
  1. 啟動叢集 docker-compose up -d,也可以啟動多個kafka的叢集docker-compose scale kafka=3。關閉命令docker-compose stop
  2. 啟動叢集成功後,可以通過docker ps檢視啟動狀態。另外需要注意的是,對映的32772這裡的埠,才是你能夠真正訪問到的埠地址,而不是使用9092

kafka的docker部署及nodejs使用

測試

  • 通過docker ps獲取kafka服務的dockerId,執行下列命令進入kafka docker exec -it {dockerId} /bin/bash
  • 進入目錄/opt/kafka_2.12-2.2.0/bin,目錄中應有下列一些指令碼
    kafka的docker部署及nodejs使用
  • 建立一個topic kafka-topics.sh --create --zookeeper {zookeeperName} --replication-factor 1 --partitions 1 --topic {topicName}
  • 檢視topic列表kafka-topics.sh --list --zookeeper {zookeeperName} zookeeperName可以通過docker ps獲取
  • 釋出訊息 kafka-console-producer.sh --topic=test --broker-list localhost:9092
  • 接收訊息 kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic test
  • 釋出訊息和接收訊息可以通過control c退出。訊息流能走通,說明kafka部署就已經沒問題,可以繼續使用了。

nodejs中整合kafka

生產者(producer)

const kafka = require('kafka-node')
const Producer = kafka.Producer
const client = new kafka.KafkaClient({kafkaHost: '10.6.18.78:32776'})
const producer = new Producer(client)
const payloads = [
  { topic: 'test', messages: '232323311', partition: 0}
];
producer.on('ready', function () {
  producer.send(payloads, function (err, data) {
    if (err) {
      console.error('傳送失敗', err)
    } else {
      console.log(data);
    }
  });
});

producer.on('error', function (err) {
  console.error(err)
})

複製程式碼

消費者(consumer)

var kafka = require('kafka-node'),
  Consumer = kafka.Consumer,
  client = new kafka.KafkaClient({kafkaHost: '10.6.18.78:32776'}),
  consumer = new Consumer(
    client,
    [
      { topic: 'test'}
    ],
    {
      groupId: 'test'
    }
  );

consumer.on('message', message => {
  console.log(message)
  consumer.setOffset(message.topic, message.partition, message.offset)
})
consumer.on('error', error => {
  console.error('消費錯誤', error)
})

複製程式碼

消費資訊列印結果:

kafka的docker部署及nodejs使用

相關文章