1. 程式人生 > >Laravel 集成 RabbitMQ 消息隊列

Laravel 集成 RabbitMQ 消息隊列

ras php ruby 發布者 tor 用戶 部署 可靠性 -name

目錄

  • 消息隊列
  • RabbitMQ
  • docker 部署 RabbitMQ
    • 操作步驟
    • 訪問管理界面
  • Laravel 集成 RabbitMQ
    • Laravel 5.2
    • Laravel 5.5

消息隊列

消息(Message)是指在應用間傳送的數據。可以只包含文本字符串,也可以嵌入對象。

消息隊列(Message Queue)是一種應用間的通信方式,消息發送後可以立即返回,由消息系統來確保消息的可靠傳遞。

消息發布者只管把消息發布到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發布的。這樣發布者和使用者都不用知道對方的存在。

消息隊列是一種應用間的異步協作機制,主要用於業務解耦。常見場景包括最終一致性、廣播、錯峰控流等。

RabbitMQ

RabbitMQ 是一個由 Erlang 語言開發的 AMQP1 的開源實現。

RabbitMQ 最初起源於金融系統,用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。具體特點包括:

  1. 可靠性(Reliability)
    RabbitMQ 使用一些機制來保證可靠性,如持久化、傳輸確認、發布確認。

  2. 靈活的路由(Flexible Routing)
    在消息進入隊列之前,通過Exchange來路由消息的。對於典型的路由功能,RabbitMQ 已經提供了一些內置的Exchange來實現。針對更復雜的路由功能,可以將多個Exchange綁定在一起,也通過插件機制實現自己的 Exchange 。

  3. 消息集群(Clustering)多個RabbitMQ服務器可以組成一個集群,形成一個邏輯 Broker 。

  4. 高可用(Highly Available Queues)
    隊列可以在集群中的機器上進行鏡像,使得在部分節點出問題的情況下隊列仍然可用。

  5. 多種協議(Multi-protocol)
    RabbitMQ 支持多種消息隊列協議,比如 STOMP、MQTT 等等。

  6. 多語言客戶端(Many Clients)
    RabbitMQ 幾乎支持所有常用語言,比如 Java、.NET、Ruby 等等。

  7. 管理界面(Management UI)
    RabbitMQ 提供了一個易用的用戶界面,使得用戶可以監控和管理消息 Broker 的許多方面。

  8. 跟蹤機制(Tracing)如果消息異常,RabbitMQ 提供了消息跟蹤機制,使用者可以找出發生了什麽。

  9. 插件機制(Plugin System)
    RabbitMQ 提供了許多插件,來從多方面進行擴展,也可以編寫自己的插件。

docker 部署 RabbitMQ

操作步驟

docker search rabbitmq:management

docker pull rabbitmq:management

docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 rabbitmq:management

訪問管理界面

http://宿主機IP:15672 # 默認賬號密碼 guest guest

Laravel 集成 RabbitMQ

Laravel 5.2

  1. 下載擴展
composer require vladimir-yuldashev/laravel-queue-rabbitmq:5.2

composer update
  1. config/app.php 中,providers 數組中添加
VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class,
  1. app/config/queue.php 文件中,connections 數組中添加
'rabbitmq' => [
    'driver'                => 'rabbitmq',
 
    'host'                  => env('RABBITMQ_HOST', '127.0.0.1'),
    'port'                  => env('RABBITMQ_PORT', 5672),
 
    'vhost'                 => env('RABBITMQ_VHOST', '/'),
    'login'                 => env('RABBITMQ_LOGIN', 'guest'),
    'password'              => env('RABBITMQ_PASSWORD', 'guest'),
 
    'queue'                 => env('RABBITMQ_QUEUE'), // name of the default queue,
 
    'exchange_declare'      => env('RABBITMQ_EXCHANGE_DECLARE', true), // create the exchange if not exists
    'queue_declare_bind'    => env('RABBITMQ_QUEUE_DECLARE_BIND', true), // create the queue if not exists and bind to the exchange
 
    'queue_params'          => [
        'passive'           => env('RABBITMQ_QUEUE_PASSIVE', false),
        'durable'           => env('RABBITMQ_QUEUE_DURABLE', true),
        'exclusive'         => env('RABBITMQ_QUEUE_EXCLUSIVE', false),
        'auto_delete'       => env('RABBITMQ_QUEUE_AUTODELETE', false),
    ],
 
    'exchange_params' => [
        'name'        => env('RABBITMQ_EXCHANGE_NAME', null),
        'type'        => env('RABBITMQ_EXCHANGE_TYPE', 'direct'), // more info at http://www.rabbitmq.com/tutorials/amqp-concepts.html
        'passive'     => env('RABBITMQ_EXCHANGE_PASSIVE', false),
        'durable'     => env('RABBITMQ_EXCHANGE_DURABLE', true), // the exchange will survive server restarts
        'auto_delete' => env('RABBITMQ_EXCHANGE_AUTODELETE', false),
    ],
 
],
  1. .env 中添加
QUEUE_DRIVER=rabbitmq
 
RABBITMQ_HOST=127.0.0.1
RABBITMQ_PORT=5672
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_QUEUE=queue_name

Laravel 5.5

  1. 下載擴展
composer require vladimir-yuldashev/laravel-queue-rabbitmq
  1. .env 中添加
QUEUE_DRIVER=rabbitmq
RABBITMQ_QUEUE=queue_name
RABBITMQ_HOST=127.0.0.1
RABBITMQ_PORT=5672
RABBITMQ_VHOST=/
RABBITMQ_LOGIN=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_QUEUE=queue_name

如果使用 ssl 連接

RABBITMQ_SSL=true
RABBITMQ_SSL_CAFILE=/path_to_your_ca_file
RABBITMQ_SSL_LOCALCERT=
RABBITMQ_SSL_PASSPHRASE=
RABBITMQ_SSL_KEY=

以上就可以使用 Laravel Queue 了。


  1. Advanced Message Queue Protocol,高級消息隊列協議。它是應用層協議的一個開放標準,為面向消息的中間件設計,基於此協議的客戶端與消息中間件可傳遞消息,並不受產品、開發語言等條件的限制。?

Laravel 集成 RabbitMQ 消息隊列