ภาษา Go (Golang) เป็นภาษาที่มีความสามารถด้าน concurrency ที่ยอดเยี่ยม และเหมาะสมอย่างยิ่งสำหรับงานด้าน message processing ไม่ว่าจะเป็นการรับส่งข้อมูลขนาดใหญ่แบบ asynchronous หรือการสร้าง event-driven system ในบทความนี้เราจะพาคุณไปสำรวจการเชื่อมต่อ Apache Kafka และ RabbitMQ ด้วย Go รวมถึงตัวอย่างโค้ดการผลิตและบริโภคข้อความ (Producer & Consumer)
🔄 Apache Kafka และ RabbitMQ คืออะไร?
- Kafka: ระบบ distributed streaming platform ที่สามารถเก็บและเผยแพร่ข้อมูลแบบ real-time ด้วย throughput สูงมาก
- RabbitMQ: Message broker แบบ traditional ที่รองรับ multiple protocols เช่น AMQP, MQTT เหมาะกับงาน distributed system ขนาดกลาง
📦 Library ที่นิยมใช้ใน Go
- Kafka:
confluent-kafka-go
และsegmentio/kafka-go
- RabbitMQ:
streadway/amqp
🛠 ตัวอย่างการเชื่อมต่อ Kafka ด้วย Go (ใช้ kafka-go)
// go get github.com/segmentio/kafka-go package main import ( "context" "fmt" "github.com/segmentio/kafka-go" "log" "time" ) func main() { topic := "example-topic" partition := 0 conn, err := kafka.DialLeader(context.Background(), "tcp", "localhost:9092", topic, partition) if err != nil { log.Fatal("failed to dial leader:", err) } conn.SetWriteDeadline(time.Now().Add(10 * time.Second)) _, err = conn.WriteMessages( kafka.Message{Value: []byte("Hello Kafka from Go!")}, ) if err != nil { log.Fatal("failed to write messages:", err) } fmt.Println("✅ Message sent to Kafka") conn.Close() }
Kafka Consumer
r := kafka.NewReader(kafka.ReaderConfig{ Brokers: []string{"localhost:9092"}, Topic: "example-topic", Partition: 0, MinBytes: 10e3, MaxBytes: 10e6, }) for { m, err := r.ReadMessage(context.Background()) if err != nil { log.Fatal(err) } fmt.Printf("💬 Received message: %s\n", string(m.Value)) }
🐰 ตัวอย่างการเชื่อมต่อ RabbitMQ ด้วย Go
// go get github.com/streadway/amqp package main import ( "github.com/streadway/amqp" "log" ) func main() { conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") if err != nil { log.Fatal(err) } defer conn.Close() ch, err := conn.Channel() if err != nil { log.Fatal(err) } defer ch.Close() q, _ := ch.QueueDeclare("hello", false, false, false, false, nil) body := "Hello RabbitMQ from Go!" err = ch.Publish("", q.Name, false, false, amqp.Publishing{ ContentType: "text/plain", Body: []byte(body), }) if err != nil { log.Fatal(err) } log.Println("✅ Message sent to RabbitMQ") }
RabbitMQ Consumer
msgs, _ := ch.Consume("hello", "", true, false, false, false, nil) forever := make(chan bool) go func() { for d := range msgs { log.Printf("💬 Received a message: %s", d.Body) } }() log.Println("🚀 Waiting for messages. To exit press CTRL+C") <-forever
⚖️ Kafka vs RabbitMQ
หัวข้อ | Kafka | RabbitMQ |
---|---|---|
เหมาะกับ | ระบบ real-time ขนาดใหญ่ | ระบบ microservice ขนาดกลาง |
Protocol | Kafka Binary | AMQP, MQTT |
Delivery Guarantee | At least once / Exactly once | At most once / At least once |
Persistence | เก็บ log ย้อนหลังได้ | queue-based, delete หลัง consume |
🔐 Security & Performance Tips
- ใช้ TLS สำหรับการเชื่อมต่อ production
- กำหนด timeout และ retry ใน producer
- จัด load balancing worker สำหรับ consumer หลายตัว
📦 Use Cases
- Real-time data processing
- Event-driven architecture
- Microservice messaging
- Streaming analytics
📚 สรุป
Go เป็นภาษาที่เชื่อมต่อกับ Kafka และ RabbitMQ ได้อย่างง่ายดาย ด้วย library ที่พร้อมใช้งานและความสามารถในด้าน concurrency ที่ยอดเยี่ยม ทำให้ Go เป็นทางเลือกที่ดีเยี่ยมในการสร้างระบบ messaging ทั้งแบบ real-time และ distributed
🔗 แหล่งอ้างอิง
📝 ข้อความสำหรับ SEO
Go กับ Kafka | Go กับ RabbitMQ | Go message queue | Golang Kafka consumer | Golang RabbitMQ producer | เชื่อมต่อ Kafka RabbitMQ ด้วย Go | Event driven Go