基于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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!