Go กับ RabbitMQ
RabbitMQ คืออะไร?
RabbitMQ เป็นระบบตัวกลางในการส่งข้อความ (Message Broker) ที่ช่วยให้แอปพลิเคชันสามารถส่งและรับข้อความระหว่างกันได้ง่ายๆ โดยใช้คิว (Queue) 📨 RabbitMQ ช่วยให้แอปพลิเคชันคุยกันได้ดีขึ้น โดยไม่ต้องรู้รายละเอียดภายในของกันและกัน
ทำไมต้องใช้ RabbitMQ?
- Decoupling: RabbitMQ ช่วยแยกส่วนการทำงานของแอปพลิเคชันออกจากกัน ทำให้แต่ละส่วนสามารถพัฒนาและปรับปรุงได้โดยไม่กระทบส่วนอื่น 🔄
- Scalability: ขยายระบบได้ง่ายๆ โดยการเพิ่มคิวและโหนด RabbitMQ เพื่อรองรับงานที่เพิ่มขึ้น 📈
- Reliability: RabbitMQ มีระบบจัดการข้อความที่มั่นใจได้ว่าข้อความจะไม่หาย และเก็บไว้ในคิวจนกว่าจะมีผู้รับ 📥
RabbitMQ ทำงานอย่างไร?
RabbitMQ ใช้คิวในการจัดการข้อความ โดยมีองค์ประกอบหลักดังนี้:
- Producer: ส่งข้อความไปยังคิว
- Queue: เก็บข้อความที่ส่งมา รอให้มีผู้รับมารับไป
- Consumer: รับข้อความจากคิว
- Exchange: รับข้อความจาก Producer แล้วส่งไปยังคิวที่เหมาะสมตามกฎการกำหนดเส้นทาง (routing rules)
วิธีการทำงาน
- Producer ส่งข้อความ: Producer ส่งข้อความไปยัง Exchange ของ RabbitMQ
- Exchange กำหนดเส้นทาง: Exchange พิจารณากฎการกำหนดเส้นทางแล้วส่งข้อความไปยัง Queue ที่เหมาะสม
- Queue เก็บข้อความ: ข้อความถูกเก็บไว้ใน Queue รอให้ Consumer มารับ
- Consumer รับข้อความ: Consumer รับข้อความจาก Queue แล้วประมวลผลตามที่ต้องการ
ตัวอย่างการใช้งาน RabbitMQ กับ Go
สมมติเรามีระบบสั่งซื้อสินค้าออนไลน์ เมื่อมีการสั่งซื้อใหม่:
- Producer: แอปพลิเคชันเว็บส่งข้อมูลการสั่งซื้อไปยัง RabbitMQ
- Exchange: RabbitMQ Exchange รับข้อมูลการสั่งซื้อและกำหนดเส้นทางไปยังคิวที่จัดการคำสั่งซื้อ
- Queue: คิวเก็บข้อมูลการสั่งซื้อจนกว่าจะมีการประมวลผล
- Consumer: แอปพลิเคชันที่จัดการคำสั่งซื้อรับข้อมูลจากคิวและทำการประมวลผล เช่น ยืนยันคำสั่งซื้อและเตรียมการจัดส่ง
เอาหละ เรามาดูการใช้ RabbitMQ กับ Go กันดีกว่าครับ ไปกันต๊อออ
การติดตั้ง RabbitMQ
ก่อนอื่นเราต้องติดตั้ง RabbitMQ มีหลากหลายวิธีมาก สามารถดูได้จาก official website ได้เลย เสร็จแล้วก็เปิดเซิร์ฟเวอร์ RabbitMQ 🐇🚀
การติดตั้งไลบรารี RabbitMQ สำหรับ Go
เราจะใช้ไลบรารี streadway/amqp ที่นิยมใช้กับ Go เพื่อติดตั้ง รันคำสั่งนี้:
go get github.com/streadway/amqp
ส่งข้อความ
นี่คือตัวอย่างการส่งข้อความไปยังคิวใน RabbitMQ ด้วย Go:
Publisher (Send)
package main
import (
"log"
"github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "Failed to connect to RabbitMQ")
defer conn.Close()
ch, err := conn.Channel()
failOnError(err, "Failed to open a channel")
defer ch.Close()
q, err := ch.QueueDeclare(
"hello",
false,
false,
false,
false,
nil,
)
failOnError(err, "Failed to declare a queue")
body := "Hello World!"
err = ch.Publish(
"",
q.Name,
false,
false,
amqp.Publishing{
ContentType: "text/plain",
Body: []byte(body),
})
failOnError(err, "Failed to publish a message")
log.Printf(" [x] Sent %s", body)
}
โค้ดนี้จะส่งข้อความ “Hello World!” ไปยังคิวชื่อ “hello”
รับข้อความ
นี่คือตัวอย่างการรับข้อความจากคิวใน RabbitMQ ด้วย Go:
Consumer (Receive)
package main
import (
"log"
"github.com/streadway/amqp"
)
func failOnError(err error, msg string) {
if err != nil {
log.Fatalf("%s: %s", msg, err)
}
}
func main() {
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
failOnError(err, "Failed to connect to RabbitMQ")
defer conn.Close()
ch, err := conn.Channel()
failOnError(err, "Failed to open a channel")
defer ch.Close()
q, err := ch.QueueDeclare(
"hello",
false,
false,
false,
false,
nil,
)
failOnError(err, "Failed to declare a queue")
msgs, err := ch.Consume(
q.Name,
"",
true,
false,
false,
false,
nil,
)
failOnError(err, "Failed to register a consumer")
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("Received a message: %s", d.Body)
}
}()
log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
<-forever
}
โค้ดนี้จะรับข้อความจากคิวชื่อ “hello” และพิมพ์ข้อความนั้นในคอนโซล
การรันตัวอย่าง
- ตรวจสอบให้แน่ใจว่า RabbitMQ กำลังทำงานอยู่
- รันโปรแกรม publisher เพื่อส่งข้อความ:
go run publisher.go 3. รันโปรแกรม consumer เพื่อรับข้อความ:
go run consumer.go เมื่อเรารัน consumer เราจะเห็นข้อความ “Hello World!” ถูกพิมพ์ในคอนโซล 📬
สรุป
ตัวอย่างนี้แสดงวิธีส่งและรับข้อความโดยใช้ RabbitMQ กับ Go 🐇💌 RabbitMQ เป็นเครื่องมือเจ๋งๆ ที่ช่วยให้เราสร้างระบบที่ยืดหยุ่นและขยายตัวได้ดี 📈 ไลบรารี streadway/amqp ทำให้การใช้งาน RabbitMQ กับ Go ง่ายมากๆ เราสามารถขยายตัวอย่างนี้ต่อไปอีก เช่น การทำงานคิวงาน หรือ การแจ้งเตือนต่างๆ ได้ง่ายๆ เลย 🚀
