基於Yii2對RabbitMQ的基本用法封裝及消費程式管理控制(一)

easyer發表於2020-08-28

介紹

注意:這次的開發純粹是為了學習Yii2框架,突然蹦出一個想法:為何不結合RabbitMQ實現學習Yii2呢?於是就動手幹起來了!後來又為了練手程式管理,所以模擬Supervisor實現了配套的消費者程式web管理。所以從頭到尾感覺都是在重複造輪子。但是不動手實踐怎麼能夠知道輪子中的奧妙呢?
警告:本類庫目前只用於討論RabbitMQ的實現,起到拋磚引玉的作用。請不要用於線上,線上事故概不負責:)

基於Yii2框架完成的yii2-amqp類庫,可以通過composer整合到專案中。雖然是基於Yii2實現的,但是對開發的專案框架並沒有要求。

概念

1、普通佇列:相比延時佇列,沒有啟用延時功能。
exchange --rk--> queue

2、延時佇列:相比普通佇列多了個延時功能
exchange --rk-->queue --ttl-> delayQueue

3、備份路由:訊息沒有正常路由到預期的佇列最後通過備份路由到備份佇列
exchange ------>queue
            |
            \_ aeExchange --> aeQueue

4、佇列副本:一個訊息通過exchange路由到不同佇列
         | --rk0 --> queue0
exchange | --rk1---> queue1
         |-- rk2 --> queue2

5、RPC佇列:支援跨專案呼叫

先說說能幹嗎

  • 實現了RabbitMQ的基本佇列型別:普通佇列、延時佇列、優先佇列、Rpc佇列。
  • 實現普通消費者和Rpc消費者
  • 實現了備份路由
  • 支援RabbitMQ的所有繫結型別。
  • 支援不同的消費內容序列化
  • 支援佇列副本
  • 支援事件訂閱
  • 支援單個訊息傳送和批量訊息傳送
  • 新增配套消費者程式管理
  • 結合佇列副本,支援隨機路由和輪詢路由。(後續還會有加權路由以及動態路由!)
  • 等等還在實現中

    再說怎麼實現

    結合Yii2元件的特性,實現起來也是非常簡單:
    step1:在Yii2配置元件
    /** 普通佇列定義 */
      'easyQueue' => [
          'class' =>  \pzr\amqp\queue\EasyQueue::class,
          'host' => '127.0.0.1',
          'port' => 5672,
          'user' => 'guest',
          'password' => 'guest',
          'queueName' => 'easy_queue',
          'exchangeName' => 'easy_exchange',
          'routingKey' => 'easy',
          // 'serizer' => \pzr\amqp\serializers\PhpSerializer, //default value
          // 'dulicater' => \pzr\amqp\duplicate\DuplicateRandom, //default value
          // 'duplicate' => 0, //佇列的副本數,不啟用則設定為0
          // priority => 10, //定義優先順序佇列時配置
      ],
    step2:在控制器中使用元件
    Yii::$app->easyQueue->push(new CountJob([
      'count' => 1,
    ]);
    這裡的CountJob是消費的實體,物件的定義如:
    class CountJob extends \pzr\amqp\AmqpJob
    {
      public $count;
      public function execute()
      {
          return $this->count;
      }
    }
    step3:增加消費者
    首先是消費者元件的配置:
    /** 普通消費者 */
      'consumer' => [
          // 'class' =>  \pzr\amqp\Amqp::class,
          'class' =>  \pzr\amqp\AmqpBase::class,
          'host' => '127.0.0.1',
          'port' => 5672,
          'user' => 'guest',
          'password' => 'guest',
      ],
    然後在控制器中呼叫消費者元件:
    class AmqpController extends Controller
    {
      // 普通消費者定義
      public function actionConsumer($queueName, $qos)
      {
          Yii::$app->consumer->consume($queueName, $qos);
      }
    }
    最後為了方便測試,可以在cli下啟動消費者程式:
    /usr/bin/php yii amqp/consumer queueName qos

    最後

    其他的佇列實現也是類似,但是Rpc佇列會和其他的稍有不同。第一節就先講這麼多!感興趣的話可以看看guthub的ReadMe(持續更新中)。有任何問題非常希望指正,提Issue,留言評論!
    Composer的資源是(還沒有穩定的版本,努力中):composer require pzr/amqp
    下一節說說Rpc佇列的實現!
本作品採用《CC 協議》,轉載必須註明作者和本文連結
阿門阿前一棵葡萄樹 阿嫩阿嫩綠地剛發芽 蝸牛揹著那重重的殼呀 一步一步地往上爬

相關文章