shiftonelabs/laravel-sqs-fifo-queue
Installation:
composer require shiftonelabs/laravel-sqs-fifo-queue
Configure SQS FIFO Queue:
Add the driver to your .env:
QUEUE_CONNECTION=fifo_sqs
Configure SQS credentials and FIFO queue URL in config/queue.php:
'connections' => [
'fifo_sqs' => [
'driver' => 'fifo_sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_QUEUE_PREFIX', 'https://sqs.region.amazonaws.com/'),
'queue' => env('SQS_FIFO_QUEUE_URL', 'your-fifo-queue-url.fifo'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'options' => [
'FifoQueue' => true,
'MessageGroupId' => env('SQS_MESSAGE_GROUP_ID', 'default-group'),
],
],
],
First Use Case: Dispatch a job with a FIFO queue:
use App\Jobs\ProcessOrder;
ProcessOrder::dispatch($orderId)->onConnection('fifo_sqs');
Job Dispatching with Message Grouping:
MessageGroupId to control ordering and deduplication:
ProcessOrder::dispatch($orderId)
->onConnection('fifo_sqs')
->withGroupId('order-group-' . $orderId); // Custom group ID
Handling FIFO-Specific Features:
DeduplicationId in job payload or via withDeduplicationId():
ProcessOrder::dispatch($orderId)->withDeduplicationId($orderId);
config/queue.php:
'fifo_sqs' => [
'options' => [
'VisibilityTimeout' => 300, // 5 minutes
],
],
Batch Processing:
SendMessageBatch for bulk operations:
$batch = new \Aws\Sqs\Message\SendMessageBatch();
$batch->setMessages([
new \Aws\Sqs\Message\SendMessage([
'Id' => '1',
'MessageBody' => json_encode(['job' => 'ProcessOrder', 'data' => $orderId]),
'MessageGroupId' => 'batch-group',
'MessageDeduplicationId' => $orderId,
]),
]);
$sqs->sendMessageBatch($batch);
Queue Listeners:
queue:listen:
php artisan queue:listen fifo_sqs --sleep=3 --tries=3
php artisan queue:listen fifo_sqs.aws/aws-sdk-php version is compatible (tested with ^3.0).env() for dynamic queue URLs/regions in config/queue.php.ApproximateNumberOfMessagesVisible).Message Group ID Collisions:
MessageGroupId per logical sequence. Reusing IDs may cause out-of-order processing.user-{id}-group).Deduplication Scope:
MessageDeduplicationId must be unique within the group ID for 5 minutes. Reusing IDs prematurely will silently drop messages.Batch Limitations:
Visibility Timeout:
VisibilityTimeout (30 seconds), causing premature retries.release() to extend visibility manually.Laravel Job Serialization:
database queue for heavy payloads.SQS_FIFO_QUEUE_URL in .env matches your AWS console URL (must end with .fifo).aws sqs get-queue-url --queue-name your-queue.fifo --region us-east-1
'options' => [
'debug' => true,
'logger' => new \Monolog\Logger('sqs'),
],
Custom Job Payloads:
Override toSqsArray() in your job to include FIFO-specific metadata:
public function toSqsArray()
{
return array_merge(parent::toSqsArray(), [
'MessageGroupId' => 'custom-group',
'MessageDeduplicationId' => $this->deduplicationId,
]);
}
Middleware for FIFO:
Add queue-specific middleware in App\Providers\QueueServiceProvider:
public function boot()
{
Queue::before(function (JobProcessing $event) {
if ($event->connectionName === 'fifo_sqs') {
// Add FIFO-specific logic (e.g., group ID validation)
}
});
}
Fallback to Standard SQS: Dynamically switch drivers based on conditions:
$queueConnection = config('app.env') === 'production' ? 'fifo_sqs' : 'sync';
ProcessOrder::dispatch()->onConnection($queueConnection);
Dead-Letter Queues (DLQ):
Configure DLQ in config/queue.php:
'fifo_sqs' => [
'options' => [
'QueueOwnerAWSAccountId' => env('AWS_ACCOUNT_ID'),
'RedrivePolicy' => json_encode([
'deadLetterTargetArn' => env('SQS_DLQ_ARN'),
'maxReceiveCount' => 3,
]),
],
],
How can I help you explore Laravel packages today?