mvjacobs/laravel-sns-sqs-sub-pub

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

dev-master 2021-01-05 14:06 UTC

This package is auto-updated.

Last update: 2024-09-05 22:30:06 UTC


README

是 Laravel 和 Lumen 中使用的 Illuminate/Queue 队列系统的简单扩展。

使用此连接器可以使来自 SQS 的消息,这些消息来自 SNS 订阅,可以使用 Illuminate\Queue\Jobs\SqsJob 进行处理。

这在微服务架构中特别有用,其中多个服务订阅了共同的议题并使用其队列向 SNS 发布事件。

需求

  • Laravel(已测试 5.8 版本)
  • 或 Lumen(已测试 5.8 版本)

安装

您可以通过 composer 安装此包

composer require jeylabs/laravel-sns-sqs-sub-pub 

您可以选择使用以下命令发布配置文件

php artisan vendor:publish --provider="Mvjacobs\SnsSqsPubSub\SnsSqsPubSubServiceProvider" --tag="config"

这是已发布配置文件的内容

<?php
return [
    'default_topic' => 'SampleTopic',
    'default_auth_driver' => null,
    'map' => [
        \App\Jobs\TestSQSJob::class => 'SampleTopic',
    ],
    'published_attributes' => [
        'id',
        'created_at',
        'updated_at'
    ],
    'sns' => [
        'key' => env('SNS_SQS_PUB_SUB_AWS_ACCESS_KEY'),
        'secret' => env('SNS_SQS_PUB_SUB_AWS_SECRET_ACCESS_KEY'),
        'region' => env('SNS_SQS_PUB_SUB_AWS_DEFAULT_REGION', 'us-east-1'),
    ]
];

配置

您需要配置 config/queue.php 中的队列连接

<?php
return [
    'connections' => [
      'sns-sqs-sub-pub' => [
          'driver' => 'sns-sqs-sub-pub',
          'key' => env('SNS_SQS_PUB_SUB_AWS_ACCESS_KEY'),
          'secret' => env('SNS_SQS_PUB_SUB_AWS_SECRET_ACCESS_KEY'),
          'prefix' => env('SNS_SQS_PUB_SUB_SQS_PREFIX', 'https://sqs.ap-southeast-1.amazonaws.com/your-account-id'),
          'queue' => env('SNS_SQS_PUB_SUB_QUEUE_URL', 'your-queue-name'),
          'region' => env('SNS_SQS_PUB_SUB_AWS_DEFAULT_REGION', 'us-east-1'),
      ],
    ],
];

一旦配置了 sns-sqs-sub-pub 队列连接器,您就可以通过在 .env 文件中将队列驱动设置为 'sns-sqs-sub-pub' 来开始使用它。

作业类示例

<?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 Mvjacobs\SnsSqsPubSub\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'
     * ];
     */
}

您需要配置 .env 文件

SNS_SQS_PUB_SUB_AWS_SNS_DEFAULT_TOPIC=sampletopic
SNS_SQS_PUB_SUB_AWS_ACCESS_KEY=
SNS_SQS_PUB_SUB_AWS_SECRET_ACCESS_KEY=
SNS_SQS_PUB_SUB_AWS_DEFAULT_REGION=ap-southeast-1
SNS_SQS_PUB_SUB_SQS_PREFIX=https://sqs.ap-southeast-1.amazonaws.com/your-account-id
SNS_SQS_PUB_SUB_QUEUE_URL=https://sqs.ap-southeast-1.amazonaws.com/your-account-id/your-queue-name