ภาษา 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