iferus/laravel-queue-rabbitmq

Laravel Queue 的 RabbitMQ 驱动。支持 Laravel Horizon。

25 2020-04-16 14:24 UTC

README

Latest Stable Version Build Status Total Downloads StyleCI License

支持策略

只有最新版本会获得新功能。将使用以下方案提供错误修复:

安装

您可以使用以下命令通过 composer 安装此包:

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),
           ],
       ],
   
       /*
        * Set to "horizon" if you wish to use Laravel Horizon.
        */
       'worker' => env('RABBITMQ_WORKER', 'default'),
        
    ],

    // ...    
],

可选配置

可选地,向连接的配置中添加队列选项。为此连接创建的每个队列都将获得这些属性。

当您希望在消息延迟时优先处理消息时,可以通过添加额外选项来实现。

  • 当省略最大优先级时,当使用时,最大优先级设置为 2。
'connections' => [
    // ...

    'rabbitmq' => [
        // ...

        'options' => [
            'queue' => [
                // ...

                'prioritize_delayed_messages' =>  false,
                'queue_max_priority' => 10,
            ],
        ],
    ],

    // ...    
],

当您想通过路由键发布针对交换的消息时,可以通过添加额外选项来实现。

  • 当省略交换时,RabbitMQ 将使用 amq.direct 交换来处理路由键。
  • 当省略路由键时,默认的路由键是队列的名称。
  • 当在路由键中使用 %s 时,将替换队列名称。

注意:当使用带有路由键的交换时,您可能需要自己创建队列的绑定。

'connections' => [
    // ...

    'rabbitmq' => [
        // ...

        'options' => [
            'queue' => [
                // ...

                'exchange' => 'application-x',
                'exchange_type' => 'topic',
                'exchange_routing_key' => '',
            ],
        ],
    ],

    // ...    
],

在 Laravel 中,失败的作业存储在数据库中。但也许您希望指示其他进程也处理消息。当您想指示 RabbitMQ 将失败消息重路由到交换或特定队列时,可以通过添加额外选项来实现。

  • 当省略交换时,RabbitMQ 将使用 amq.direct 交换来处理路由键。
  • 当省略路由键时,默认的路由键是队列名称,替换为 '.failed'
  • 当在路由键中使用 %s 时,将替换队列名称。

注意:当使用带有路由键的失败作业交换时,您可能需要自己创建交换/队列的绑定。

'connections' => [
    // ...

    'rabbitmq' => [
        // ...

        'options' => [
            'queue' => [
                // ...

                'reroute_failed' => true,
                'failed_exchange' => 'failed-exchange',
                'failed_routing_key' => 'application-x.%s',
            ],
        ],
    ],

    // ...    
],

Laravel 使用

完成配置后,您可以使用 Laravel 队列 API。如果您使用过其他队列驱动程序,您不需要更改其他任何内容。如果您不知道如何使用队列 API,请参阅官方 Laravel 文档:https://laravel.net.cn/docs/queues

Laravel Horizon 使用

从 8.0 版本开始,此包默认支持 Laravel Horizon。首先安装 Horizon,然后设置 RABBITMQ_WORKERhorizon

Lumen 使用

对于 Lumen 使用,应在 bootstrap/app.php 中手动注册服务提供程序,如下所示:

$app->register(VladimirYuldashev\LaravelQueueRabbitMQ\LaravelQueueRabbitMQServiceProvider::class);

消费消息

有两种方式可以消费消息。

  1. queue:work 命令是 Laravel 的内置命令。此命令利用 basic_get

  2. rabbitmq:consume 命令由本包提供。此命令利用 basic_consume,比 basic_get 性能高出约 2 倍。

测试

使用 docker-compose 设置 RabbitMQ

docker-compose up -d rabbitmq

要运行测试套件,可以使用以下命令:

# To run both style and unit tests.
composer test

# To run only style tests.
composer test:style

# To run only unit tests.
composer test:unit

如果您收到样式测试的错误,您可以使用以下命令自动修复大多数,如果不是全部问题:

composer fix:style

贡献

您可以通过发现错误并打开问题来为此包做出贡献。请指出您创建拉取请求或问题的是哪个包版本。(例如,[5.2] 延迟作业出现致命错误)