Developed with love by KnpLabs Hire us for your project!
34

sqs-queue-bundle

by trandangtri

Simple SQS Queue Bundle for Symfony

Simple AWS SQS Queue for Symfony

This bundle provides an easy way to work with AWS SQS

SensioLabsInsight
Latest Stable Version
Latest Unstable Version
Build Status
codecov

Installation

Follow 5 quick steps to setup this bundle.

Step 1: Download the Bundle

Open a command console, enter your project directory and execute the following
command to download the latest stable version of this bundle:

$ composer require tritran/sqs-queue-bundle

This command requires you to have Composer installed globally

Step 2: Enable the Bundle

Register bundles in app/AppKernel.php:

class AppKernel extends Kernel
{
    public function registerBundles()
    {
        return [
            // ...
            new \Aws\Symfony\AwsBundle(),
            new \TriTran\SqsQueueBundle\TriTranSqsQueueBundle(),
        ];
    }

    // ...
}

In a default Symfony application that uses Symfony Flex, bundles are enabled/disabled automatically for you when installing/removing them, so you could ignore this step.

Step 3: Update AWS SQS Credential

This bundle is using AWS SDK for PHP. Full documentation of the configuration options available can be read in the SDK Guide.

Below are sample configuration for AWS Credential in YAML format

# app/config/config.yml

aws:
    version: latest
    region: us-central-1
    credentials:
        key: not-a-real-key
        secret: "@not-a-real-secret"

Step 4: Configure the Queues

Below are sample configuration for some queues in YAML format

# app/config/config.yml

tritran_sqs_queue:
    sqs_queue:
        queues:
            emailpool:
                queue_url: 'https://sqs.eu-central-1.amazonaws.com/49504XX59872/emailpool'
                worker: "@acl.service.emailpool"
                attributes:
                    receive_message_wait_time_seconds: 20
                    visibility_timeout: 30
            reminder:
                queue_url: 'https://sqs.eu-central-1.amazonaws.com/49504XX59872/reminder'
                worker: 'AclBundle\Service\Worker\ReminderWorker'

Full documentation of the queue options available can be read in the Queue Attributes.

Now, you could access to queue emailpool or reminder service via tritran.sqs_queue.emailpool or tritran.sqs_queue.reminder, it's an interface of BaseQueue

Below are a sample implementation of sending a message to a specified queue

namespace AclBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use TriTran\SqsQueueBundle\Service\Message;

/**
 * Class DefaultController
 *
 * @package AclBundle\Controller
 */
class DefaultController extends Controller
{
    public function indexAction()
    {
        // ...

        $data = [
            'from' => 'sender@domain.com',
            'to' => 'receiver@domain.com',
            'subject' => 'Greeting Message',
            'body' => 'Congratulation! You have just received a message which was sent from AWS SQS Queue'
        ];
        $this->get('tritran.sqs_queue.emailpool')
            ->sendMessage((new Message())->setBody(serialize($data)));

        // ...
    }
}

For a FIFO queue, you must associate a non-empty MessageGroupId with a message. Otherwise, the action fails.
You may provide a MessageDeduplicationId explicitly. If you aren't able to provide a MessageDeduplicationId and you enable ContentBasedDeduplication for your queue, Amazon SQS uses a SHA-256 hash to generate the MessageDeduplicationId using the body of the message (but not the attributes of the message).
For more information about FIFO queue, please take a look at Amazon SQS FIFO (First-In-First-Out) Queues

Queue Behaviours

Behaviour Arguments Description
sendMessage Message $messageint $delay = 0 Delivers a message to the specified queue.
receiveMessage int $limit = 1 Retrieves one or more messages (up to 10), from the specified queue. Using the WaitTimeSeconds parameter enables long-poll support. For more information, see Amazon SQS Long Polling in the Amazon SQS Developer Guide.
deleteMessage string $receiptHandle Deletes the specified message from the specified queue. You specify the message by using the message's receipt handle and not the MessageId you receive when you send the message. Even if the message is locked by another reader due to the visibility timeout setting, it is still deleted from the queue. If you leave a message in the queue for longer than the queue's configured retention period, Amazon SQS automatically deletes the message.
purge Deletes the messages in a queue specified by the QueueURL parameter. Note: you can't retrieve a message deleted from a queue.

Queue Manager Behaviours

You could access QueueManager via service tritran.sqs_queue.queue_manager

Behaviour Arguments Description
listQueue string $prefix = '' Returns a list of your queues. The maximum number of queues that can be returned is 1,000. If you specify a value for the optional prefix parameter, only queues with a name that begins with the specified value are returned.
createQueue string $queueNamearray $queueAttribute Creates a new standard or FIFO queue. You can pass one or more attributes in the request.
deleteQueue string $queueUrl Deletes the queue specified by the QueueUrl, regardless of the queue's contents. If the specified queue doesn't exist, Amazon SQS returns a successful response.
setQueueAttributes string $queueUrlarray $queueAttribute Sets the value of one or more queue attributes. When you change a queue's attributes, the change can take up to 60 seconds for most of the attributes to propagate throughout the Amazon SQS system
getQueueAttributes string $queueUrl Gets attributes for the specified queue.

Step 5: Setup a worker

Below are a sample implementation of a worker, which will listen to a queue to handle the messages inside.

namespace AclBundle\Service\Worker;

use TriTran\SqsQueueBundle\Service\Message;
use TriTran\SqsQueueBundle\Service\Worker\AbstractWorker;

class ReminderWorker extends AbstractWorker
{
    /**
     * @param Message $message
     *
     * @return boolean
     */
    protected function execute(Message $message)
    {
        echo 'The message is: ' . $message->getBody();

        return true;
    }
}

And then you could make it executed as daemon in console via:

bin/console tritran:sqs_queue:worker reminder

Note: reminder is the name of queue which you configured in the config.yml in step 4.

Appendix: Useful Console Commands

Behaviour Description
tritran:sqs_queue:create Creates a new standard or FIFO queue. You can pass one or more attributes in the request.
tritran:sqs_queue:update Update queue attribute based on its configuration which shown in config.yml
tritran:sqs_queue:delete Delete a queue by url and all its messages
tritran:sqs_queue:attr Retrieve the attribute of a specified queue
tritran:sqs_queue:purge Deletes the messages in a queue specified by the QueueURL parameter.
tritran:sqs_queue:worker Start a worker that will listen to a specified SQS queue
tritran:sqs_queue:ping Send a simply message to a queue, for DEBUG only

Note: Please using -h for more information for each command.

tritran_sqs_queue:
sqs_queue:
queues:

# Prototype
name:
queue_url: ~ # Required
worker: ~ # Required
attributes:
delay_seconds: 0
maximum_message_size: 262144
message_retention_period: 345600
receive_message_wait_time_seconds: 20
visibility_timeout: 30
content_based_deduplication: false
redrive_policy:
max_receive_count: 5
dead_letter_queue: ~ # Required
  • Merge pull request #32 from trandangtri/feature/issue-30
    By web-flow, 4 months ago
  • Add more Test cases
    By trandangtri, 4 months ago
  • Update README
    By trandangtri, 4 months ago
  • Support MessageGroupID and MessageDeduplicationID in sending message to a FIFO queue
    By trandangtri, 4 months ago
  • Support VisibilityTimeout per message
    By trandangtri, 4 months ago
  • Add a new parameter for FIFO queue, names Content-BasedDeduplication
    By trandangtri, 4 months ago
  • Merge pull request #28 from trandangtri/feature/issue-24
    By web-flow, 7 months ago
  • Return all of attributes of each message in receiving.
    By trandangtri, 7 months ago
  • Update document in bundle registration
    By trandangtri, 7 months ago
  • Merge pull request #27 from trandangtri/2.x
    By web-flow, 7 months ago
  • Add more Command as service
    By trandangtri, 7 months ago
  • Compatible with Symfony 4
    By trandangtri, 7 months ago
  • Merge pull request #23 from trandangtri/feature/amount-consumed
    By web-flow, 9 months ago
  • Adjust the test case
    By trandangtri, 9 months ago
  • Coding Standard
    By trandangtri, 9 months ago
  • Using Application from Console component
    By trandangtri, 9 months ago
  • Add more argument: amount of messages to consume
    By trandangtri, 9 months ago
  • Merge pull request #22 from trandangtri/fixbug/default-attr-queue
    By web-flow, 9 months ago
  • Update the default attribute of queue in creating a new one via Console
    By trandangtri, 9 months ago
  • Merge pull request #20 from trandangtri/feature/remove-coveralls
    By web-flow, 10 months ago
  • Remove Coveralls integration
    By trandangtri, 10 months ago
  • Merge pull request #18 from trandangtri/feature/issue-8
    By web-flow, 10 months ago
  • Write documentation about sending messages
    By trandangtri, 10 months ago
  • Merge pull request #16 from trandangtri/feature/logging-worker
    By web-flow, 11 months ago
  • Add more logging message to the base worker
    By trandangtri, 11 months ago
  • Enable Long Polling as default
    By trandangtri, 11 months ago
  • Enable Long Polling() as default
    By trandangtri, 11 months ago
  • Enable Long Polling() as default
    By trandangtri, 11 months ago
  • Merge pull request #14 from trandangtri/hotfix/redrive-policy-as-default
    By web-flow, 11 months ago
  • Fix a bug in getting RedrivePolicy as default
    By trandangtri, 11 months ago