ratheeps/laravel-pub-sub-messaging

这是一个简单的 Laravel 服务提供者,它添加了一个新的队列连接器来处理 SNS 订阅队列。

1.0.4 2021-12-07 02:50 UTC

This package is auto-updated.

Last update: 2024-09-07 08:40:05 UTC


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)

安装

  1. 首先创建一个磁盘,用于存储所有大型的 SQS 负载。

我们强烈建议您在存储 SQS 负载时使用 私有 存储桶。负载可能包含敏感信息,不应公开共享。

  1. 运行 composer require ratheeps/laravel-pub-sub-messaging 来安装此包。

  2. 然后,将以下队列设置添加到您的 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),
        ],
    ],
];
  1. 您可以选择使用以下命令发布配置文件: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' => ''
        ]
    ]
];
  1. 您需要配置 .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=
  1. 启动您的队列并从中获利,无需担心 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'
     * ];
     */
}

图示

此图将描述您的微服务如何使用此包进行通信 Diagrams

参考资料

  • 注册 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拉取请求。