นายหน้าข้อความ | คิว | การส่งข้อความแบบอะซิงโครนัส | จิน | พร้อมตัวอย่าง
สวัสดีนักพัฒนา 💻💻 ในบทความชุดต่อไปนี้ ฉันกำลังวางแผนที่จะสาธิตวิธีที่เราสามารถแนะนำตัวกลางส่งข้อความในโครงสร้างพื้นฐานแบ็กเอนด์ของเรา ซึ่งจะทำให้เราสามารถดำเนินการประมวลผลแบบอะซิงโครนัสและแบบกระจายได้ ในบทความนี้ ฉันจะใช้เวิร์กโฟลว์ง่ายๆ โดยใช้ RabbitMQ ในแอปพลิเคชัน golang เพื่อแสดงให้เห็นว่าตัวรับส่งข้อความนี้มีประสิทธิภาพเพียงใด
สถานการณ์
แอปพลิเคชันของเรามีคำขอหรืองานบางอย่างที่ใช้เวลานานมาก เมื่อผู้ใช้พยายามทำงานที่ต้องใช้ทรัพยากรมาก ส่วนหน้าของแอปพลิเคชันของเราจะส่งคำขอไปยังส่วนหลังและรอจนกว่าจะได้รับการตอบกลับ เวลารอนี้อาจยาวนานและสร้างความสับสนให้กับผู้ใช้ที่เห็นหน้าจอการโหลดที่น่าเบื่อในส่วนต่อประสานผู้ใช้
ด้วยการเปิดตัว RabbitMQ ในแบ็กเอนด์ เราสามารถปรับปรุงปัญหานี้ได้มาก
ภาพรวม
- ขั้นตอนที่ 1: ส่วนหน้า ของแอปพลิเคชันของเราส่งคำขอไปยัง Backend Golang API ของเรา
- ขั้นตอนที่ 2: API ของเรา (ซึ่งทำหน้าที่เป็น RabbitMQ Producer ด้วย) จัดการคำขอนั้นและจัดเก็บคำขอนั้นไว้ในคิว
- ขั้นตอนที่ 3: จากนั้น API ของเราจะส่งการตอบรับการตอบกลับไปยังส่วนหน้าทันทีโดยแจ้งว่าได้รับคำขอเรียบร้อยแล้ว ด้วยเหตุนี้ส่วนหน้าจึงไม่ต้องรออีกต่อไป
- ขั้นตอนที่ 3: ในเวลาเดียวกัน RabbitMQ Consumer จะตรวจสอบเป็นประจำว่ามีข้อความคำขอใดๆ ในคิวหรือไม่ เมื่อ Producer ส่งข้อความคำขอไปยังคิว Consumer จะได้รับและจัดการคำขอนั้น
- ขั้นตอนที่ 5: ขณะนี้เนื่องจากผู้บริโภคจัดการคำขอแล้ว เราจึงสามารถใช้ผลลัพธ์ของคำขอได้หลายวิธี อีกวิธีหนึ่งสามารถจัดเก็บไว้ในฐานข้อมูลได้ หรือเราสามารถส่งผลลัพธ์เหล่านั้นกลับไปยังส่วนหน้าในการเชื่อมต่อ WebSocket ส่วนหน้าสามารถแสดงผลลัพธ์เหล่านั้นให้ผู้ใช้เห็นได้ซึ่งยอดเยี่ยมมาก
การนำไปปฏิบัติ
ในบทความนี้ เราจะใช้งานทั้ง RabbitMQ Producer และ Consumer ภายใน Backend Golang API ของเรา
โครงสร้างโฟลเดอร์
ตั้งค่า
เริ่มต้นโมดูล Golang ด้วยชื่อ rabbitmq-golang
go mod init rabbitmq-golang
ติดตั้งไลบรารีไคลเอนต์ Go RabbitMQ
go get github.com/rabbitmq/amqp091-go
ใช้
ตำแหน่ง [ utils-› error.go]
ยูทิลิตี้นี้จัดการข้อผิดพลาด
คงที่
ตำแหน่ง [ค่าคงที่ -› คงที่.go]
ไฟล์นี้ประกอบด้วยค่าคงที่ทั้งหมดที่ใช้ในบทความ
การตั้งค่า RabbitMQ
ตำแหน่ง [lib -› rabbitmq.go]
- [บรรทัดที่ 8]: เรากำลังเชื่อมต่อกับเซิร์ฟเวอร์ RabbitMQ ของเรา
- [บรรทัดที่ 14]: ที่นี่เราสร้างช่องจากเซิร์ฟเวอร์ที่เชื่อมต่อ เราจะใช้ช่องทางนี้ในภายหลังเพื่อเผยแพร่และใช้ข้อความจากคิว
การตั้งค่า RabbitMQ Docker
เราจะตั้งค่าเซิร์ฟเวอร์การจัดการ rabbitMQ โดยใช้นักเทียบท่า
สภาพแวดล้อม
ที่ตั้ง [.env]
นักเทียบท่าเขียน
ตำแหน่ง [นักเทียบท่า-compose.yml]
ที่นี่เราได้ใช้ rabbitmq:3-managementรูปภาพและพอร์ตที่ส่งต่อสองพอร์ต
ตัวควบคุม
เราจะต้องมีตัวควบคุมสองตัวเพื่อจัดการกับคำขอสองรายการ task1 และ task2
ตัวควบคุม Task1
ตำแหน่ง [คอนโทรลเลอร์ - › task1Controller.go]
- [บรรทัด 3]: เราเผยแพร่ข้อความไปยังคิวที่เรียกว่า คิว-1[บรรทัด 5] [เราจะสร้างคิวนี้ในภายหลังในฟังก์ชันหลัก] ด้วยประเภท TASK1 [บรรทัด 11] . ที่นี่เราใช้การแลกเปลี่ยนเริ่มต้น (“”) [บรรทัด 4] [เราจะใช้การแลกเปลี่ยนประเภทอื่นในบทความถัดไปสำหรับกรณีการใช้งานขั้นสูง]
ตัวควบคุม Task2
ตำแหน่ง [คอนโทรลเลอร์ - › task2Controller.go]
- ที่นี่เราเผยแพร่ข้อความไปยังคิวที่เรียกว่า queue-1[Line 5]ด้วยประเภท TASK2 [Line 11]
เราเตอร์
ตำแหน่ง [เราเตอร์ -› router.go]
ที่นี่เรากำลังใช้เราเตอร์ Gin
- [บรรทัด 6–11]: เรากำลังจัดการ CORS
- [บรรทัดที่ 17]: สิ่งนี้จัดการคำขอ /task1 ไปยัง task1Controller [ที่เราสร้างไว้ก่อนหน้านี้]
- [บรรทัดที่ 18]: สิ่งนี้จัดการคำขอ /task2 ไปยัง task2Controller [ที่เราสร้างไว้ก่อนหน้านี้]
หลัก
ที่ตั้ง [main.go]
- [บรรทัดที่ 3]: เรากำลังดึงการเชื่อมต่อ rabbitMQ และช่องสัญญาณจากไฟล์กำหนดค่าที่เราสร้างไว้ก่อนหน้านี้ [lib -› rabbitmq.go]
- [บรรทัด 7–14]: เรากำลังสร้างคิวชื่อ queue1 [ชื่อที่กล่าวถึงใน บรรทัด 8]
- [บรรทัดที่ 18–26]: เรากำลังตั้งค่า ผู้บริโภค ซึ่งกำลังฟังคิวที่เรียกว่า คิว1 ที่กล่าวถึงใน บรรทัดที่ 19
- [บรรทัด 30–40]: ที่นี่เรากำลังฟังข้อความใหม่จากคิว เมื่อเราได้รับข้อความใดๆ เราจะตรวจสอบประเภทของข้อความและจัดการตามนั้น
d.Ack(false)
:บรรทัดนี้จะลบข้อความออกจากคิวซึ่งแสดงว่าได้รับทราบแล้ว
เรียกใช้แอปพลิเคชัน
- เริ่มคอนเทนเนอร์นักเทียบท่า RabbitMQ
docker-compose up -d
2. เริ่ม Backend API ของเรา
go run main.go
API แบ็กเอนด์ [ http://localhost:8000/]
การจัดการ RabbitMQ [ http://localhost:9000/]
ส่วนคิวภายใน [http://localhost:9000/#/queues]
เราจะเห็นว่า queue-1[ชื่อที่เราใช้ในการสร้างคิวในโค้ดของเรา] ถูกสร้างขึ้นแล้ว
ทดสอบ
ส่งคำขอ POST เพื่อดำเนินการภารกิจที่ 1
curl -X POST localhost:8000/task1
การตอบสนองต่อส่วนหน้า
ส่วนหน้าจะได้รับการตอบสนองทันทีว่าได้รับคำขอ Task1 สำเร็จแล้ว ตอนนี้เราไม่ต้องการ Load UI แล้ว
คอนโซล API
เราเห็นบันทึกจาก RabbitMQ Consumer[Golang API] นี่แสดงว่าผู้บริโภคได้รับข้อความคำขอจากคิว
บทสรุป
หากคุณหลงทางในส่วนใดส่วนหนึ่ง คุณสามารถตรวจสอบโครงการ Github ของฉันได้
นี่คือจุดสิ้นสุดของการเดินทางสั้นๆ ของเราในการนำ RabbitMQ ไปใช้ในแอปพลิเคชัน golang หวังว่านี่จะช่วยคุณในโครงการของคุณได้ ฉันจะสร้างบทความเพิ่มเติมในอีกไม่กี่วันข้างหน้าเพื่อแสดงกรณีการใช้งาน RabbitMQ ขั้นสูงเพิ่มเติม ดังนั้นคอยติดตาม ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก ขอให้มีความสุขในการเขียนโค้ด ☺.