SQS is a service that manages and operates message oriented middleware. It enables you to decouple and scale micro-services, distributed systems, and serverless applications.
What's a queue? - A form of asynchronous service to service communication used in multiple application architectures. - Messages are stored on teh queue until they are processed and deleted
- Oldest offering from AWS (over 10 years old)
- Fully managed service
- Scales from 1 message per second to 10,000 per second
- Default retention of messages: 4 days
- A maximum of 14 days
- There is no limit to how many messages can be in the queue
- Low latency (10 ms on publish and receive)
- Horizontal scaling in terms of number of consumers
- Can have duplicate messages
- Can have messages out of order (best effort ordering)
- Limitation of 256kb per message sent
- Delay a message so a consumer doesn't see it immediately
- up to 15-minute delay
- Default is 0 seconds making messages available right away
- You can set a default at queue level
- YOu can override the default using the DelaySeconds parameter
- Define the body
- Add message attributes (metadata - optional)
- Optionally can provide Delay Delivery
- You receive back:
- Message identifier
- MD5 hash of the body
- Poll SQS for messages
- receive up to 10 messages at a time
- Next step is to process the message within the visibility timeout
- Finally, delete the message using the message ID & receipt handle
- When a consumer polls a message from a queue, the message is invisible to the other consumers for a defined period called Visibility Timeout
- Can be set between 0 seconds to 12 hours
- Default 30 seconds
- If it takes 15 minutes or greater and consumer fails to process the message, you must wait before processing the message again
- IF set to 30 seconds or lower and consumer needs time to process the message, another consumer will receive the message and will be processed more than once
- ChangeMessageVisibility
- An API to change the visibility while processing a message
- DeleteMessage
- An API to tell SQS the message was successfully processed
- If a consumer fails to consume a message within the visibility timeout, the message goes back to the queue. We can put a threshold of how many times a message can be put back to the queue
- After MaximumReceives times the threshold is exceeded and the message goes into dead letter queue (DLQ)
- DLQ is useful for debugging
- Retention times for the messages should be set to max (14 days) in case of a DLQ
- DLQ is a queue which is created separately and attached to the normal queue
- When a consumer requests for a message from a queue it can optionally wait for messages to arrive in case there is no available message to be consumed in the queue
- Long polling decreases the number of API calls made to SQS while increasing the efficiency and latency of the application
- The wait time can be set to 1 second up to 20 seconds.
- Long polling should be preferred in case of short polling (wait time of 0 seconds)
- Long polling is enabled by setting a value between 1 and 20 for WaitTimeSeconds queue attribute
- Message size limit is 265KB in case of a queue, Extended Client Java library offers an implementation for larger messages using S3
- The data is uploaded into S3, the message will contain a pointer to the data. When the message is consumed, the data is retrieved from the S3 using the pointer
- CreateQueue(MessageRetentionPeriod): creates a queue
- DeleteQueue: deletes a queue
- PurgeQueue: deletes all the messages from a queue
- SendMessage(DelaySeconds): send a message with optional delay
- ReceiveMessageWaitTimeSeconds: receives a message using long polling
- ChangeMessageVisibility: changes the message wait time in case there is more time needed for processing
- Batch API: SendMessage, DeleteMessage, ChangeMessageVisibility
- FIFO = First In First Out
- Provides ordering of the messages in a queue
- Has limited throughput compared to standard queues: 300 msg/s without batching, 3000 msg/s with batching
- Exactly-once send capability
- Messages are processed in order by the consumer
- Queues which are created as FIFO should have their name ending with "fifo"
- Used for making sure that a message is sent only once
- Deduplication interval is 5 minutes
- Deduplication methods:
- Content based deduplication: the message body is hashed with SHA-256 algorithm and the hash is used to detect duplicates
- MessageDeduplicationID: attribute can be set explicitly for checking duplicates
- MessageGroupID: if this attribute is set, a message group can have only one consumer and the messages will arrive in order for the same message group
- Provides ordering at a subset level of messages in case of a queue:
- Messages which share the same group id arrive in order within the group
- Each group id can have a different consumer. A queue can have multiple groups
- Ordering across the groups are not guaranteed