前言
最之前已經寫了
RabbitMQ
服務端的配置,詳情可檢視這篇文章——Laravel 佇列之Homestead(ubuntu)下laravel使用RabbitMQ——伺服器配置篇。
接下來就是如何使用RabbitMQ
。參考資料
感謝所有文章作者!
laravel-queue-rabbitmq
laravel + rabbitmq
世上最全的RabbitMQ-總結
RabbitMQ中 exchange、route、queue的關係用法1:單獨使用laravel-queue-rabbitmq
laravel安裝RabbitMQ:
首先注意自己laravel-queue-rabbitmq支援的laravel版本資訊:Package Version Laravel Version Bug Fixes Until 9 6 October 5th, 2021 Documentation 10 6, 7 October 5th, 2021 Documentation 11 8 April 6th, 2021 Documentation 執行安裝命令:
composer require vladimir-yuldashev/laravel-queue-rabbitmq
等待安裝完成後在
config/queue.php
中新增:'connections' => [ // ... 'rabbitmq' => [ 'driver' => 'rabbitmq', 'queue' => env('RABBITMQ_QUEUE', 'default'), 'connection' => PhpAmqpLib\Connection\AMQPLazyConnection::class, 'hosts' => [ [ 'host' => env('RABBITMQ_HOST', '127.0.0.1'), 'port' => env('RABBITMQ_PORT', 5672), 'user' => env('RABBITMQ_USER', 'guest'), 'password' => env('RABBITMQ_PASSWORD', 'guest'), 'vhost' => env('RABBITMQ_VHOST', '/'), ], ], 'options' => [ 'ssl_options' => [ 'cafile' => env('RABBITMQ_SSL_CAFILE', null), 'local_cert' => env('RABBITMQ_SSL_LOCALCERT', null), 'local_key' => env('RABBITMQ_SSL_LOCALKEY', null), 'verify_peer' => env('RABBITMQ_SSL_VERIFY_PEER', true), 'passphrase' => env('RABBITMQ_SSL_PASSPHRASE', null), ], 'queue' => [ 'job' => VladimirYuldashev\LaravelQueueRabbitMQ\Queue\Jobs\RabbitMQJob::class, ], ], /* * Set to "horizon" if you wish to use Laravel Horizon. */ 'worker' => env('RABBITMQ_WORKER', 'default'), ], // ... ],
並且在
config/queue.php
中修改://把sync修改為rabbitmq,同理使用redis驅動則修改為redis 'default' => env('QUEUE_CONNECTION', 'sync'), 'default' => env('QUEUE_CONNECTION', 'rabbitmq'), //或者修改.env下QUEUE_CONNECTION=rabbitmq QUEUE_CONNECTION=rabbitmq
執行命令生成任務類:
php artisan make:job TestQueue
修改
TestQueue.php
程式碼:
<?php
namespace App\Jobs;
use App\Models\UserInfo;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class TestQueue implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
private $data;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($data)
{
//
$this->data = $data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
$data = $this->data;
UserInfo::query()->firstOrCreate(
["phone" => $data["phone"]],
["name" => $data["name"]]
);
}
}
- 呼叫佇列函式:
public function test(Request $request){
$data = ["name" => "李大", "phone" => "12345678901"];
$this->dispatch(new TestQueue($data));
}
- 開啟佇列:
php artisan queue:work
- 呼叫函式後執行結果:
佇列消費成功,檢視資料庫,資料也寫入正常。
用法2:使用laravel-queue-rabbitmq+rabbitmq-server
到這裡,會有一個問題,既然方法1能夠正常使用,為什麼還要加入
rabbitmq-server
,rabbitmq-server
又是幹啥的?
根據官方描述——RabbitMQ is a feature rich, multi-protocol messaging broker. It supports:AMQP 0-9-1
AMQP 1.0
MQTT 3.1.1
STOMP 1.0 through 1.2
翻譯過來就是:RabbitMQ 是一個功能豐富的多協議訊息代理。 它支援以下幾種協議。
根據RabbitMQ官網的描述:
RabbitMQ runs on many operating systems and cloud environments, and provides a wide range of developer tools for most popular languages.
翻譯過來就是:
RabbitMQ 執行在許多作業系統和雲環境中,併為大多數流行語言提供了廣泛的開發工具。總結起來就是:方法1使用的是laravel佇列的使用方法,比較簡單,並沒有涉及到太多佇列當中概念性的東西(例如生產者和消費者等等),而使用
rabbitmq-server
,為大家提供了一個服務端,不管是什麼語言,使用賬號、密碼連線到相應的host
和port
就能使用RabbitMQ。類似的還有EMQX(mqtt服務端)等等。並且rabbitmq-server
提供了一個管理後臺,可以檢視佇列的相關情況,便於管理。啟動rabbitmq-server:
sudo service rabbitmq-server start
開啟佇列:
php artisan queue:work
測試佇列(程式碼和方法1程式碼一樣)結果:
注意:
在config/queue.php
的username
和password
裡不要使用預設的guest賬號密碼來連線,否則會報錯:
The connection timed out after 3 sec while awaiting incoming data
前文已經新增過admin的賬號密碼,使用這個賬號密碼還需要給admin賬號新增許可權:
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
在rabbitmq-server
管理後臺檢視使用者許可權:
有許可權是Can access virtual hosts
顯示/
,無許可權就是顯示No Access
。
其他用法
1、laravel-queue-rabbitmq+Supervisor守護程式。本質上就是換了個佇列驅動,用法和redis無任何差別;
2、可以使用類似這種用法:java操作RabbitMQ,脫離了laravel,使用連線+生產者+消費者的方式;
3、還可以使用更復雜的用法,例如接入其他通訊協議(例如MQTT),訂閱主題的方式等等,具體用法可以參考RabbitMQ官網。總結
常規使用laravel+redis佇列+Supervisor的方式已經能滿足我們日常需要。按照錢老的《工程控制論》的說法就是——一個系統,最新或者最先進的技術未必是最優的,適合系統的、確保系統穩定的才是最好的。
當然反過來我們也不能墨守成規,自己的技能包也要適時的更新和進步,這樣才能無愧於自己,無愧於自己熱愛的事業。
本作品採用《CC 協議》,轉載必須註明作者和本文連結