homedoctor-es/laravel-eventbridge-broadcaster

一个用于将事件发布到 EventBridge 的 Laravel 广播驱动程序。

0.1 2024-07-02 15:21 UTC

This package is auto-updated.

Last update: 2024-10-02 15:47:39 UTC


README

Latest Version on Packagist GitHub Workflow Status Software License Total Downloads

发布平台

类似于 Pusher,此包提供了用于 Laravel 广播 的驱动程序,以便在 AWS EventBridge 上发布服务器端事件。

我们理解 Broadcasting 通常用于将您的 Laravel 服务器端 事件 通过 WebSocket 连接广播到您的客户端 JavaScript 应用程序。然而,我们认为这种利用广播的方式对于 Pub/Sub 架构是有意义的,在这种架构中,应用程序希望广播一个服务器端事件,以通知外部世界刚刚发生了什么。

在这种情况下,当使用 SNS 驱动程序时,“channels”可以理解为“topics”,当使用 EventBridge 驱动程序时,“event buses”可以理解为“event buses”。

订阅者

这部分尚未实现,但我们使用此包 Laravel EventBridge sqs consumer 在其他服务中消费这些事件。

为此,我们使用以下架构

  1. "n" 个发布者,在 EventBridge 中发布事件
  2. 每个事件都在一个 SNS 主题中发布。
  3. 每个主题都可以由一个或多个 SQS 队列消费。
  4. 每个队列对应一个应用程序。

安装

您可以通过 composer 在 Laravel 8+ 应用程序上安装此包

composer require homedoctor-es/laravel-eventbridge-broadcaste

然后,将 HomedoctorEs\EventBridgeBroadcaster\EventBridgeBroadcasterServiceProvider::class 添加到 config/app.php 文件中,以自动加载驱动程序。

发布/广播

配置

您需要在 config/broadcasting.php 配置文件中添加以下连接并配置您的 AWS 凭据

'connections' => [

    'eventbridge' => [ //The connection name will be used as default eventbus
        'driver' => 'eventbridge',
        'region' => env('AWS_DEFAULT_REGION'),
        'key' => env('AWS_ACCESS_KEY_ID'),
        'endpoint' => env('AWS_URL'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'source' => env('AWS_EVENTBRIDGE_SOURCE'),
    ],
    // ...
],

请确保根据需要定义 环境变量

# both drivers require:
AWS_DEFAULT_REGION=you-region
AWS_ACCESS_KEY_ID=your-aws-key
AWS_SECRET_ACCESS_KEY=your-aws-secret

# EventBridge driver only:
AWS_EVENTBRIDGE_SOURCE=com.your-app-name

接下来,您需要确保在 .env 文件中使用 sns 广播驱动程序作为默认驱动程序进行广播

BROADCAST_DRIVER=eventbridge

请注意,如果您需要能够同时使用 两个驱动程序,您可以在事件级别定义连接。

用法

只需按照官方文档中解释的默认方式广播 Laravel 事件即可 官方文档

以类似的方式,您必须确保实现 Illuminate\Contracts\Broadcasting\ShouldBroadcast 接口,并定义您希望广播的频道。

use App\Models\Order;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Broadcasting\InteractsWithBroadcasting;
use Illuminate\Queue\SerializesModels;

class OrderShipped implements ShouldBroadcast
{
    use SerializesModels;

    /**
     * The order that was shipped.
     *
     * @var \App\Models\Order
     */
    public $order;

    /**
     * Create a new event instance.
     *
     * @param  \App\Models\Order  $order
     * @return void
     */
    public function __construct(Order $order)
    {
        $this->order = $order;
        $this->broadcastVia('eventbridge');
    }

    /**
     * Get the topics that model events should broadcast on.
     *
     * @return array
     */
    public function broadcastOn()
    {
        return ['orders']; // This is the Event bus name
    }
}

广播数据

默认情况下,该包将发布默认的 Laravel 负载,该负载已在广播事件时使用。一旦发布,其 JSON 表示形式可能如下所示

{
    "order": {
        "id": 1,
        "name": "Some Goods",
        "total": 123456,
        "created_at": "2021-06-29T13:21:36.000000Z",
        "updated_at": "2021-06-29T13:21:36.000000Z"
    },
    "connection": null,
    "queue": null
}

使用 broadcastWith 方法,您将能够定义要发布的确切负载类型。

/**
 * Get and format the data to broadcast.
 *
 * @return array
 */
public function broadcastWith()
{
    return [
        'action' => 'parcel_handled',
        'data' => [
            'order-id' => $this->order->id,
            'order-total' => $this->order->total,
        ],
    ];
}

现在,当事件被触发时,它将表现得像一个标准的Laravel事件,这意味着其他监听器可以像往常一样监听它,但它还会通过使用broadcastWith方法定义的负载向由broadcastOn方法定义的主题广播。

广播名称/主题

在发布/订阅(Pub/Sub)上下文中,为每个通知指定一个要广播到SNS的Subject可能很有用。这可以是一个轻松配置监听器的方法,以便您可以在队列中接收和处理特定类型的主题。

默认情况下,该包将使用标准的Laravel广播名称来定义发送通知的Subject。您可以随意自定义它。

/**
 * The event's broadcast name/subject.
 *
 * @return string
 */
public function broadcastAs()
{
    return "orders.{$this->action}";
}

模型广播

如果您熟悉模型广播,您已经知道Eloquent模型在其生命周期中会触发多个事件并相应地广播它们。

在模型广播的上下文中,只有以下模型事件可以广播

  • created
  • updated
  • deleted
  • trashed 如果启用了软删除
  • restored 如果启用了软删除

为了广播模型事件,您需要在您的模型上使用Illuminate\Database\Eloquent\BroadcastsEvents特性,并遵循官方文档。

您可以在您的模型上使用broadcastOn()broadcastWith()broadcastAs()方法来自定义主题名称、负载和主题。

注意:模型广播仅在Laravel 8.x中可用。

致谢

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件