Laravel 集成 RabbitMQ 消息队列

消息队列

消息(Message)是指在应用间传送的数据。可以只包含文本字符串,也可以嵌入对象。

消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。

消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

消息队列是一种应用间的异步协作机制,主要用于业务解耦。常见场景包括最终一致性、广播、错峰控流等。

RabbitMQ

RabbitMQ 是一个由 Erlang 语言开发的 AMQP[1] 的开源实现。

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,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。 ↩︎

内容来源于网络或书籍
原文地址:https://www.cnblogs.com/my3306/p/9450996.html