Kafka x Docker ฉบับ 101

PANDORA
Tech INNO
Published in
3 min readApr 22, 2021
Kafka Containers

วันนี้จะมาเล่าเกี่ยวกับการติดตั้งและการใช้งาน Kafka บน Docker ฉบับ 101 เรามาเริ่มกันเลยค่ะ

มาทำความรู้จักกับ Kafka กันเถอะ

Kafka คืออะไรกันนะ 🤔 …

Kafka ก็คือ Distributed message queue ที่ทำหน้าเป็นตัวกลางในการกระจายข้อมูล (Messages) จากผู้ส่ง (Producers) ไปยังผู้รับ (Consumers) ที่ติดตามในหัวข้อ (Topics) นั้นๆ

แล้วทำไมเราถึงต้องใช้ Kafka ล่ะ 🤔

ก็เพราะว่า Kafka มีความยืดหยุ่นสูง สามารถรองรับข้อมูลที่มีปริมาณมหาศาล ทำงานได้อย่างรวดเร็วมาก (latency น้อยกว่า 10ms) และยังเป็นระบบที่มีความทนต่อความเสียหายสูงมาก

โดย Kafka จะประกอบไปด้วย

  • Producers คือ ผู้ส่งข้อมูลไปยัง Broker เพื่อจัดเก็บไว้ใน Topic
  • Consumers คือ ผู้รับข้อมูลที่ทำการ Subscribes topic นั้นๆ เพื่อนำข้อมูลไปใช้งานต่อ
  • Topics คือ หมวดหมู่ของข้อมูลที่ถูกส่งเข้ามา ซึ่งเราสามารถตั้งชื่อให้กับแต่ละ Topic ได้ โดย ​Message จะถูกแบ่งไว้ในแต่ละ partition
  • Partitions คือ กลุ่มที่ใช้เก็บข้อมูลซึ่งจะอยู่ภายใต้ Topics อีกที โดยเราสามารถมี Partitions ได้หลายอันในหนึ่ง Topic
  • Brokers คือ ตัวที่ใช้เก็บข้อมูลของ Kafka เปรียบเสมือน Kafka server ที่ใช้สำหรับเก็บข้อมูล
  • Zookeeper คือ ตัวที่ทำหน้าที่บริหารจัดการ การทำงานต่างๆ ในแต่ละ Broker

การติดตั้ง Kafka

ก่อนอื่นเลย เราต้องทำการ Create file -> docker-compose.yml ตามด้านล่างนี้

จากนั้น… Run command

docker-compose up -d

เมื่อทำการ set up container สำเร็จแล้ว ให้ทำการเปิด browser ตาม url นี้

http://localhost:9000

จะเห็น Console ของ Kafdrop ตามรูปด้านล่างนี้เลยยยยยย

ซึ่งเจ้า Kafdrop ตัวนี้ ใช้สำหรับเป็น UI monitor ของ Kafka เพื่อให้เราทำงานได้สะดวกยิ่งขึ้นค่ะ

โดยหน้าที่ของเจ้า Kafdrop มีประโยชน์ ดังนี้

  • ใช้สำหรับดู Brokers ใน Bootstrap servers ของเรา
  • สามารถสร้าง/ลบ Topics รวมไปถึงดูรายละเอียดต่างๆ เช่น Partitions และ Message ใน Topics ของเรา

การสร้าง Topic

หลังจากที่เราทำการติดตั้ง Kafka เสร็จเรียบร้อยแล้ว เรามาลองสร้าง Topic กันเถอะ

ขั้นตอนแรกให้เรา run คำสั่ง

docker ps

จะเห็น Container ตามรูปด้านล่าง

จากนั้นให้เราทำการเข้าไปที่ Container kafka ของเราด้วยคำสั่งนี้

docker exec -it kafka sh -c "cd /opt/kafka/bin && /bin/bash"

แล้วลองสร้าง Topic กันเลยยยยยย

./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic my-topic

เราสามารถดู Topic ที่สร้างไปแล้ว ด้วยคำสั่ง List Topic ตามนี้

./kafka-topics.sh --bootstrap-server=localhost:9092 --list

จะเห็น Topic ที่เราเพิ่งสร้างไปตามรูปนี้เลย

เมื่อลองกลับมาดูที่ Console ของ Kafdrop จะเห็น Topic ที่เราเพิ่งสร้างมาอยู่ในนี้ด้วย

นอกจากการใช้ Command แล้ว เรายังสามารถสร้าง Topic โดยใช้ Kafdrop ได้อีกด้วย 😊

ลองกดปุ่ม “New” ที่ด้านล่างซ้าย จะปรากฎหน้าจอให้เราทำการสร้าง Topic จากนั้นตั้งชื่อ Topic และจำนวน Partition ที่ต้องการ แล้วกดปุ่ม “Create” เพื่อสร้าง Topic กันเลยยยยยยยยย

เราจะได้ Topic ที่เราสร้างเมื่อสักครู่นี้ ตามรูปด้านล่างนี้เลย ง่ายมากๆ เลยใช่มั้ยล่ะ

การ Produce message

เมื่อเราทำการสร้าง Topic เรียบร้อยแล้ว ทีนี้เรามาลองทำการ Produce message กันเถอะ 💬

Run command ตามนี้เลยยยยยย

./kafka-console-producer.sh  --broker-list localhost:9092  --topic my-topic

จากนั้นทำการพิมพ์ Message ที่ต้องการ Procude ลงไปตามรูปด้านล่างนี้เลย

เราสามารถดู Message ที่ทำการ Procude ไปแล้ว ด้วยคำสั่งนี้

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my-topic --from-beginning

จะเห็น Message ตามรูปด้านล่าง

นอกจากนี้เรายังสามารถ ดู Message ใน Console ของ Kafdrop ได้อีกด้วย โดยคลิกที่ชื่อ Topic ของเรา

จากนั้นกดปุ่ม 👀 “View Messages”

แล้วกดปุ่ม 🔍 “View Messages” อีกครั้ง จะแสดง Message ที่เรา Produce ไปเมื่อสักครู่นี้

การลบ Topics

หลังจากที่เราทำการสร้าง Topic และ Produce message แล้ว เราลองมาทำการลบ Topic กันเถอะ ⬅️

โดยใช้คำสั่งนี้

./kafka-topics.sh --bootstrap-server localhost:9092 --topic my-topic --delete

เมื่อเราทำการ List Topic ออกมาดูด้วยคำสั่ง List Topic ก่อนหน้านี้ จะพบว่า Topic ของเราได้ถูกทำการลบเรียบร้อยแล้วววววว

นอกจากนี้เรายังสามารถทำการลบ Topic ผ่าน Console บน Kafdrop ได้อีกด้วย โดยการคลิกไปที่ชื่อ Topic ที่เราต้องการลบ และกดปุ่ม ❌ “Delete Topic”

เพียงเท่านี้เราก็สามารถลบ Topic ได้อย่างง่ายดายยยยยยย

ขอบคุณทุกคนที่อ่านมาจนจบ แล้วพบกันใหม่ในบทความหน้านะคะ บ๊ายบายยยยยยยยยยยย 👋

--

--