วันนี้ได้เข้าเรียน Kafka 101 ที่ SCK Dojo ซึ่งสอนโดย Surasit Neng Liangpornrattana
ซึ่งหัวข้อต่าง ๆ ที่ได้เรียนประกอบไปด้วย

  • เรื่องของ Messaging system
  • ทำไมต้องใช้งาน Kafka ด้วย
  • RabbitMQ vs Kafka
  • Ecosystem ของ Kafka เช่น Producer, Consumer, Zookeeper เป็นต้น
  • ความรู้พื้นฐานเกี่ยวกับ Kafka เช่น Topics, Partition, Broker เป็นต้น
  • Message Delivery Semantic
  • Workshop ทำงานร่วมกับ Line Chat Bot

เนื่องจากว่าเนื้อหาเยอะมาก ๆ จึงทำการสรุปไว้เป็นหลาย ๆ ส่วน
ในส่วนแรกนี้จะเน้นเรื่องของ Messaging system กันนิดหน่อย

มาเริ่มกันเลย

เริ่มต้นด้วยเรื่องของ Messaging system

ระบบงานนั้นมีการใช้ข้อมูลมาทำงาน
ทั้งจากภายในและภายนอก
มีการทำงานกับข้อมูลจากหลากหลายที่
การ integrate ระบบงานเข้ากับข้อมูลจึงเป็นเรื่องที่ไม่ง่ายเลย
ยิ่งมีจำนวนระบบทำงานจำนวนมากยิ่งลำบากไปใหญ่
ดังนั้นถ้ามีระบบที่ช่วยทำให้ง่ายขึ้นน่าจะดีกว่าไหมนะ ?

  • ช่วยให้การ integrate แต่ละระบบง่ายขึ้น
  • แต่ละระบบไม่ผูกมัดกันมากเกินไป (Loose coupling)
  • มีรูปแบบการทำงานร่วมกันที่เป็นมาตฐาน (Standard Interface)
  • ทำให้ Latency ของการทำงานต่ำ
  • มีความเสถียรหรือน่าเชื่อถือสูง

ทั้งหมดนี้มันก็คือ Messaing system นั่นเอง
แต่ถ้าใครไม่มี requirement แบบนี้ก็ข้ามไปได้เลย

โดยพื้นฐานของ Messaging system ประกอบไปด้วย

  • Message queue คือ ตัวเชื่อมต่อระหว่าง Producer และ Consumer บ่อยครั้งจะเรียกว่า Queue หรือ Channel นั่นคือทำการรับข้อมูล หรือ message ที่ส่งมาจาก producer และส่งต่อไปให้ทาง consumer ต่อไป
  • Message หรือ Data package คือข้อมูลที่ถูกส่งผ่านระบบ network นั่นเอง โดยข้อมูลจะถูกห่อหุ้มตาม protocol ที่ใช้งาน
  • Sender หรือ Producer ทำการส่งข้อมูลหรือ message ไปยัง message queue
  • Receiver หรือ Consumer ผู้รับ message จาก message queue ไปได้ทั้งแบบ pushing และ polling
  • Data transmit protocol เป็น protocol หรือภาษาในการสื่อสารกันนั่นเอง มีความหลากหลายตาม implementation ของระบบ queue ที่ใช้ ยกตัวอย่างเช่น AMQP (Advance Message Queuing Protocol), MQTT (Message Queue Telemetry Protocol) และ HTTP เป็นต้น
  • Transfer mode เช่น synchronous, asynchronous และ batching เป็นต้น

รูปแบบการทำงานของ Messaging system นั้นมีดังนี้

  • Point-to-Point (PTP)
  • Publish-Subscribe (Pub-Sub)
  • Advance Queuing Messaging Protocol (AQMP)

มาดูในแต่ละแบบกัน

Point-to-Point (PTP)

ง่าย ๆ คือแต่ละ message จะถูก consume จาก consumer เดียวเท่านั้น
ถึงแม้จะมี consumer มากกว่า 1 ตัวก็ตาม
ทำให้เรามั่นใจได้ว่า จะไม่มี consumer มารับ message ไปทำงานซ้ำแน่นอน
การส่งข้อมูลจะตัวกลางซึ่งเราจะเรียกว่า queue (FIFO – First In First Out)

ในการ implement นั้น
Producer จะทำการส่งข้อมูลไปยังชื่อของ queue ที่กำหนด
จากนั้นในส่วนของ consumer จะคอย monitoring ว่ามีข้อมูลเข้ามายัง queue นั้น ๆ หรือไม่
ถ้ามีข้อมูลเข้ามาก็จะนำออกมาทำงานหรือ processing ต่อไป

สามารถเพิ่มจำนวนของ producer และ consumer ในขณะ runtime ได้ตามที่ต้องการ
แสดงดังรูป

Point-to-Point แบ่งได้ 2 แบบตามการทำงาน คือ

  1. Fire-and-Forget model คือเมื่อส่งข้อมูลเข้า queue แล้วเป็นอันจบ ซึ่งมักจะเรียกว่า การทำงานแบบ Asynchronous
  2. Request/Reply model คือเมื่อส่งข้อมูลเข้า queue แล้วจะต้องรอการตอบกลับจาก consomer ด้วยว่าเป็นอย่างไร นั่นทำให้ producer และ consumer ผูกมัดกัน หรืออาจจะเรียกได้ว่า ทำงานแบบ Syschronous

Publish-Subscribe (Pub-Sub)

รูปแบบการทำงานนี้ใช้งานเมื่อ
ต้องการส่งข้อมูลหนึ่ง ๆ ไปยัง consumer มากกว่า 1 ตัว
โดย consumer นั้นจะถูกเรียกว่า Subscriber
producer จะเรียกว่า Publisher
ส่วน message queue จะเรียกว่า Topic

ข้อมูลจะถูกจัดเก็บใน Topic ไปจนกว่าข้อมูล
จะถูกส่งไปถึง subscriber/consumer ที่ active อยู่ทั้งหมด

การทำงานของ producer และ consumer นั้นจะไม่ผูกมัดกัน
นั่นหมายความว่า
producer จะไม่สนใจเลยว่าใครคือ consumer
ทำหน้าที่ส่งข้อมูลเข้า topic ไปตามที่ต้องการ
ส่วน consumer ก็เช่นกันไม่สนใจ producer

สนใจเพียงว่าจะทำการไป subscribe ที่ Topic อะไรก็พอ
หรือถ้าไม่ต้องการข้อมูลจาก Topic ก็ทำการ unsubscribe ได้เลย
เหมือนกับการติดตามข้อมูลข่าวสารตาม website นั่นเอง
แสดงการทำงานดังรูป

Advance Queuing Messaging Protocol (AQMP)

เป็น open protocol สำหรับการส่งข้อมูลผ่าน queue แบบ asynchronous
มีโครงสร้างการทำงานดังรูป

จากรูปนั้น
Producer จะทำการส่งข้อมูลไปยัง Broker
จากนั้น Broker จะส่งข้อมูลไปยัง consumer ต่อไป
แต่ใน Broker นั้นจะมี component ชื่อว่า Exchange
Exchange ทำการส่งข้อมูลที่ได้รับเข้ามาไปยัง (routing) queue ตามที่กำหนดในข้อมูล
ดังนั้นการส่งข้อมูลจะต้องทำการกำหนดค่าต่าง ๆ มาตามที่ต้องการ (Smart Producer)
ส่วน Consumer ก็ทำตามข้อมูลที่ส่งเข้ามาก็พอ ไม่ต้องคิดมาก (Dumb consumer)

โดยรูปแบบการทำงานของ broker มีหลายรูปแบบดังนี้

  • Direct exchange ทำการส่งไปยัง queue ตามที่กำหนดไว้ใน routing key ในข้อมูล
  • Fan-out exchange ทำการส่งข้อมูลไปยังทุก ๆ queue ที่กำหนดไว้ นั่นคือการ copy ข้อมูลนั่นเอง เหมือนกับการ broadcast
  • Topic exchange ทำการส่งข้อมูลไปยัง queue ที่เชื่อมต่อ โดยกำหนดชื่อในรูปแบบ wildcard ได้เลย รูปแบบคล้าย ๆ Pub/Sub หรือทำงานแบบ multicast routing

คำถามที่น่าสนใจคือ

ระบบของเรานั้นต้องการ Messaging system หรือไม่ ?
ระบบของเรานั้นต้องการ Messaging system รูปแบบไหน ?
และสิ่งที่ต้องพิจารณาเพิ่มอีกคือ

  • อัตราข้อมูลที่เข้าสู่ระบบ
  • การการันตีการส่งข้อมูล (Guarantee Delivery)
  • การจัดเก็บข้อมูล
  • การจัดการเรื่องความปลอดภัย
  • การจัดการเรื่อง Fault tolerance

ต้องตอบให้ได้ก่อนที่จะเลือกเครื่องมือนะครับ