hobbii/laravel-pubsub

此包已被废弃,不再维护。未建议替代包。

使用 AWS SQS 和 SNS 的 Laravel Pub/Sub

dev-main 2022-06-24 11:54 UTC

This package is auto-updated.

Last update: 2024-03-24 15:38:55 UTC


README

Coverage Status Total Downloads Latest Version CI Workflow

一个公共 Composer 包,为 Laravel 添加使用 AWS SQSSNS 的 Pub/Sub 功能

composer require hobbii/laravel-pubsub

安装

更新 config/broadcasting.php,添加一个 pubsub 连接

<?php

return [
    ...
    'connections' => [
        ...
        'pubsub' => [
            'driver' => 'pubsub',
            'key' => env('AWS_SNS_KEY_ID'),
            'secret' => env('AWS_SNS_ACCESS_KEY'),
            'region' => env('AWS_SNS_REGION'),
            'suffix' => env('AWS_SNS_TOPIC_SUFFIX'),
            'prefix' => env('AWS_SNS_TOPIC_PREFIX'),
        ]
    ]
];

更新 config/queues.php,添加一个 pubsub 连接

<?php

return [
    ...
    'connections' => [
        ...
        'pubsub' => [
            'driver' => 'pubsub',
            'key' => env('AWS_ACCESS_KEY_ID'),
            'secret' => env('AWS_SECRET_ACCESS_KEY'),
            'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
            'queue' => env('SQS_QUEUE', 'default'),
            'suffix' => env('SQS_SUFFIX'),
            'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
            'after_commit' => false,
            'mapping' => [
            ],
            'delete_unmapped' => false,
        ],
    ]
];

用法

向 SNS 发布事件

要向 SNS 发布事件,必须创建一个 SnsEvent

<?php
namespace App\Events;

use Hobbii\PubSub\Events\AbstractSnsEvent;
use Illuminate\Support\Str;

class MyEvent extends AbstractSnsEvent
{
    // Required - this type is what the subscribers will map to a job
    public string $type = 'my_event';
    
    public function __construct()
    {
        // SNS Topic to broadcast the event on.
        parent::__construct('MyTopic');
        
        // Group ID is required for `FIFO`-topics
        $this->groupId = 'my-event';
        
        // Deduplication ID is required,
        // if your SNS Topic is not set up to
        // deduplicate messages based on content. 
        $this->deduplicationId = Str::uuid();
        
        // The payload/data/body of the message.
        $this->data = [
            'message' => 'My Event',
            'payload' => [
                'Whatever payload',
                'The subscribers should receive'
            ],
        ];
    }
}

然后,要广播事件,调用

broadcast(new MyEvent());

或者,如果你为你的事件添加了 Dispatchable 特性,你可以

MyEvent::dispatch();

从 SQS 订阅事件

创建一个继承自 Hobbii\PubSub\Jobs\AbstractSnsJob 的工作。创建的工作应该包含一个接受数组的 handle 方法,该数组将是已发布事件的负载。

<?php

namespace App\Jobs;

use Hobbii\PubSub\Jobs\AbstractSnsJob;

class MyJob extends AbstractSnsJob
{
    public function handle(array $data): void
    {
        // Handle the incoming payload data here.
    }
}

config/queue.php 中的 connections.pubsub.mapping 下,将事件类型映射到工作

    'pubsub' => [
        'driver' => 'pubsub',
        ...
        'mapping' => [
            'my_event' => \App\Jobs\MyJob::class,
        ],
    ]

通过以下方式启动队列工作者,以便在 sqs 上监听事件

php artisan queue:work pubsub

测试

你可以在 /tests 文件夹中找到测试,你可以通过使用 ./vendor/bin/phpunit 来运行它们。

静态分析

你可以通过执行 ./vendor/bin/phpstan analyse 来运行 PHPStan

贡献

请参阅 CONTRIBUTING.md 了解如何贡献

行为准则

Hobbii/Laravel-PubSub 采用了行为准则,我们希望项目参与者遵守。请阅读全文,以便了解哪些行为是可容忍的,哪些是不可容忍的。

许可

MIT