一架梯子,一头程序猿,仰望星空!
RabbitMQ教程 > 内容正文

PHP RabbitMQ Work模式(多个消费者)


PHP RabbitMQ Work模式,就是配置多个消费者消费同一个队列的消息,可以提高消息的并发处理速度,架构如下图

RabbitMQ Work模式

提示:无论使用RabbitMQ那种工作模式,每个队列都支持多个消费者,同一个队列,一条消息只会被其中一个消费者处理。

1.前置教程

请先阅读下面章节,了解相关知识

2.PHP实现多个消费者

PHP因为自己本身不支持多线程、协程之类的并发技术,通常使用多进程方式实现并发处理,这里使用多进程模式实现多个消费者并发消费队列内的消息。

2.1.手动启动多个进程

要实现多进程,最简单的办法就是手动运行多次PHP命令即可。
例如:
上一个章节中的消费者脚本为:recv.php

我们可以打开多个shell窗口重复执行消费者脚本即可

# 下面启动两个消费者
# shell窗口1
php recv.php

# shell窗口2
php recv.php

也可以这样:

# shell窗口1
php recv.php &
php recv.php &

在同一个shell窗口内,将脚本放到后台运行

说明:这种手动启动多个php脚本的方式实现多个消费者,缺点就是进程不好维护,没有进程监控,如果进程挂了,不会自动重启。

2.2.Supervisor实现多进程

Supervisor 是 Linux 操作系统下中的一个进程监控器,通过Supervisor可以监控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 - 进程名字定义,可以随便命名, 这里用了两个变量program_name(进程名)和process_num(进程编号)
  • command - 我们需要运行的命令
  • autostart - 是否开机启动
  • autorestart - 是否自动重启
  • user - 使用哪个系统账号运行命令
  • numprocs - 进程并发数,打算启动几个进程
  • stdout_logfile - 运行日志文件保存在哪里

推荐教程