ervinomueller / laravel-sqs-sns-subscription-queue
A simple Laravel service provider which adds a new queue connector to handle SNS subscription queues.
Requires
- php: >=7.1.3
- ext-json: *
- aws/aws-sdk-php: ^3.62
- illuminate/queue: ^5.6|^6.0|^7.0|^8.0
- illuminate/support: ^5.6|^6.0|^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ~3.8|^4.0|^5.0|^6.0
- phpunit/phpunit: ^8
- squizlabs/php_codesniffer: ^3
This package is auto-updated.
Last update: 2024-11-07 01:44:06 UTC
README
A simple extension to the Illuminate/Queue queue system used in Laravel and Lumen.
Using this connector allows SQS messages originating from a SNS subscription to be worked on with Illuminate\Queue\Jobs\SqsJob.
This is especially useful in a miroservice architecture where multiple services subscribe to a common topic with their queues.
Understand that this package will not handle publishing to SNS, please use the AWS SDK to publish an event to SNS.
Requirements
- Laravel (tested with version 5.8)
- or Lumen (tested with version 5.8)
Installation
The best way to install laravel-sqs-sns-subscription is by using Composer.
To install the most recent version:
php composer.phar require ervinomueller/laravel-sqs-sns-subscription-queue
Usage
Add the LaravelSqsSnsSubscriptionQueue ServiceProvider to your application.
Laravel
Registering Service Providers in Laravel
'providers' => [ // ... Joblocal\LaravelSqsSnsSubscriptionQueue\SqsSnsServiceProvider::class, ],
Lumen
Registering Service Providers in Lumen
$app->register(Joblocal\LaravelSqsSnsSubscriptionQueue\SqsSnsServiceProvider::class);
Configuration
You'll need to configure the queue connection in your config/queue.php
'connections' => [ 'sqs-sns' => [ 'driver' => 'sqs-sns', 'key' => env('AWS_ACCESS_KEY', 'your-public-key'), 'secret' => env('AWS_SECRET_ACCESS_KEY', 'your-secret-key'), 'queue' => env('QUEUE_URL', 'your-queue-url'), 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 'routes' => [ // you can use the "Subject" field 'Subject' => 'App\\Jobs\\YourJob', // or the "TopicArn" of your SQS message 'TopicArn:123' => 'App\\Jobs\\YourJob', // to specify which job class should handle the job ], //optional - you can override default job when no job are found on routes array above 'default-job' => 'App\\Jobs\\YourDefaultJob', ], ],
Once the sqs-sns queue connector is configured you can start using it by setting queue driver to 'sqs-sns' in your .env file.
Job class example
use Illuminate\Bus\Queueable; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; /** * Example Job class */ class Job implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; /** * @param string $subject SNS Subject * @param array $payload JSON decoded 'Message' */ public function __construct(string $subject, array $payload) { } }
Message transformation
When SNS publishes to SQS queues the received message signature is as follows:
{ "Type" : "Notification", "MessageId" : "63a3f6b6-d533-4a47-aef9-fcf5cf758c76", "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic", "Subject" : "Testing publish to subscribed queues", "Message" : "Hello world!", "Timestamp" : "2017-03-29T05:12:16.901Z", "SignatureVersion" : "1", "Signature" : "...", "SigningCertURL" : "...", "UnsubscribeURL" : "..." }
Illuminate\Queue\Jobs\SqsJob requires the following signature:
{ "job": "Illuminate\\Queue\\CallQueuedHandler@call", "data": { "commandName": "App\\Jobs\\YourJob", "command": "...", } }