Standard vs FIFO Queues in Amazon SQS: How to Choose the Right Queue for Your Workload
When you start using Amazon SQS, one of the first decisions you’ll make is surprisingly simple:
Should I use a Standard queue or a FIFO queue?
At first glance, FIFO sounds like the obvious choice.
FIFO means First-In, First-Out.
So naturally, you might think:
“If FIFO preserves order, why wouldn’t I always use it?”
Because ordering comes with a trade-off.
In many distributed systems, strict ordering isn’t actually required. What matters more is throughput, scalability, availability, and the ability to process large numbers of messages efficiently.
That’s why AWS provides two different queue types:
Standard SQS
|
+--> High throughput
+--> At-least-once delivery
+--> Best-effort ordering
FIFO SQS
|
+--> Ordering
+--> Deduplication
+--> More controlled processing semanticsChoosing between them isn’t about which one is “better.”
It’s about understanding what your application actually needs.
Let’s break it down.
First: What Is SQS?
Before comparing Standard and FIFO, let’s quickly establish what SQS does.
Amazon Simple Queue Service is a managed message queue.
The basic architecture is:
Producer
|
| Send message
v
+-----------+
| SQS Queue |
+-----------+
|
| Receive message
v
ConsumerThe producer and consumer don’t have to operate at the same time.
The producer can place work into the queue.
The consumer can process it later.
This provides:
- Decoupling
- Buffering
- Asynchronous processing
- Retry handling
- Failure isolation
- Independent scaling
For example:
Order Service
|
v
SQS
|
v
Order WorkerThe Order Service doesn’t need to wait for the worker to finish.
So What’s Different Between Standard and FIFO?
The simplest distinction is:
Standard queues prioritize high-throughput distributed processing. FIFO queues prioritize ordering and deduplication characteristics.
Think about the two models.
Standard
Messages arrive:
A → B → C → D
Processing might happen:
B → A → D → CYou shouldn’t design your application around strict ordering.
FIFO
Messages arrive:
A → B → C → D
Required processing order:
A → B → C → DWhen ordering is a business requirement, FIFO becomes valuable.
But there’s much more to the decision than that.
Standard Queues
Standard queues are the default choice for many workloads.
They are designed for:
- Very high throughput
- Distributed processing
- Horizontal scaling
- Workloads where strict ordering isn’t required
For example:
SQS Standard
|
+----------+----------+
| | |
v v v
Worker A Worker B Worker CMessages can be processed concurrently.
This makes Standard queues a natural fit for workloads such as:
- Image processing
- Video processing
- Email jobs
- Background tasks
- Log processing
- Data transformation
- Large-scale asynchronous workloads
The Important Property of Standard Queues
Standard SQS provides at-least-once delivery.
That means your application should be prepared for a message to be delivered more than once.
For example:
Message A
|
v
Worker
|
v
Processing succeeds
|
X
Something goes wrong before deletion
|
v
Message A becomes available again
|
v
Worker receives Message A againSo your consumer needs to be designed appropriately.
This leads to one of the most important concepts in distributed systems:
Idempotency.
What Is Idempotency?
Suppose you have:
OrderCreatedand your worker creates an order in a database.
If the same message is processed twice:
Attempt 1 → Create order
Attempt 2 → Create order againyou could create duplicate data.
For something like payment processing, the consequences could be much worse:
Attempt 1 → Charge customer
Attempt 2 → Charge customer againA better consumer uses a unique event or operation ID.
For example:
{
"eventId": "evt-12345",
"orderId": "ORD-10001",
"eventType": "OrderCreated"
}The consumer can track whether:
evt-12345has already been processed.
If it sees the same event again, it can safely ignore or reconcile the duplicate.
This is good practice regardless of queue type.
Standard Queues and Ordering
Here’s something important:
Standard queues don’t provide strict ordering guarantees.
Suppose you send:
A
B
C
DYou shouldn’t build business logic that assumes:
A → B → C → Dwill always be the processing order.
Why?
Because distributed systems prioritize scalability and availability, and multiple consumers can process messages concurrently.
For many workloads, this doesn’t matter.
For example:
Resize Image A
Resize Image B
Resize Image CThere is no meaningful reason Image A must finish before Image B.
Standard queues are perfect for that kind of workload.
FIFO Queues
FIFO queues are designed for workloads where message ordering and deduplication characteristics matter.
FIFO means:
First-In, First-Out.
Conceptually:
Producer
|
v
+-------------+
| FIFO Queue |
+-------------+
|
v
A → B → C → DIf your application depends on processing events in order, FIFO is worth considering.
A Real Example: Account Operations
Imagine a banking application.
You receive:
1. CreateAccount
2. DepositMoney
3. WithdrawMoney
4. CloseAccountThe order matters.
You don’t want:
WithdrawMoney
|
v
CreateAccountor:
CloseAccount
|
v
DepositMoneyThe business workflow has an explicit sequence.
This is a good example of where FIFO semantics can be useful.
Another Example: Inventory Updates
Imagine an inventory system receives:
Product A → Stock = 100
Product A → Stock = 90
Product A → Stock = 80If the updates represent sequential state changes, processing them out of order could produce an incorrect result.
For example:
80
90
100could incorrectly leave the system believing the inventory is 100.
If strict ordering is a business requirement, FIFO can help model that workflow.
Message Groups: The Powerful Part of FIFO
FIFO queues introduce an important concept:
Message groups.
Imagine you have orders:
Order A
Order B
Order CYou might want:
Order A messages → processed in order
Order B messages → processed in order
Order C messages → processed in orderBut you don’t necessarily want Order A to block Order B.
Message groups allow you to create independent ordered streams.
Conceptually:
FIFO Queue
Group A:
A1 → A2 → A3
Group B:
B1 → B2 → B3
Group C:
C1 → C2 → C3Within each group, ordering is maintained.
Different groups can provide opportunities for parallel processing.
This is one of the most important ideas when designing FIFO workloads.
Why Message Groups Matter
Imagine a payment platform processing transactions for thousands of customers.
You might require:
Customer A:
Transaction 1 → Transaction 2 → Transaction 3but you don’t necessarily need:
Customer A Transaction 1to block:
Customer B Transaction 1You could conceptually use:
MessageGroupId = customer-A
MessageGroupId = customer-BNow the ordering requirement is scoped to the entity that actually needs ordering.
That’s much more scalable than forcing the entire queue into one global sequence.
Don’t Accidentally Create One Giant Message Group
Here’s a common design mistake.
Suppose every message uses:
MessageGroupId = "orders"Now you’ve effectively created one ordered stream.
Conceptually:
orders
|
+-- Message 1
+-- Message 2
+-- Message 3
+-- Message 4
+-- Message 5You may have just limited your ability to process independent work in parallel.
If the business requirement is:
“Order messages must be ordered per customer.”
then grouping by customer may make more sense.
For example:
Customer A → Group A
Customer B → Group B
Customer C → Group CThe key principle is:
Scope ordering to the entity that actually requires it.
FIFO and Deduplication
Another important FIFO capability is deduplication.
Imagine the producer accidentally sends:
OrderCreated
OrderCreatedwith the same deduplication identity.
FIFO queues provide deduplication mechanisms that can help prevent duplicate messages from being accepted within the relevant deduplication window.
But don’t misunderstand this.
It doesn’t mean:
“My application no longer needs idempotency.”
You should still design consumers defensively.
Messaging guarantees don’t replace application-level correctness.
Standard vs FIFO: The Core Trade-Off
Now we can frame the decision more clearly.
Standard
|
+--> Optimize for throughput and scalability
|
+--> Ordering isn't critical
|
+--> Consumer handles duplicates
FIFO
|
+--> Ordering matters
|
+--> Deduplication characteristics matter
|
+--> Work can be partitioned into message groupsThis is the real architectural decision.
Example: Image Processing
Suppose users upload:
Image A
Image B
Image C
Image DYour workers resize them.
Does Image A need to finish before Image B?
No.
You want:
SQS Standard
|
+----> Worker 1 → Image A
+----> Worker 2 → Image B
+----> Worker 3 → Image C
+----> Worker 4 → Image DThroughput matters more than ordering.
Standard is the natural choice.
Example: Financial Transactions
Now consider:
Account 123
|
+----> Deposit ₹1,000
+----> Withdraw ₹300
+----> Withdraw ₹200The sequence may matter to the business.
You may need:
Deposit
↓
Withdraw 300
↓
Withdraw 200rather than arbitrary ordering.
FIFO becomes a strong candidate.
Example: Email Notifications
Suppose you’re sending:
Welcome Email
Password Reset Email
Marketing EmailDo these messages need strict global ordering?
Usually not.
A Standard queue may be completely sufficient:
SQS Standard
|
+----> Worker
+----> Worker
+----> WorkerThere’s little value in forcing an ordering guarantee that the business doesn’t need.
Example: Video Processing
Imagine:
10,000 videosneed transcoding.
The goal is:
Process as many videos as safely possible.
You don’t care whether:
Video 1finishes before:
Video 2You care about throughput.
Standard queues are a natural fit.
Example: Order State Transitions
Now imagine:
OrderCreated
OrderPaid
OrderShipped
OrderDeliveredThe sequence represents a business state machine.
If consumers process:
OrderShippedbefore:
OrderPaidyou could end up with an invalid state transition.
This is a situation where ordering may genuinely matter.
FIFO should be considered.
But there’s an important architectural question:
Do you need global ordering, or ordering only for each individual order?
Usually, it’s the latter.
Get TheVega.AI’s stories in your inbox
Join Medium for free to get updates from this writer.
That means message groups can be important.
Order A → Group A
Order B → Group B
Order C → Group CEach order can maintain its own sequence.
Don’t Choose FIFO Just Because Ordering Sounds Good
This is probably the biggest recommendation in this article.
Ask:
Does my business logic actually depend on ordering?
If the answer is:
“Not really.”
Use Standard.
For example:
GenerateThumbnail
GenerateThumbnail
GenerateThumbnailThere’s usually no meaningful order.
Using FIFO would add constraints without solving a real problem.
Don’t Choose Standard When Order Is a Business Requirement
The opposite mistake is more dangerous.
Suppose:
PaymentAuthorized
PaymentCaptured
PaymentRefundedmust be processed in order.
If you use a queue without the required ordering semantics and your application assumes the order anyway, you could create inconsistent state.
The rule is:
If ordering affects correctness, model ordering explicitly.
Don’t depend on timing.
Throughput vs Ordering
One of the easiest ways to think about the trade-off is:
Standard
|
v
More flexibility for high-throughput parallel processingversus:
FIFO
|
v
More controlled ordered processingThis doesn’t mean FIFO is “slow” or Standard is “unreliable.”
It means they optimize for different messaging requirements.
FIFO Doesn’t Mean “Process Everything Globally in Order”
This is a subtle but important point.
You might think FIFO means:
A1
A2
A3
B1
B2
B3
C1
C2
C3must all be processed sequentially.
That’s not the right mental model.
Message groups allow independent ordered streams.
For example:
Group A:
A1 → A2 → A3
Group B:
B1 → B2 → B3
Group C:
C1 → C2 → C3This lets you preserve ordering where necessary while still designing for parallelism across independent groups.
Lambda + Standard SQS
A common architecture is:
SQS Standard
|
+-----------+-----------+
| | |
v v v
Lambda Lambda Lambda
| | |
v v v
Worker Worker WorkerThis is excellent for workloads where:
- Messages are independent
- High throughput matters
- Ordering isn’t required
- Workers can scale horizontally
Examples:
Image processing
Email delivery
Log processing
Data transformation
Background jobsLambda + FIFO SQS
The architecture can also look like:
SQS FIFO
|
+----------+----------+
| |
v v
Lambda A Lambda B
Group A work Group B workNow the application can preserve ordering within message groups while processing independent groups separately.
This is useful for workloads such as:
Account operations
Order state transitions
Inventory changes
Financial workflowswhen the ordering requirement is genuinely part of the business logic.
Retry Behavior Still Matters
Regardless of queue type, messages can fail processing.
For example:
Queue
|
v
Consumer
|
X
Failure
|
v
RetryEventually, a repeatedly failing message may need to go to a dead-letter queue.
Queue
|
v
Consumer
|
X
Failure
|
v
Retry
|
v
Retry
|
v
DLQYour queue design should include failure handling from the beginning.
Visibility Timeout Still Matters
Standard or FIFO doesn’t remove the need to understand visibility timeout.
When a consumer receives a message:
Queue
|
v
Consumer receives message
|
v
Message temporarily invisibleIf the consumer doesn’t successfully complete processing within the visibility timeout, the message can become available again.
If the timeout is too short:
Worker A → Processing
|
+----> Visibility expires
|
v
Worker BYou can end up with duplicate processing.
Again:
Design consumers for safe retries.
Dead-Letter Queues Still Matter
A poison message shouldn’t block your processing pipeline indefinitely.
For example:
Main Queue
|
v
Lambda
|
X
Invalid message
|
v
Retry
|
v
Retry
|
v
DLQMonitor your DLQ.
A sudden increase can indicate:
- Application bugs
- Invalid messages
- Schema changes
- Downstream failures
- Permission problems
A queue architecture isn’t complete until failure handling is considered.
Monitoring Standard and FIFO Queues
Don’t monitor only:
Is the queue running?Monitor whether the workload is actually moving.
Useful signals include:
Queue depth
How many messages are waiting?
Message age
How old is the oldest message?
Consumer errors
Are workers failing?
DLQ messages
Are messages repeatedly failing?
Processing latency
How long does work take?
For FIFO workloads, also pay attention to whether message-group design is creating unnecessary processing bottlenecks.
Queue Backlog Is an Architectural Signal
Suppose your queue contains:
100 messagesand processing capacity is:
10,000 messages/minuteNo major problem.
But suppose:
Queue depth = 10,000
Oldest message = 45 minutesNow you have a latency problem.
The queue is telling you:
Consumers aren’t keeping up with the workload.
Possible causes include:
Traffic increased
Consumer failures
Lambda throttling
Database bottleneck
External API slowdown
Concurrency limitsThe queue itself may not be the root cause.
A Subtle FIFO Problem: Ordering Can Reduce Parallelism
Imagine:
10,000 messagesall belong to:
MessageGroupId = "orders"You’ve created one ordered stream.
Even if your infrastructure has many workers available, your ordering requirement may prevent meaningful parallel processing within that group.
Compare that with:
Customer A → Group A
Customer B → Group B
Customer C → Group C
...Now independent groups can make better use of parallel processing.
So when using FIFO:
Design message groups around natural business partitions.
How to Decide: A Practical Flow
When designing your queue, ask these questions.
Question 1: Does message order affect business correctness?
If no:
Start with Standard.
If yes:
Consider FIFO.
Question 2: Do messages represent independent work?
For example:
Resize Image A
Resize Image B
Resize Image CIf yes, Standard is usually a natural fit.
Question 3: Do messages represent a sequence?
For example:
Create Account
Deposit
Withdraw
Close AccountIf yes, FIFO may be appropriate.
Question 4: Can you partition the ordering requirement?
Ask:
Does everything need to be ordered, or only messages belonging to the same entity?
If it’s per:
Customer
Order
Account
Deviceuse message groups to model that boundary where appropriate.
Question 5: Can the consumer handle duplicate processing?
It should.
Even when the messaging system provides deduplication capabilities, application-level idempotency remains valuable.
A Simple Decision Tree
Here’s a practical mental model:
Do you need ordering?
|
+--------+--------+
| |
No Yes
| |
v v
Standard FIFO
|
v
Can ordering be partitioned?
|
+------+------+
| |
Yes No
| |
v v
Use message Single ordered
groups streamIt’s not a substitute for reading the exact AWS service behavior for your workload, but it’s a useful starting point.
Standard vs FIFO: Quick Comparison
| Capability | Standard | FIFO |
| ------------------- | ---------------------------------------- | ---------------------------------------------- |
| Primary goal | High-throughput distributed processing | Ordered and deduplicated messaging |
| Ordering | Best effort | Ordered within message groups |
| Duplicate handling | Consumers should handle duplicates | Built-in deduplication capabilities |
| Parallel processing | Excellent for independent messages | Excellent across independent message groups |
| Best for | General asynchronous workloads | Order-sensitive workflows |
| Typical examples | Image processing, email, background jobs | Financial workflows, ordered state transitions |The important word here is “best.”
Neither queue is universally better.
A Production Example
Let’s say you’re building an e-commerce platform.
You have two completely different workloads.
Workload 1: Generate product thumbnails
Product Image
|
v
SQS
|
+----> Worker
+----> Worker
+----> WorkerOrder doesn’t matter.
Use:
Standard SQS
Workload 2: Process order state transitions
OrderCreated
|
v
OrderPaid
|
v
OrderShipped
|
v
OrderDeliveredThe sequence matters.
Use:
FIFO SQS, with message groups scoped appropriately, such as per order.
Now your architecture uses both queue types for different problems.
That’s perfectly normal.
You Don’t Have to Choose One Queue Type for Your Entire System
This is an important architectural lesson.
A large application might have:
Application
|
+----------+----------+
| |
v v
Standard SQS FIFO SQS
| |
v v
Background Jobs Order ProcessingThere is no rule saying:
“Our application uses FIFO.”
or:
“Our platform uses Standard.”
Different workloads can have different messaging requirements.
Choose the queue type per workload.
Common Mistakes
Mistake 1: Using FIFO Everywhere
Ordering isn’t free from an architectural perspective.
If the workload doesn’t need ordering, don’t introduce unnecessary constraints.
Mistake 2: Using Standard and Assuming Order
If ordering affects correctness, don’t rely on timing.
Mistake 3: Creating One FIFO Message Group
If all messages use the same group, you may unnecessarily serialize processing.
Mistake 4: Assuming FIFO Eliminates Idempotency
It doesn’t.
Your business logic still needs to handle retries and unexpected duplicate processing safely.
Mistake 5: Ignoring Backpressure
Even a perfectly designed queue can accumulate an unhealthy backlog.
Mistake 6: Ignoring Downstream Capacity
More consumers can increase throughput — but they can also overload:
Database
API
Payment Provider
External ServiceAlways consider the full processing chain.
The Bigger Lesson
The Standard vs FIFO decision is really about what your application considers important.
If your workload says:
“Process as much independent work as possible.”
Standard is usually the better starting point.
If your workload says:
“The order of these operations is part of correctness.”
FIFO becomes much more interesting.
And if the requirement is:
“Preserve order for each customer, but process different customers independently.”
That’s where message groups become especially powerful.
The goal isn’t to maximize features.
The goal is to model the business requirement correctly.
Final Takeaway
Standard and FIFO queues solve different problems.
Think of Standard as:
High throughput
+
Independent work
+
Horizontal processingAnd FIFO as:
Ordering
+
Deduplication capabilities
+
Partitioned ordered processingA useful rule of thumb is:
If order doesn’t matter, prefer Standard.
If order affects correctness, consider FIFO.
And when using FIFO:
Don’t automatically create one global ordered stream. Partition ordering around the entity that actually needs it.
For example:
Standard:
SQS
|
+----> Worker A
+----> Worker B
+----> Worker C
FIFO:
SQS FIFO
|
+---- Group A → A1 → A2 → A3
|
+---- Group B → B1 → B2 → B3
|
+---- Group C → C1 → C2 → C3The most important question isn’t:
“Which SQS queue is better?”
It’s:
“What does my workload require for correctness, and what can I safely process in parallel?”
Once you answer that, the Standard vs FIFO decision becomes much easier.
What Are You Using?
Have you used Standard SQS, FIFO SQS, or both in production?
What influenced your decision — ordering, throughput, deduplication, message groups, or downstream processing constraints?
Share your experience in the comments.
If this article helped you understand the Standard vs FIFO decision, share it with another AWS or DevOps engineer designing an asynchronous system.









