นายหน้าข้อความ | คิว | การส่งข้อความแบบอะซิงโครนัส | จิน | พร้อมตัวอย่าง

สวัสดีนักพัฒนา 💻💻 ในบทความชุดต่อไปนี้ ฉันกำลังวางแผนที่จะสาธิตวิธีที่เราสามารถแนะนำตัวกลางส่งข้อความในโครงสร้างพื้นฐานแบ็กเอนด์ของเรา ซึ่งจะทำให้เราสามารถดำเนินการประมวลผลแบบอะซิงโครนัสและแบบกระจายได้ ในบทความนี้ ฉันจะใช้เวิร์กโฟลว์ง่ายๆ โดยใช้ 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):บรรทัดนี้จะลบข้อความออกจากคิวซึ่งแสดงว่าได้รับทราบแล้ว

เรียกใช้แอปพลิเคชัน

  1. เริ่มคอนเทนเนอร์นักเทียบท่า 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 ขั้นสูงเพิ่มเติม ดังนั้นคอยติดตาม ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก ขอให้มีความสุขในการเขียนโค้ด ☺.