PHPackages                             axl-media/laravel-sqs-fifo-queue - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Queues &amp; Workers](/categories/queues)
4. /
5. axl-media/laravel-sqs-fifo-queue

ActiveLibrary[Queues &amp; Workers](/categories/queues)

axl-media/laravel-sqs-fifo-queue
================================

Adds a Laravel queue driver for Amazon SQS FIFO queues. Based on shiftonelabs/laravel-sqs-fifo-queue

1.2.0(6y ago)06[1 PRs](https://github.com/axl-media/laravel-sqs-fifo-queue/pulls)MITPHPPHP &gt;=5.5.0

Since Feb 13Pushed 6y agoCompare

[ Source](https://github.com/axl-media/laravel-sqs-fifo-queue)[ Packagist](https://packagist.org/packages/axl-media/laravel-sqs-fifo-queue)[ Docs](https://github.com/axl-media/laravel-sqs-fifo-queue)[ RSS](/packages/axl-media-laravel-sqs-fifo-queue/feed)WikiDiscussions master Synced yesterday

READMEChangelog (1)Dependencies (9)Versions (7)Used By (0)

laravel-sqs-fifo-queue
======================

[](#laravel-sqs-fifo-queue)

[![Latest Version on Packagist](https://camo.githubusercontent.com/fb824d91a58df243c1974584ede1809b84be4fe8aad11268a91cf6b9b672727e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f61786c2d6d656469612f6c61726176656c2d7371732d6669666f2d71756575652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/axl-media/laravel-sqs-fifo-queue)[![Software License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](LICENSE.txt)[![Build Status](https://camo.githubusercontent.com/b858a8699efb64873e86af21ffe384217eabdc71820d1e76fbd7306de45662fb/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f61786c2d6d656469612f6c61726176656c2d7371732d6669666f2d71756575652f6d61737465722e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/axl-media/laravel-sqs-fifo-queue)[![Coverage Status](https://camo.githubusercontent.com/2d312e9218d54028ff105d4c5e4410ec48efd2b184ac36dd2d365d458555518b/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f636f7665726167652f672f61786c2d6d656469612f6c61726176656c2d7371732d6669666f2d71756575652e7376673f7374796c653d666c61742d737175617265)](https://scrutinizer-ci.com/g/axl-media/laravel-sqs-fifo-queue/code-structure)[![Quality Score](https://camo.githubusercontent.com/148bd90eab3b2248e3c36660d2195d5466583f8120463c26de8ca69b8aa832de/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f61786c2d6d656469612f6c61726176656c2d7371732d6669666f2d71756575652e7376673f7374796c653d666c61742d737175617265)](https://scrutinizer-ci.com/g/axl-media/laravel-sqs-fifo-queue)[![Total Downloads](https://camo.githubusercontent.com/25d16e3d78cf98040c3dc58986204f987fed24f482fabd347ef492e275eb20f9/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f61786c2d6d656469612f6c61726176656c2d7371732d6669666f2d71756575652e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/axl-media/laravel-sqs-fifo-queue)

This Laravel/Lumen package provides a queue driver for Amazon's SQS FIFO queues. While Laravel works with Amazon's SQS standard queues out of the box, FIFO queues are slightly different and are not handled properly by Laravel. That is where this package comes in.

Versions
--------

[](#versions)

This package has been tested on Laravel 4.1 through Laravel 5.6, though it may continue to work on later versions as they are released. This section will be updated to reflect the versions on which the package has actually been tested.

Install
-------

[](#install)

Via Composer

```
$ composer require axl-media/laravel-sqs-fifo-queue
```

Once composer has been updated and the package has been installed, the service provider will need to be loaded.

#### Laravel 5.5+ (5.5, 5.6)

[](#laravel-55-55-56)

This package uses auto package discovery. The service provider will automatically be registered.

#### Laravel 5.0 - 5.4

[](#laravel-50---54)

Open `config/app.php` and add following line to the providers array:

```
AXLMedia\LaravelSqsFifoQueue\LaravelSqsFifoQueueServiceProvider::class,
```

#### Laravel 4 (4.1, 4.2)

[](#laravel-4-41-42)

Open `app/config/app.php` and add following line to the providers array:

```
'AXLMedia\LaravelSqsFifoQueue\LaravelSqsFifoQueueServiceProvider',
```

#### Lumen 5 (5.0, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6)

[](#lumen-5-50-51-52-53-54-55-56)

Open `bootstrap/app.php` and add following line under the "Register Service Providers" section:

```
$app->register(AXLMedia\LaravelSqsFifoQueue\LaravelSqsFifoQueueServiceProvider::class);
```

Configuration
-------------

[](#configuration)

#### Laravel/Lumen 5.1+ (5.1, 5.2, 5.3, 5.4, 5.5, 5.6)

[](#laravellumen-51-51-52-53-54-55-56)

If using Lumen, create a `config` directory in your project root if you don't already have one. Next, copy `vendor/laravel/lumen-framework/config/queue.php` to `config/queue.php`.

Now, for both Laravel and Lumen, open `config/queue.php` and add the following entry to the `connections` array.

```
'sqs-fifo' => [
    'driver' => 'sqs-fifo',
    'key' => env('SQS_KEY'),
    'secret' => env('SQS_SECRET'),
    'prefix' => env('SQS_PREFIX'),
    'queue' => 'your-queue-name',    // ex: queuename.fifo
    'region' => 'your-queue-region', // ex: us-east-2
    'group' => 'default',
    'deduplicator' => 'unique',
],

```

Example .env file:

```
SQS_KEY=ABCDEFGHIJKLMNOPQRST
SQS_SECRET=1a23bc/deFgHijKl4mNOp5qrS6TUVwXyz7ABCDef
SQS_PREFIX=https://sqs.us-east-2.amazonaws.com/123456789012

```

If you'd like this to be the default connection, also set `QUEUE_DRIVER=sqs-fifo` in the `.env` file.

#### Laravel/Lumen 5.0

[](#laravellumen-50)

If using Lumen, create a `config` directory in your project root if you don't already have one. Next, copy `vendor/laravel/lumen-framework/config/queue.php` to `config/queue.php`.

Now, for both Laravel and Lumen, open `config/queue.php` and add the following entry to the `connections` array:

```
'sqs-fifo' => [
    'driver' => 'sqs-fifo',
    'key'    => env('SQS_KEY'),
    'secret' => env('SQS_SECRET'),
    'queue'  => env('SQS_PREFIX').'/your-queue-name',
    'region' => 'your-queue-region',
    'group' => 'default',
    'deduplicator' => 'unique',
],

```

Example .env file:

```
SQS_KEY=ABCDEFGHIJKLMNOPQRST
SQS_SECRET=1a23bc/deFgHijKl4mNOp5qrS6TUVwXyz7ABCDef
SQS_PREFIX=https://sqs.us-east-2.amazonaws.com/123456789012

```

If you'd like this to be the default connection, also set `QUEUE_DRIVER=sqs-fifo` in the `.env` file.

#### Laravel 4

[](#laravel-4)

Open `app/config/queue.php` and add the following entry to the `connections` array:

```
'sqs-fifo' => array(
    'driver' => 'sqs-fifo',
    'key'    => 'your-public-key',   // ex: ABCDEFGHIJKLMNOPQRST
    'secret' => 'your-secret-key',   // ex: 1a23bc/deFgHijKl4mNOp5qrS6TUVwXyz7ABCDef
    'queue'  => 'your-queue-url',    // ex: https://sqs.us-east-2.amazonaws.com/123456789012/queuename.fifo
    'region' => 'your-queue-region', // ex: us-east-2
    'group' => 'default',
    'deduplicator' => 'unique',
),

```

If you'd like this to be the default connection, also update the `'default'` key to `'sqs-fifo'`.

#### Capsule

[](#capsule)

If using the `illuminate\queue` component Capsule outside of Lumen/Laravel:

```
use Illuminate\Queue\Capsule\Manager as Queue;
use AXLMedia\LaravelSqsFifoQueue\LaravelSqsFifoQueueServiceProvider;

$queue = new Queue;

$queue->addConnection([
    'driver' => 'sqs-fifo',
    'key'    => 'your-public-key',   // ex: ABCDEFGHIJKLMNOPQRST
    'secret' => 'your-secret-key',   // ex: 1a23bc/deFgHijKl4mNOp5qrS6TUVwXyz7ABCDef
    /**
     * Set "prefix" and/or "queue" depending on version, as described for Laravel versions above
     * 'prefix' => 'your-prefix',
     * 'queue' => 'your-queue-name',
     */
    'region' => 'your-queue-region', // ex: us-east-2
    'group' => 'default',
    'deduplicator' => 'unique',
], 'sqs-fifo');

// Make this Capsule instance available globally via static methods... (optional)
$queue->setAsGlobal();

// Register the 'queue' alias in the Container, then register the SQS FIFO provider.
$app = $queue->getContainer();
$app->instance('queue', $queue->getQueueManager());
(new LaravelSqsFifoQueueServiceProvider($app))->register();
```

#### Credentials

[](#credentials)

The `key` and `secret` config options may be omitted if using one of the alternative options for providing AWS credentials (e.g. using an AWS credentials file). More informataion about this is available in the [AWS PHP SDK guide here](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html).

Usage
-----

[](#usage)

For the most part, usage of this queue driver is the same as the built in queue drivers. There are, however, a few extra things to consider when working with Amazon's SQS FIFO queues.

#### Message Groups

[](#message-groups)

In addition to being able to have multiple queue names for each connection, an SQS FIFO queue also allows one to have multiple "message groups" for each FIFO queue. These message groups are used to group related jobs together, and jobs are processed in FIFO order per group. This is important, as your queue performance may depend on being able to assign message groups properly. If you have 100 jobs in the queue, and they all belong to one message group, then only one queue worker will be able to process the jobs at a time. If, however, they can logically be split across 5 message groups, then you could have 5 queue workers processing the jobs from the queues (one per group). The FIFO ordering is per message group.

Currently, by default, all queued jobs will be lumped into one group, as defined in the configuration file. In the configuration provided above, all queued jobs would be sent as part of the `default` group. The group can be changed per job using the `onMessageGroup()` method, which will be explained more below.

The group id must not be empty, must not be more than 128 characters, and can contain alphanumeric characters and punctuation (`!"#$%&'()*+,-./:;?@[\]^_`{|}~`).

In a future release, the message group will be able to be assigned to a function, like the deduplicator below.

#### Deduplication

[](#deduplication)

When sending jobs to the SQS FIFO queue, Amazon requires a way to determine if the job is a duplicate of a job already in the queue. SQS FIFO queues have a 5 minute deduplication interval, meaning that if a duplicate message is sent within the interval, it will be accepted successfully (no errors), but it will not be delivered or processed.

Determining duplicate messages is generally handled in one of two ways: either all messages are considered unique regardless of content, or messages are considered duplicates if they have the same content.

This package handles deduplication via the `deduplicator` configuration option.

To have all messages considered unique, set the `deduplicator` to `unique`.

To have messages with the same content considered duplicates, there are two options, depending on how the FIFO queue has been configured. If the FIFO queue has been setup in Amazon with the `Content-Based Deduplication` feature enabled, then the `deduplicator` should be set to `sqs`. This tells the connection to rely on Amazon to determine content uniqueness. However, if the `Content-Based Deduplication` feature is disabled, the `deduplicator` should be set to `content`. Note, if `Content-Based Deduplication` is disabled, and the `deduplicator` is set to `sqs`, this will generate an error when attempting to send a job to the queue.

To summarize:

- `sqs` - This is used when messages with the same content should be considered duplicates and `Content-Based Deduplication` is enabled on the SQS FIFO queue.
- `content` - This is used when messages with the same content should be considered duplicates but `Content-Based Deduplication` is disabled on the SQS FIFO queue.
- `unique` - This is used when all messages should be considered unique, regardless of content.

If there is a need for a different deduplication algorithm, custom deduplication methods can be registered in the container.

Finally, by default, all queued jobs will use the deduplicator defined in the configuration file. This can be changed per job using the `withDeduplicator()` method.

#### Delayed Jobs

[](#delayed-jobs)

SQS FIFO queues do not support per-message delays, only per-queue delays. The desired delay is defined on the queue itself when the queue is setup in the Amazon Console. Attempting to set a delay on a job sent to a FIFO queue will have no affect. To this end, using the `later()` method to push a job to an SQS FIFO queue will generate a `BadMethodCallException`.

To delay a job, you must `push()` the job to an SQS FIFO queue that has been defined with a delivery delay.

Advanced Usage
--------------

[](#advanced-usage)

#### Per-Job Group and Deduplicator

[](#per-job-group-and-deduplicator)

If you need to change the group or the deduplicator for a specific job, you will need access to the `onMessageGroup()` and `withDeduplicator()` methods. These methods are provided through the `AXLMedia\LaravelSqsFifoQueue\Bus\SqsFifoQueueable` trait. Once you add this trait to your job class, you can change the group and/or the deduplicator for that specific job without affecting any other jobs on the queue.

#### Code Example

[](#code-example)

Job:

```
