PHP RabbitMQ 작업 모드

RabbitMQ의 작업 모드는 동일한 대기열에서 메시지를 처리하기 위해 여러 소비자를 구성하는 것을 포함하며, 이는 메시지의 동시 처리 속도를 증가시킬 수 있습니다. 아키텍처는 아래 다이어그램에 나와 있습니다:

RabbitMQ Work Mode

참고: RabbitMQ 작업 모드를 사용하든 말든, 각 대기열은 여러 소비자를 지원하며, 동일한 대기열의 메시지는 소비자 중 하나에 의해서만 처리됩니다.

1. 사전 튜토리얼

관련 지식을 이해하기 위해 다음 섹션을 읽어주세요:

2. PHP에서 여러 소비자 구현하기

PHP 자체는 멀티 스레딩 및 협동 프로그래밍과 같은 동시성 기술을 지원하지 않으므로 일반적으로 병렬 처리를 달성하기 위해 멀티 프로세스를 사용합니다. 여기서는 대기열에서 메시지를 병행하여 처리하는 여러 소비자를 구현하기 위해 멀티 프로세스 모드를 사용합니다.

2.1. 수동으로 여러 프로세스 시작하기

여러 프로세스를 구현하려면 가장 간단한 방법은 PHP 명령을 여러 번 수동으로 실행하는 것입니다.

예를 들어: 이전 섹션에서의 소비자 스크립트가 recv.php라고 가정하면, 다음처럼 여러 쉘 창을 열고 소비자 스크립트를 반복해서 실행할 수 있습니다:

php recv.php

php recv.php

또는 동일한 쉘 창에서 스크립트를 백그라운드로 실행할 수 있습니다:

php recv.php &
php recv.php &

설명: 이 수동 방식으로 여러 소비자를 구현하는 단점은 프로세스가 제대로 유지되지 않고 프로세스 모니터링이 없다는 것입니다. 프로세스가 충돌하면 자동으로 다시 시작되지 않습니다.

2.2. Supervisor를 사용하여 여러 프로세스 구현하기

Supervisor는 리눅스 운영 체제의 프로세스 모니터로 PHP 프로세스를 모니터링할 수 있습니다. PHP 프로세스가 충돌하면 자동으로 다시 시작됩니다. 또한 프로세스의 동시성을 구성할 수 있어 여러 소비자의 병행 처리를 쉽게 실현할 수 있습니다.

우분투를 사용하는 경우 예시는 다음과 유사합니다.

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: 프로세스 이름의 정의로 임의로 이름을 지을 수 있습니다. 여기서 두 개의 변수인 program_name (프로세스 이름)과 process_num (프로세스 번호)을 사용했습니다.
  • command: 실행해야 하는 명령어입니다.
  • autostart: 부팅시 자동으로 시작할지 여부입니다.
  • autorestart: 자동으로 다시 시작할지 여부입니다.
  • user: 명령을 실행할 때 사용할 시스템 계정입니다.
  • numprocs: 병행 프로세스의 수로 시작할 프로세스의 수를 나타냅니다.
  • stdout_logfile: 실행 로그 파일이 저장될 위치입니다.