介紹
注意:這次的開發純粹是為了學習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配置元件
step2:在控制器中使用元件/** 普通佇列定義 */ '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, //定義優先順序佇列時配置 ],
這裡的CountJob是消費的實體,物件的定義如:Yii::$app->easyQueue->push(new CountJob([ 'count' => 1, ]);
step3:增加消費者class CountJob extends \pzr\amqp\AmqpJob { public $count; public function execute() { return $this->count; } }
首先是消費者元件的配置:
然後在控制器中呼叫消費者元件:/** 普通消費者 */ 'consumer' => [ // 'class' => \pzr\amqp\Amqp::class, 'class' => \pzr\amqp\AmqpBase::class, 'host' => '127.0.0.1', 'port' => 5672, 'user' => 'guest', 'password' => 'guest', ],
最後為了方便測試,可以在cli下啟動消費者程式:class AmqpController extends Controller { // 普通消費者定義 public function actionConsumer($queueName, $qos) { Yii::$app->consumer->consume($queueName, $qos); } }
/usr/bin/php yii amqp/consumer queueName qos
最後
其他的佇列實現也是類似,但是Rpc佇列會和其他的稍有不同。第一節就先講這麼多!感興趣的話可以看看guthub的ReadMe(持續更新中)。有任何問題非常希望指正,提Issue,留言評論!
Composer的資源是(還沒有穩定的版本,努力中):composer require pzr/amqp
下一節說說Rpc佇列的實現!
本作品採用《CC 協議》,轉載必須註明作者和本文連結