ivan-grebnev/laravel-rabbitmq

Laravel 队列 RabbitMQ 驱动程序。

0.7.0 2024-08-09 11:33 UTC

This package is auto-updated.

Last update: 2024-09-09 11:49:49 UTC


README

默认情况下,Laravel 框架不包括队列功能的 RabbitMQ 驱动程序。此软件包增加了对此消息代理的兼容性。

您还可以与其他不支持 Laravel 原生队列消息格式的系统交换消息。

安装

只需通过 Composer 安装此软件包

composer require ivan-grebnev/laravel-rabbitmq

并在 .env 文件中设置环境变量和用于连接 RabbitMQ 服务器的凭据,例如

RABBITMQ_HOST=some.hostname # or IP-address 
RABBITMQ_PORT=5672
RABBITMQ_USER=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VHOST=/

配置

默认配置位于 src/config/default.php。您可以在项目的 config/queue.php 中的 rabbitmq 部分覆盖任何配置选项,例如

...
'rabbitmq' => [
    'tasks' => [
        // parameters of concrete task
        'SomeSend' => [
            'exchange' => 'Some.Send.Exchange',
            'routing_key' => 'Any.Routing.Key',
        ],
        'SomeRecieve' => [
            'queue' => 'Some.Recieve.Queue',
            'job' => \App\Jobs\Exchange\RecieveJob::class,
        ]
    ],
    // here default parameters for all tasks
    'defaults' => [
        'worker_job' => \App\Jobs\Exchange\CustomWorkerJob::class,
        'exchange_type' => 'topic',
        'consume_no_ack' => true,
    ],
],
...

对于所有任务配置,都从 "defaults" 部分获取,但在具体任务的参数中可以覆盖。

您可以在带有注释的源配置文件中看到所有可能的设置 https://github.com/ivan-grebnev/laravel-rabbitmq/blob/master/src/config/default.php

任务

任务 是什么意思?Laravel 使用 "queue" 一词来指代应用程序与队列服务器之间的消息通道。但是 RabbitMQ 消息代理还有一个作为入口点的 exchange,并且 exchange 可以与 queue 有相同的名称。因此,引入了 task 的概念来分离配置设置。因此下面的示例将工作

// config/queue.php
...
'rabbitmq' => [
    'tasks' => [
        'UsersSendTask' => [
            'exchange' => 'Site.Users',
        ],
        'UsersRecieveTask' => [
            'queue' => 'Site.Users',
            'job' => \App\Jobs\Exchange\UsersRecieveJob::class,
        ]
    ],
    'defaults' => [
        'worker_job' => \App\Jobs\Exchange\CustomWorkerJob::class,
    ],
],
...

这在这种情况下是必要的,即当 RabbitMQ 队列不仅用于应用程序的内部需求,而且还用于与其他系统交换数据时,我们将消息推送到一个交换或队列,并从其他队列中拉取我们的消息。

因此,在软件包源中,task 就像 Laravel 中的 queue,而 queue 则是 RabbitMQ 的确切 queue。因此,要执行上面的示例

UsersSendJob::dispatch()->onConnection('rabbitmq')->onQueue('UsersSendTask');

artisan queue:work rabbitmq --queue=UsersRecieveTask

自定义作业

有三种类型的作业

  • 发送到交换 / 队列作业
  • 由工作者拉取作业
  • 执行作业

...待续...