nuwber/rabbitevents

Nuwber RabbitEvents 包

资助包维护!
masterjus

v8.2.1 2024-04-30 09:06 UTC

README

Tests Status codecov Total Downloads Latest Version License

让我们想象一个用例:一个用户完成了一笔支付。您需要处理这笔支付,注册用户,发送电子邮件,将分析数据发送到您的分析系统等。现代基础设施要求您创建执行特定任务且只执行该任务的微服务:一个处理支付,一个用于用户管理,一个用于邮件系统,一个用于分析。如何让所有这些都知道支付成功并处理此消息?答案是“使用 RabbitEvents”。

再次强调,RabbitEvents 库可以帮助您发布事件并在另一个应用程序中处理它。在同一应用程序中使用它没有意义,因为 Laravel 的事件处理效果更好。

重要

注意版本 7 用户! 已发布新版本 7.3.0,支持 ext-amqp(类似于版本 8.2)。更新以提高性能。

演示

rabbit-events-demo

目录

  1. 通过 Composer 安装
  2. 从 7.x 升级到 8.x
  3. 发布组件
  4. 监听组件
  5. 示例
  6. 加速 RabbitEvents
  7. 非标准使用
  8. 许可

通过 Composer 安装

您可以使用 Composer 将 RabbitEvents 安装到您的 Laravel 项目中

composer require nuwber/rabbitevents

配置

安装 RabbitEvents 后,使用 rabbitevents:install Artisan 命令发布其配置和 Service Provider

php artisan rabbitevents:install

此命令将在 config/rabbitevents.php 安装配置文件,并在 app/providers/RabbitEventsServiceProvider.php 安装 Service Provider 文件。

配置文件与队列连接非常相似,但具有单独的配置,这样您就不会混淆是否有另一个连接到 RabbitMQ。

<?php
use Enqueue\AmqpTools\RabbitMqDlxDelayStrategy;

return [
    'default' => env('RABBITEVENTS_CONNECTION', 'rabbitmq'),
    'connections' => [
        'rabbitmq' => [
            'driver' => 'rabbitmq',
            'exchange' => env('RABBITEVENTS_EXCHANGE', 'events'),
            'host' => env('RABBITEVENTS_HOST', 'localhost'),
            'port' => env('RABBITEVENTS_PORT', 5672),
            'user' => env('RABBITEVENTS_USER', 'guest'),
            'pass' => env('RABBITEVENTS_PASSWORD', 'guest'),
            'vhost' => env('RABBITEVENTS_VHOST', 'events'),
            'delay_strategy' => env('RABBITEVENTS_DELAY_STRATEGY', RabbitMqDlxDelayStrategy::class),
            'ssl' => [
                'is_enabled' => env('RABBITEVENTS_SSL_ENABLED', false),
                'verify_peer' => env('RABBITEVENTS_SSL_VERIFY_PEER', true),
                'cafile' => env('RABBITEVENTS_SSL_CAFILE'),
                'local_cert' => env('RABBITEVENTS_SSL_LOCAL_CERT'),
                'local_key' => env('RABBITEVENTS_SSL_LOCAL_KEY'),
                'passphrase' => env('RABBITEVENTS_SSL_PASSPHRASE', ''),
            ],
            'read_timeout' => env('RABBITEVENTS_READ_TIMEOUT', 3.),
            'write_timeout' => env('RABBITEVENTS_WRITE_TIMEOUT', 3.),
            'connection_timeout' => env('RABBITEVENTS_CONNECTION_TIMEOUT', 3.),
            'heartbeat' => env('RABBITEVENTS_HEARTBEAT', 0),
            'persisted' => env('RABBITEVENTS_PERSISTED', false),
            'lazy' => env('RABBITEVENTS_LAZY', true),
            'qos' => [
                'global' => env('RABBITEVENTS_QOS_GLOBAL', false),
                'prefetch_size' => env('RABBITEVENTS_QOS_PREFETCH_SIZE', 0),
                'prefetch_count' => env('RABBITEVENTS_QOS_PREFETCH_COUNT', 1),
            ]
        ],
    ],
    'logging' => [
        'enabled' => env('RABBITEVENTS_LOG_ENABLED', false),
        'level' => env('RABBITEVENTS_LOG_LEVEL', 'info'),
        'channel' => env('RABBITEVENTS_LOG_CHANNEL'),
    ],
];

从 7.x 升级到 8.x

PHP 8.1 需要

RabbitEvents 现在需要 PHP 8.1 或更高版本。

支持的 Laravel 版本

RabbitEvents 现在支持 Laravel 9.0 或更高版本。

rabbitevents:listen 命令中删除了 --connection 选项

存在一个需要解决的问题 #98。默认连接总是被使用。

RabbitEvents 发布者

RabbitEvents 发布者组件提供了一种在应用程序结构中发布事件的 API。有关其工作方式的更多信息,请参阅 RabbitEvents 发布者页面

RabbitEvents 监听器

RabbitEvents 监听器组件提供了一种在应用程序结构中处理发布的事件的 API。有关其工作方式的更多信息,请参阅 RabbitEvents 监听器页面

加速 RabbitEvents

为了提高 RabbitEvents 的性能,考虑安装 php-amqp 扩展以及 enqueue/amqp-ext 包。通过这样做,RabbitEvents 将利用 enqueue/amqp-ext 包而不是默认的 enqueue/amqp-lib 包。这种替换的好处是,用 C 编写的 php-amqp 包在性能上显著优于用 PHP 编写的 enqueue/amqp-lib 包。

您可以使用以下命令安装 php-amqp 扩展:

pecl install amqp

或者使用您喜欢的任何方式。更多相关信息,请参阅这里

接下来,使用以下命令安装enqueue/amqp-ext

composer require enqueue/amqp-ext

不需要额外的配置。

非标准使用

如果您只使用RabbitEvents的一部分,您应该了解以下几点

  1. 记住,我们正在使用RabbitMQ作为传输层。在RabbitMQ文档中,您可以找到使用路由键发布消息的示例。这个路由键是事件名称,例如上面示例中的something.happened

  2. RabbitEvents期望消息体是一个JSON编码的数组。数组的每个元素都将作为单独的变量传递给Listener。例如

[
  {
    "key": "value"  
  },
  "string",
  123 
]

这个数组中有3个元素,所以将会有3个变量传递给Listener(一个数组、一个字符串和一个整数)。如果传递的是一个关联数组,Dispatcher会自己包装这个数组。

许可证

RabbitEvents是一个开源软件,许可协议为MIT许可