โหมดการทำงานของ RabbitMQ สำหรับการทำงานเรียงต่อกัน

โหมดการทำงานเรียงต่อกันใน RabbitMQ เกี่ยวข้องกับการกำหนดค่าผู้บริโภคหลายคนในการประมวลผลข้อความจากคิวเดียวกัน ซึ่งสามารถเพิ่มความเร็วในการประมวลผลข้อความพร้อมกันได้ สถาปัตยกรรมแสดงในแผนภาพด้านล่าง:

โหมดการทำงานของ RabbitMQ

หมายเหตุ: ไม่ว่าจะใช้โหมดการทำงานใดของ RabbitMQ ก็ตาม แต่ละคิวรอรับผู้บริโภคหลายคน และข้อความในคิวเดียวกันจะถูกประมวลผลโดยผู้บริโภคอย่างน้อยหนึ่งคนเท่านั้น

1. บทเรียนเบื้องต้นที่ต้องการ

กรุณาอ่านส่วนต่อไปนี้เพื่อเข้าใจความรู้ที่เกี่ยวข้อง:

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 การทำงาน