AWS SQS
A SQS event source tells maelstromd
to poll a SQS queue for messages. If a message is received, the related
component is activated and the message body is sent to the component via HTTP POST. The message body is sent as the
POST body. If the component responds with a 200 status code, the SQS message is deleted from the queue. Otherwise
the message will stay in the queue and become eligible for redelivery when the visibility timeout elapses.
While SQS has no native notion of priority queueing, this event source optionally supports polling a set of queues
that share a common name prefix. For example, given an event source configured with nameasprefix: true
and
a set of queues named:
resize-image-0
resize-image-1
resize-image-2
maelstromd
will poll the queues in name order, draining the "0" queue completely, then "1", then "2".
While driaining lower priority queues, maelstromd
will periodically reset and poll from the head of the list
in order to re-check the higher priority queues.
Concurrency
You can control the number of messages maelstromd
will dequeue at a time. For example, if you want your system
to process no more than 10 messages concurrently, set maxconcurrency: 10
on the SQS event source.
This is different than the maxconcurrency
setting on the component. The component setting specifies max concurrency
per instance of a component across all event sources, where the SQS setting specified the max concurrency across ALL
instances of the component that will originate from this event source.
If you are using a SQS FIFO queue you may also wish to set concurrencyperpoller: 1
to ensure that messages are
processed in the strict order they are dequeued.
The max number of pollers = ceil(sqs-maxconcurrency / concurrencyperpoller)
Back pressure
If you return a HTTP header pause-seconds
, maelstromd
will sleep for that number of seconds before polling SQS again.
The header value must be an integer (e.g.: pause-seconds: 30
).
The poller will pause once for the specified number of seconds, then clear this value.
Properties
Property | Description | Default |
---|---|---|
queuename | Name of queue (or queue prefix) to poll | None (required) |
nameasprefix | If true, treat queuename as prefix. Poll all queues starting with that name | false |
path | Request path to POST to on component | None (required) |
maxconcurrency | Max concurrency messages to process via SQS across all instances | 10 |
messagesperpoll | Messages to receive per polling attempt (1..10) | 1 |
concurrencyperpoller | Concurrent messages to process per polling process | messagesperpoll |
visibilitytimeout | Seconds to mark message invisible before it is eligible to dequeue again | 300 |
Examples
Example 1: Poll a single queue and process up to 15 messages concurrently
components:
mywebapp:
image: example/myapp
eventsources:
process_order_sqs:
sqs:
queuename: pending-orders
path: /queues/pendingorder
maxconcurrency: 15
visibilitytimeout: 600
Example 2: Poll a set of queues with a name prefix. Pull 10 messages at a time per poller.
components:
mywebapp:
image: example/myapp
eventsources:
process_order_sqs:
sqs:
queuename: resize-image-
nameasprefix: true
path: /queues/resizeimage
maxconcurrency: 50
messagesperpoll: 10
concurrencyperpoller: 10