chocofamilyme/pubsub-life

实现 Pub/Sub 模式的库

4.1.2 2020-09-10 09:37 UTC

README

该库实现了应用程序的事件驱动架构(Event-Driven Architecture)。

工作示例请查看这里: https://github.com/chocofamilyme/pubsub-life/tree/master/examples

功能

  • 无事务发布事件
  • 订阅事件
  • 如有需要,可以重复将事件发送到同一个队列

要求

  • PHP >=5.6
  • PHP ext-sockets

安装

composer require chocofamilyme/pubsub-life

配置

目前该库仅支持与 RabbitMQ 一起工作,如有需要可以添加其他支持。

配置配置文件

'eventsource' => [
    'default' => env('MESSAGE_BROKER', 'rabbitmq'),

    'drivers' => [
        'rabbitmq' => [
            'adapter'    => 'RabbitMQ',
            'host'     => env('EVENTSOURCE_HOST', 'eventsource'),
            'port'     => env('EVENTSOURCE_PORT', '5672'),
            'user'     => env('EVENTSOURCE_USER', 'guest'),
            'password' => env('EVENTSOURCE_PASSWORD', 'guest'),
        ],
    ],
]

完整列表请查看 - https://github.com/php-amqplib/php-amqplib

使用

对于 RabbitMQ,变量 $routeKey 必须至少包含两个由点 . 分隔的部分。例如 order.created。Exchange 的名称将包含第一个部分,即 order。之后,如果您进入 rabbitmq 的管理员界面,应该会创建一个名为 order 的 exchange。

更新:从版本 2.* 开始,可以指定 exchange 并将其与 $routeKey 路由关联。

更新:从版本 2.* 开始,可以指定 exchange 并将其与路由关联。现在可以指定一个路由数组。

要回送消息到队列,需要在回调函数中抛出 Chocofamily\PubSub\Exceptions\RetryException 异常。消息最多可以重复处理 5 次,之后它将进入死信队列(exchange = DLX)。

可以向订阅者传递以下配置

待办事项

  1. 实现事务性(可能需要包装库)
  2. 实现中间件对象以实现不同的处理器(日志记录、异常处理、重试回调函数等)
  3. 覆盖测试(50%)