composer require enqueue/snsqs
~/.aws/credentials, environment variables, or Laravel's .env):
AWS_ACCESS_KEY_ID=your_key
AWS_SECRET_ACCESS_KEY=your_secret
AWS_REGION=us-east-1
config/queue.php):
'connections' => [
'snsqs' => [
'driver' => 'snsqs',
'queue' => env('SQS_QUEUE_URL', 'https://sqs.us-east-1.amazonaws.com/1234567890/my-queue'),
'region' => env('AWS_REGION', 'us-east-1'),
'options' => [
'visibilityTimeout' => 60, // seconds
],
],
],
use Illuminate\Support\Facades\Queue;
Queue::connection('snsqs')->push(new MyJob);
php artisan queue:work snsqs --queue=my-queue
Use snsqs for decoupling long-running tasks (e.g., image processing, notifications) or scaling background jobs in a serverless environment. Example:
// Dispatch a delayed job
Queue::connection('snsqs')->later(now()->addMinutes(5), new SendEmailJob($user));
Job Dispatching
Queue::connection('snsqs')->push() for synchronous-like behavior.later() for delayed execution (SQS supports up to 15-minute delays).Message Consumption
snsqs connection:
php artisan queue:work snsqs --queue=high-priority
Error Handling
config/queue.php under max_attempts).Queue::failed() to inspect failed jobs and reprocess manually:
$failed = Queue::connection('snsqs')->failed();
foreach ($failed as $job) {
$job->release(); // Requeue
}
Integration with AWS SNS
use Aws\Sns\SnsClient;
$sns = new SnsClient([...]);
$sns->publish([
'TopicArn' => 'arn:aws:sns:us-east-1:1234567890:my-topic',
'Message' => json_encode(['job' => 'SendEmailJob']),
]);
HandleJobsMiddleware in app/Http/Kernel.php.job.processing, job.failed, etc., for observability:
event(new JobProcessing($job));
Queue::connection('snsqs')->on('dynamic-queue-'.$userId)->push($job).Visibility Timeout
visibilityTimeout (default: 30s).visibilityTimeout in the connection config for long-running jobs (max: 12 hours).Message Size Limits
Region Mismatch
'queue' => 'https://sqs.us-west-2.amazonaws.com/1234567890/my-queue', // Must match region
'region' => 'us-west-2',
IAM Permissions
sqs:SendMessage, sqs:ReceiveMessage, sqs:DeleteMessage, sqs:GetQueueAttributes.sns:Publish.Dead-Letter Queues (DLQ)
redrivePolicy to the queue URL:
'queue' => 'https://sqs.us-east-1.amazonaws.com/1234567890/my-queue?AttributeName=RedrivePolicy&AttributeValue=...',
ApproximateNumberOfMessagesVisible and NumberOfMessagesSent.handle() method:
\Log::debug('SQS Message:', ['body' => $this->data]);
docker run -it -p 4566:4566 localstack/localstack
Custom Serialization
QueueInterop\Transport\Serialization\SerializerInterface:
$container->bind(SerializerInterface::class, function () {
return new CustomSerializer();
});
Message Attributes
MessageAttributes:
Queue::connection('snsqs')->push(new MyJob, 'default', [
'Priority' => 10,
]);
Batch Consumption
$context = new Context();
$messages = $transport->receive($context, 5); // Receive 5 messages
Custom Context
QueueInterop\Transport\Context class to add request-specific data (e.g., correlation IDs):
$context = new class extends Context {
public $correlationId = '123';
};
How can I help you explore Laravel packages today?