โหมดการทำงานของ RabbitMQ สำหรับการทำงานเรียงต่อกัน
โหมดการทำงานเรียงต่อกันใน RabbitMQ เกี่ยวข้องกับการกำหนดค่าผู้บริโภคหลายคนในการประมวลผลข้อความจากคิวเดียวกัน ซึ่งสามารถเพิ่มความเร็วในการประมวลผลข้อความพร้อมกันได้ สถาปัตยกรรมแสดงในแผนภาพด้านล่าง:
หมายเหตุ: ไม่ว่าจะใช้โหมดการทำงานใดของ RabbitMQ ก็ตาม แต่ละคิวรอรับผู้บริโภคหลายคน และข้อความในคิวเดียวกันจะถูกประมวลผลโดยผู้บริโภคอย่างน้อยหนึ่งคนเท่านั้น
1. บทเรียนเบื้องต้นที่ต้องการ
กรุณาอ่านส่วนต่อไปนี้เพื่อเข้าใจความรู้ที่เกี่ยวข้อง:
- คอนเซ็ปต์หลักของ RabbitMQ
- โหมดการทำงานของ RabbitMQ
- เริ่มต้นอย่างรวดเร็วสำหรับ PHP ใน RabbitMQ (ต้องอ่านเพราะแผนกถัดไปจะไม่ทำซ้ำโค้ด แสดงเฉพาะโค้ดสำคัญเท่านั้น)
2. การสร้างผู้บริโภคหลายคนใน PHP
PHP โดยตัวเองไม่รองรับเทคโนโลยีที่ทำงานพร้อมกัน เช่น multi-threading และ coroutines ดังนั้นมักจะใช้โหมด multi-process เพื่อทำงานโดยพร้อม ตรงนี้เราใช้โหมด multi-process เพื่อทำให้ผู้บริโภคทำงานในคิวพร้อมกัน
2.1. เริ่มต้นด้วยการเปิดกาลเป็นหลายกระบวนการ
เพื่อสร้างกระบวนการหลายตัว, วิธีที่ง่ายที่สุดคือให้ทำการเรียกใช้คำสั่ง PHP หลายครั้ง
ตัวอย่าง:
ถ้าสมมติว่าสคริปต์ของผู้บริโภคจากแผนกก่อนหน้าคือ recv.php
, เราสามารถเปิดหน้าต่าง shell หลายๆ หน้าต่างและเรียกใช้สคริปต์ผู้บริโภคเหมือนนี้:
php recv.php
php recv.php
หรือใน shell เดียวกัน, นำสคริปต์ต่อไปนี้ไปรันพื้นหลัง:
php recv.php &
php recv.php &
อธิบาย: ข้อเสียของการสร้างผู้บริโภคหลายตัวอย่างนี้คือ กระบวนการจะไม่ได้รับการดูแลรักษาไว้ดี และไม่มีการตรวจสอบกระบวนการ หากกระบวนการล้มเหลว จะไม่มีการรันอัตโนมัติ
2.2. ใช้ Supervisor เพื่อสร้างหลายกระบวนการ
Supervisor เป็นโปรแกรมตรวจสอบกระบวนการในระบบปฏิบัติการ Linux ซึ่งสามารถตรวจสอบกระบวนการ PHP ถ้ากระบวนการ PHP ล้มเหลว, จะถูกรันใหม่โดยอัตโนมัติ เราสามารถกำหนดความพร้อมในการทำงานของกระบวนการได้ง่ายๆ
นี่คือตัวอย่างการใช้งานบน Ubuntu, คล้ายกันสำหรับการกระจาย Linux อื่นๆ
การติดตั้ง Supervisor
sudo apt-get install supervisor
การกำหนดค่าใช้ Supervisor
ไฟล์การกำหนดค่าสำหรับ Supervisor มักจะอยู่ที่ไดเรกทอรี /etc/supervisor/conf.d ในไดเรกทอรีนี้, คุณสามารถสร้างไฟล์การกำหนดค่าเท่าที่คุณอยากบอกให้ Supervisor ตรวจสอบว่าเราจะวิ่งกระบวนการอย่างไร ตัวอย่างเช่น สร้างไฟล์ rabbitmq-worker.conf
เพื่อตรวจสอบกระบวนการผู้บริโภคของเรา
ตัวอย่าง: ไฟล์: rabbitmq-worker.conf
[program:rabbitmq-worker]
process_name=%(program_name)s_%(process_num)02d
command=php recv.php
autostart=true
autorestart=true
user=root
numprocs=10
redirect_stderr=true
stdout_logfile=/var/log/worker.log
คำอธิบายพารามิเตอร์:
- process_name: คำนิยามชื่อกระบวนการ, สามารถตั้งชื่ออะไรก็ได้ ที่นี่ใช้อักษรตัวแปร 2 ตัว:
program_name
(ชื่อกระบวนการ) และprocess_num
(เลขกระบวนการ) - command: คำสั่งที่เราต้องการรัน
- autostart: ว่าจะเริ่มต้นเมื่อบูตเครื่องหรือไม่
- autorestart: ว่าจะเริ่มต้นใหม่โดยอัตโนมัติหลังจากล้มเหลวหรือไม่
- user: ผู้ใช้ระบบที่จะใช้ในการรันคำสั่ง
- numprocs: จำนวนกระบวนการทุกว่าง, บ่งบอกว่าจะวิ่งกระบวนการเท่าไหร่
- stdout_logfile: ที่เก็บไฟล์ log การทำงาน