基於Yii2對RabbitMQ的基本用法封裝及消費者程式web管理(三)

so_easy發表於2020-08-30

前言

系列文章的一二三都是講解了基本用法,四細聊一些實現細則。分享是為了得到大家的指點,讓我覺得我不是一個人在戰鬥!

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 協議》,轉載必須註明作者和本文連結

相關文章