基于Yii2对RabbitMQ的基本用法封装及消费者进程web管理(三)

前言#

系列文章的一二三都是讲解了基本用法,四细聊一些实现细则。分享是为了得到大家的指点,让我觉得我不是一个人在战斗!

web 管理#

使用 Supervisor 可以给每个队列分配若干个消费者,并且 Supervisor 会成为他们的守护进程对它们进行管理。竟然如此,那为什么还要自己去重复造轮子呢?
1、因为使用 Supervisor 启动 AMQP 消费者,一个配置只能对应一个队列。倘若我使用了队列副本之后,那么每个队列副本都需要一个配置,所以在部署上会繁琐。
2、如果我临时需要对某个队列增加消费者的话,只能修改 Supervisor 的配置在重启才能做到。而我这个可以通过 COPY 命令临时新增。
3、除此上面两点之外,其他的如:reload、refresh、stop 功能都一样。也可以支持在手机端访问控制,这样周末在家的时候也可以操作消费者了!

AMQP 消费者进程管理只针对 AMQP 消费者进行管理,对其他的进程管理目前还不支持(当然改造改造也能够做到)。进程管理 web 界面包括的功能点有:

  • 支持登入校验。类似 Supervisor 一样,账号密码是保存在配置文件中,不过密码是加密后的密码。
  • 支持进程的 restart、copy、stop 操作。
  • 支持进程管理日志查看,可以跟踪日志发现任何问题(当然,一些没有处理到的问题那就是 bug 了)。
  • 支持对队列的所有消费者进程的连接进行管理。
  • 增加配置文件的解析说明,可以了解目前服务的状态。

说太多不如放实际图更加能够体会:
1、首页页面:

基于Yii2对RabbitMQ的基本用法封装及消费进程管理控制(三)
针对所有进程的执行操作

  • START ALL:启动消费者配置文件中的所有消费者,如果守护进程已经存在则对比消费者配置文件和已启动的消费者进程差异,可能会重启一些被关闭的子进程。如果父进程已经死亡,那么执行此命令会先杀死所有的子进程然后再重启所有的进程。每次执行该命令都会重新读取配置文件,所以消费者文件新增后执行该命令即可新增消费者进程。
  • REFRESH:刷新已经启动的子进程,相当于对每个子进程进行 restart 操作。
  • STOP ALL:杀死所有的子进程,然后父进程也会退出。

针对单个子进程的操作

  • restart:重启该子进程。
  • stop:杀死该子进程
  • copy:复制该子进程的信息然后新增一个子进程。

2、消费者连接管理页面:

基于Yii2对RabbitMQ的基本用法封装及消费进程管理控制(三)
从图中可见文件消费者是四个,而实际消费者又 8 个。那是因为我在两台服务器启动了 web 管理。127.0.0.1 的是在同 AMQP 服务器起的消费者,其他如 49993、49994 及 61008、61009 是我本地启动的。从这些连续的端口可以发现一个规律是:
(1)连续的连接端口号说明是同一时间启动的。如端口号 56651~56653 的是同一时间启动的,对应上图子进程的 20180-20182 端口号。而 56703 是执行 copy 操作之后新增的,对应子进程 20226 端口号(可以通过本页面的删除验证)。
(2)通过以上的规律就可以知道某个队列的消费者情况,并且必要情况采取一些措施。为什么这么说呢?因为我发现一个问题,那就是我本地通过代理连接的 AMQP 服务器,在代理断开之后本地启动的消费者进程虽然看似还在,但是却已经无法提供消费功能。即使从 web 首页将该进程杀死,从 AMQP 的 web 管理依然可见消费者并未减少。这种情况只能通过杀死该连接才能将消费者杀死。为了解决这么问题的出现,可以采取白名单 IP。但是这种问题依然可能存在,如发生网络抖动。所以这个页面的存在很有必要我认为!

3、日志跟踪页面
基于Yii2对RabbitMQ的基本用法封装及消费进程管理控制(三)

这个页面的作用主要是监控程序的运行和 debug 调试。以及结合登入系统可以监控操作人的操作。日志级别包括 debug、info、warning、error、alert 等。可以在配置文件中选择需要记录的日志级别。

日志跟踪包括的有:
(1)Client 日志:web 页面发出请求到 controller,在到 Client。Client 会记录 web 的请求命令。
(2)Server 日志:接收 Client 请求并且分发命令到 Command。
(3)Command 日志:接收到命令分发之后,执行实际的 start、stop、restart 等操作。一般的操作在 Command 层就已经执行完毕,只有 start all 命令稍有不同。执行 start all 命令之后会在当前进程下启动一个子进程去运行 Dispatcher 进程。
(4)Dispatcher 日志:Dispatcher 是启动 AMQP 消费者守护进程和子进程的程序,还可以完成进程通信以及进程文件管理。在这里记录的日志比较多。
(5)通信日志:记录子进程和父进程通信的记录。
(6)进程文件管理日志:记录写文件的信息日志。

4、amqp.ini 解析页面

基于Yii2对RabbitMQ的基本用法封装及消费进程管理控制(三)

通过这个页面可以大概了解目前通过 amqp.ini 启动之后的一些信息。如日志文件是否有权限读写,启动 Server 的本地 socket 是否可以连接,可选的几种服务比如 amqp、redis、beanstalk 是否启动以及目前选择的文件处理方式和进程通信方式等。

5、登入页面
登入页面就不提了,因为我本身写页面的时候就比较懒,都是直接套用的 yii2 的 demo 页面。

安装和配置#

写了这么多,如果你还感兴趣那么就在继续聊一聊怎么安装和配置。
1、下载类库
通过执行 composer require pzr/amqp 或者从 git 上直接作为类库下载下来也可以 https://github.com/easytoeasy/yii2-amqp.git
2、配置 nginx,这个相比大家都会,我就贴一下我自己的配置参考 (也是 copy 的 yii2 下的,稍作一些修改而已)。

server {
   charset utf-8;
   client_max_body_size 128M;
   sendfile off;

   listen 80; ## listen for ipv4
   #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

   server_name amqp.com 127.0.0.1;
   root        /usr/home/wb_kefu/yii2-amqp/frontend/web;
   index       index.php;


  access_log off ;
  error_log /data1/www/logs/yangxing/yii2-amqp_error.log ;

   location / {
       # Redirect everything that isn't a real file to index.php
       try_files $uri $uri/ /index.php$is_args$args;
   }

   # uncomment to avoid processing of calls to non-existing static files by Yii
   #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
   #    try_files $uri =404;
   #}
   #error_page 404 /404.html;

   location ~ \.php$ {
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       #fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
       fastcgi_pass unix:/usr/local/sinasrv2/var/yii2-amqp.sock;
        try_files $uri =404;
   }

   location ~ /\.(ht|svn|git) {
       deny all;
   }
}

3、nginx 指向的 fastcgi_pass 是本地 fpm 启动的一个 sock: unix:/usr/local/sinasrv2/var/yii2-amqp.sock ,因为涉及到写文件所以需要写文件权限,因此在初期配置时碰见各种创建文件和写文件的权限问题,后来为了省事直接将这个 sock 以 root 启动。
4、重启 fpm,nginx 然后就可以访问了。

5、配置 amqp.ini
首先在 cli/config 底下有一个 amqp.ini.default 可供参考,具体的也不难读懂(自嘲:毕竟我写的东西能难理解到哪去呢?都是一些浅显的知识拼接罢了!)。

本作品采用《CC 协议》,转载必须注明作者和本文链接