IT General
น้องๆ เคยเจอไหม เวลาทำเว็บหรือแอป แล้วข้อมูลมันต้องวิ่งไปมาหลายที่? สมัยผมทำร้านเน็ต SiamCafe.net เนี่ย เจอปัญหาข้อมูลค้างบ่อยมาก เพราะระบบมันคุยกันตรงๆ ถ้า server ตัวนึงล่ม อีกตัวก็รอเก้อเลย ทีนี้แหละ ลูกค้าโวยวายเน็ตช้า ผมเลยต้องหาทางแก้
Message Queue (MQ) เนี่ยแหละ คือพระเอกของเรา มันเหมือนคนกลางที่คอยรับส่งข้อมูลแทนเรา RabbitMQ กับ Kafka ก็เป็น MQ ที่ฮิตมากๆ ตัวนึง เน้นใช้งานง่าย อีกตัวเน้น performance แรงๆ ถ้าไม่มี MQ ระบบเราก็จะเหมือนคนไม่มีมารยาท ตะโกนคุยกันเสียงดังวุ่นวายไปหมด พอมี MQ ทุกอย่างเป็นระเบียบ ส่ง message ไปรอคิว แล้วค่อยๆ process ไป ทีละ step
ทำไมถึงสำคัญน่ะเหรอ? ลองคิดดู ถ้าไม่มี MQ เวลาเราสั่งซื้อของออนไลน์ แล้วระบบ payment ล่ม ระบบส่งของก็ไม่รู้เรื่อง ถูกไหม? MQ จะช่วยให้ระบบทำงานต่อได้ แม้ว่าบางส่วนจะมีปัญหา ทำให้ระบบโดยรวมเสถียรขึ้นเยอะเลย
Message ก็คือข้อมูลที่เราต้องการส่งนั่นแหละ จะเป็นอะไรก็ได้ ข้อความ รูปภาพ หรือข้อมูลอะไรซักอย่าง ที่สำคัญคือต้องมี format ที่ตกลงกันไว้ก่อน เช่น JSON หรือ XML
Queue ก็คือคิวที่เอาไว้เก็บ message ที่รอการ process ใครส่ง message มาก่อน ก็รออยู่ในคิวก่อน ใครมาก่อนก็ได้ทำก่อน เหมือนตอนต่อแถวซื้อขนมครกหน้าปากซอย
Producer คือคนที่ส่ง message เข้ามาใน queue ส่วน Consumer คือคนที่ดึง message ออกจาก queue ไป process สมัยผมทำ SiamCafe.net ก็ประมาณว่า Producer คือเครื่องลูกข่ายที่ส่ง request เข้ามา ส่วน Consumer คือ server ที่ประมวลผลแล้วส่งข้อมูลกลับไป
เอาล่ะ มาดูวิธีใช้งาน RabbitMQ กับ Kafka กันบ้าง เริ่มจาก RabbitMQ ก่อนเลย ตัวนี้ setup ง่าย เหมาะกับมือใหม่หัดขับ ส่วน Kafka จะซับซ้อนกว่าหน่อย แต่ performance เค้าดีจริง
เริ่มจากติดตั้ง RabbitMQ ก่อนเลย บน Ubuntu ก็แค่:
sudo apt update
sudo apt install rabbitmq-server
จากนั้นก็เปิด Python shell แล้วลองส่ง message ง่ายๆ ดู:
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()
ง่ายไหมล่ะ? แค่นี้เราก็ส่ง message ไปที่ queue ชื่อ 'hello' ได้แล้ว
Kafka จะติดตั้งยากกว่าหน่อย เพราะต้องมี Zookeeper ด้วย แต่ไม่ต้องกลัว ลองดู:
bin/zookeeper-server-start.sh config/zookeeper.propertiesbin/kafka-server-start.sh config/server.propertiesจากนั้นก็ลองส่ง message ดู (ต้องมี Kafka Python library ก่อน):
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers='localhost:9092')
producer.send('my-topic', b'Hello, Kafka!')
producer.flush()
อันนี้เราส่ง message ไปที่ topic ชื่อ 'my-topic' อย่าลืมว่า Kafka จะใช้ topic แทน queue นะ
นอกจาก RabbitMQ กับ Kafka แล้ว ก็ยังมี MQ ตัวอื่นๆ อีก เช่น ActiveMQ, Redis Pub/Sub แต่ละตัวก็มีข้อดีข้อเสียต่างกันไป RabbitMQ เน้นใช้งานง่าย Kafka เน้น performance ถ้าต้องการความเร็วสูงๆ Kafka จะตอบโจทย์มากกว่า แต่ถ้าต้องการความง่าย RabbitMQ ก็เป็นตัวเลือกที่ดี
สมัยผมทำร้านเน็ต SiamCafe Blog ผมเคยลองใช้ ActiveMQ ด้วย แต่สุดท้ายก็มาจบที่ RabbitMQ เพราะมัน set up ง่าย แล้วก็ stable ดี
| คุณสมบัติ | RabbitMQ | Kafka |
|---|---|---|
| ความเร็ว | ปานกลาง | สูง |
| ความซับซ้อน | ต่ำ | สูง |
| การใช้งาน | เหมาะกับงานทั่วไป | เหมาะกับ Big Data, Streaming |
| Message ordering | รองรับ | รองรับ (ภายใน partition) |
| ภาษาที่รองรับ | หลากหลาย | หลากหลาย |
เลือก MQ ตัวไหน ก็ขึ้นอยู่กับ requirement ของโปรเจกต์เราเลย ลองศึกษาดูดีๆ แล้วค่อยตัดสินใจนะ SiamCafe Blog มีบทความดีๆ อีกเยอะเลย ลองเข้าไปอ่านดู
เอาล่ะน้องๆ มาถึงส่วนสำคัญแล้ว นั่นคือ best practices หรือเคล็ดลับที่พี่บอมสั่งสมมาจากการใช้งาน Message Queue ทั้ง RabbitMQ และ Kafka จริงๆ สมัยผมทำร้านเน็ตนี่ เรื่องระบบหลังบ้านสำคัญสุดๆ ยิ่งตอนมีลูกค้าเยอะๆ ข้อมูลต้องวิ่งฉิว
จำไว้เลยว่าไม่มีอะไรดีที่สุดเสมอไป เลือกใช้ให้เหมาะกับงาน! เหมือนเลือกร้านเกมแหละ บางร้านเกมแรง บางร้านสเปคเครื่องกลางๆ แต่บรรยากาศดี ก็เลือกตามใจชอบ
# ตัวอย่าง Prometheus Query สำหรับเช็คจำนวน message ใน RabbitMQ Queue
rabbitmq_queue_messages{queue="my_queue"}
โดยทั่วไป Kafka จะ scale ได้ดีกว่า RabbitMQ ในแง่ของ throughput และจำนวน message ที่ประมวลผลได้ แต่ก็ต้องแลกมากับความซับซ้อนที่มากขึ้นในการ setup และ maintain
RabbitMQ เหมาะกับ use case ที่ต้องการความน่าเชื่อถือสูง และ message delivery guarantee เช่น ระบบ payment หรือระบบจัดการ order
Kafka เหมาะกับ use case ที่ต้องการ throughput สูง และ scalability เช่น ระบบ log aggregation หรือ real-time analytics
ตอบยากน้อง! ขึ้นอยู่กับ requirements ของโปรเจคจริงๆ ถ้าไม่แน่ใจ ลองทำ proof of concept (POC) ดูก่อน แล้วค่อยตัดสินใจ
Message Queue ทั้ง RabbitMQ และ Kafka ต่างก็มีข้อดีข้อเสียแตกต่างกันไป ไม่มีตัวไหนที่ดีที่สุดเสมอไป การเลือกใช้ขึ้นอยู่กับ requirements ของโปรเจค และความถนัดของทีม
อย่ากลัวที่จะลองผิดลองถูก! สมัยผมทำ SiamCafe.net ก็ลองมาเยอะ เจ็บมาเยอะ แต่สุดท้ายก็ทำให้เราเก่งขึ้นนะน้อง
อยากรู้เรื่อง iCafeForex ไหม คลิกเลย: iCafeForex
ติดตาม SiamCafe Blog ได้ที่นี่: SiamCafe Blog