ratheeps / laravel-pub-sub-messaging
这是一个简单的 Laravel 服务提供者,它添加了一个新的队列连接器来处理 SNS 订阅队列。
1.0.4
2021-12-07 02:50 UTC
Requires
- php: >=7.0|>=8.0
- ext-json: *
- aws/aws-sdk-php: ^3.189.0
- illuminate/container: ^v7.0.0|^v8.0.0
- illuminate/contracts: ^v7.0.0|^v8.0.0
- illuminate/filesystem: ^v7.0.0|^v8.0.0
- illuminate/queue: ^v7.0.0|^v8.0.0
- illuminate/support: ^v7.0.0|^v8.0.0
- league/flysystem: ^1.1
README
Simple extension to the Illuminate/Queue queue system used in Laravel and Lumen.
使用此连接器可以使来自 SQS 的消息与 SNS 订阅一起使用 Illuminate\Queue\Jobs\SqsJob 处理。
这对于微服务架构特别有用,其中多个服务订阅一个常见主题并使用其队列向 SNS 发布事件。
Amazon SQS & SNS 扩展客户端库
Amazon SQS 扩展客户端库 for Laravel 允许您使用 Amazon S3 管理 Amazon SQS 消息负载。这对于存储和检索大于当前 SQS 256 KB 限制的消息(最高可达 2 GB)非常有用。具体来说,您可以使用此库
- 指定消息负载是否始终存储在 Amazon S3 中,或者只有当消息大小超过最大大小时(默认为 256 KB)。
- 发送引用存储在 Amazon S3 存储桶中的单个消息对象的邮件。
- 从 Amazon S3 存储桶中获取相应的消息对象。
- Note: This package under development not ready for production -
需求
- Laravel (已测试版本 >=7.0)
安装
- 首先创建一个磁盘,用于存储所有大型的 SQS 负载。
我们强烈建议您在存储 SQS 负载时使用 私有 存储桶。负载可能包含敏感信息,不应公开共享。
-
运行
composer require ratheeps/laravel-pub-sub-messaging
来安装此包。 -
然后,将以下队列设置添加到您的
queue.php
文件中。
<?php return [ 'connections' => [ 'pub-sub-messaging-sqs' => [ 'driver' => 'pub-sub-messaging-sqs', 'key' => env('PUB_SUB_MESSAGING_AWS_ACCESS_ID'), 'secret' => env('PUB_SUB_MESSAGING_AWS_SECRET_ACCESS_KEY'), 'prefix' => env('PUB_SUB_MESSAGING_SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'queue' => env('PUB_SUB_MESSAGING_SQS_QUEUE', 'default'), 'suffix' => env('PUB_SUB_MESSAGING_SQS_SUFFIX'), 'region' => env('PUB_SUB_MESSAGING_AWS_DEFAULT_REGION', 'us-east-1'), 'after_commit' => false, 'disk_options' => [ 'always_store' => true, 'cleanup' => false, 'disk' => env('PUB_SUB_MESSAGING_DISK', 'pub_sub_messaging_s3'), 'prefix' => '', ], ], ], ];
4 然后,将以下磁盘设置添加到您的 filesystems.php
文件中。
<?php return [ 'disks' => [ 'pub_sub_messaging_s3' => [ 'driver' => 's3', 'key' => env('PUB_SUB_MESSAGING_AWS_ACCESS_ID'), 'secret' => env('PUB_SUB_MESSAGING_AWS_SECRET_ACCESS_KEY'), 'region' => env('PUB_SUB_MESSAGING_AWS_DEFAULT_REGION'), 'bucket' => env('PUB_SUB_MESSAGING_AWS_BUCKET'), 'url' => env('PUB_SUB_MESSAGING_AWS_URL'), 'endpoint' => env('PUB_SUB_MESSAGING_AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), ], ], ];
- 您可以选择使用以下命令发布配置文件:
php artisan vendor:publish --provider="Ratheeps\PubSubMessaging\PubSubMessagingServiceProvider" --tag="config"
然后,修改以下 pub sub 设置到您的pub-sub-messaging.php
文件中。
<?php return [ 'default_topic' => env('PUB_SUB_MESSAGING_DEFAULT_TOPIC'), 'default_auth_driver' => null, // map the jobs to subscribe SNS topics to handle the consuming events 'map' => [ // \App\Jobs\TestSQSJob::class => 'arn:aws:sns:ap-southeast-1:931616835216:modelEvent', ], 'published_attributes' => [ 'id', 'created_at', 'updated_at' ], 'sns' => [ 'key' => env('PUB_SUB_MESSAGING_AWS_ACCESS_KEY'), 'secret' => env('PUB_SUB_MESSAGING_AWS_SECRET_ACCESS_KEY'), 'region' => env('PUB_SUB_MESSAGING_AWS_DEFAULT_REGION', 'us-east-1'), 'disk_options' => [ // Indicates when to send messages to S3., Allowed values are: ALWAYS, NEVER, IF_NEEDED. 'store_payload' => 'IF_NEEDED', 'disk' => env('PUB_SUB_MESSAGING_DISK', 'pub_sub_messaging_s3'), 'prefix' => '' ] ] ];
- 您需要配置 .env 文件
PUB_SUB_MESSAGING_AWS_ACCESS_ID= PUB_SUB_MESSAGING_AWS_SECRET_ACCESS_KEY= PUB_SUB_MESSAGING_AWS_DEFAULT_REGION=ap-south-1 PUB_SUB_MESSAGING_DEFAULT_TOPIC= PUB_SUB_MESSAGING_AWS_BUCKET= PUB_SUB_MESSAGING_DISK=pub_sub_messaging_s3 QUEUE_CONNECTION=pub-sub-messaging-sqs PUB_SUB_MESSAGING_SQS_QUEUE=
- 启动您的队列并从中获利,无需担心 SQS 的 256KB 限制 :)
消费事件
创建一个如下所示的作业来处理事件,然后将其映射到 pub-sub-messaging.php
配置文件中的 SNS 主题。
<?php use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Support\Facades\Log; class TestSQSJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $passedInData; /** * Create a new job instance. * * @param array $data */ public function __construct(array $data) { // $data is array containing the msg content from SQS $this->passedInData = $data; } /** * Execute the job. * * @return void */ public function handle() { Log::info(json_encode($this->passedInData)); // Check laravel.log, it should now contain msg string. } }
发布事件
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Ratheeps\PubSubMessaging\Traits\SNSPublisher; class Post extends Model { use SNSPublisher; /** * @var array * Optional (default value is [] ) * Witch are the attributes should only from SNS message */ static $publishedAttributes = [ 'id', 'created_at', 'updated_at' ]; /** * @var array * Optional (default value is [created','updated','deleted','restored'] ) * Witch events should send to SNS */ static $publishEvents = ['created', 'updated']; /** * @var string * Optional (default value is load from config ) * Publish SNS topic */ static $publishTopic = 'SampleTopic'; /** * Or * static $publishTopic = [ * 'created' => 'SampleTopic' * ]; */ }
图示
参考资料
- 注册 AWS 账户 -- 在开始之前,您需要一个 AWS 账户。有关创建 AWS 账户和获取 AWS 凭据的更多信息,请参阅 AWS SDK for PHP 开发者指南中的 AWS 账户和凭据。
- 注册 Amazon SQS -- 访问 Amazon SQS 控制台 以注册该服务。
- 最低要求 -- 使用示例应用程序,您需要PHP 7.0+ 和 Composer。有关要求的更多信息,请参阅亚马逊SQS开发者指南中的 入门 部分。
- 更多信息 - 阅读有关 API文档 和 SQS & S3建议。
- SNS大消息负载 - 阅读有关 AWS Java SDK文档
- SQS大消息负载 - 阅读有关 AWS Java SDK文档
- 发布/订阅消息 - 阅读有关 文档
反馈
- 在此 处 给我们反馈。
- 如果您想贡献新的功能或修复错误,我们非常希望看到您的Github拉取请求。