Go กับการเชื่อมต่อ Kafka / RabbitMQ

Sharing is caring!

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

หัวข้อKafkaRabbitMQ
เหมาะกับระบบ real-time ขนาดใหญ่ระบบ microservice ขนาดกลาง
ProtocolKafka BinaryAMQP, MQTT
Delivery GuaranteeAt least once / Exactly onceAt 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

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *