Sitemap
TheVega.AI

TheVega.AI

DevOps Engineer passionate about teaching and sharing knowledge. Writing about DevOps, SRE, Linux, Kubernetes, and computer science behind modern infrastructure

Press enter or click to view image in full size
Standard vs FIFO: Throughput or Ordering?

Standard vs FIFO Queues in Amazon SQS: How to Choose the Right Queue for Your Workload

14 min readAug 30, 2026

--

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 semantics

Choosing 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
Consumer

The 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 Worker

The 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 → C

You shouldn’t design your application around strict ordering.

FIFO

Messages arrive:

A → B → C → D
Required processing order:
A → B → C → D

When 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 C

Messages 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 again

So 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:

OrderCreated

and your worker creates an order in a database.

If the same message is processed twice:

Attempt 1 → Create order
Attempt 2 → Create order again

you could create duplicate data.

For something like payment processing, the consequences could be much worse:

Attempt 1 → Charge customer
Attempt 2 → Charge customer again

A 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-12345

has 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
D

You shouldn’t build business logic that assumes:

A → B → C → D

will 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 C

There 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 → D

If 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. CloseAccount

The order matters.

You don’t want:

WithdrawMoney
|
v
CreateAccount

or:

CloseAccount
|
v
DepositMoney

The 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 = 80

If the updates represent sequential state changes, processing them out of order could produce an incorrect result.

For example:

80
90
100

could 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 C

You might want:

Order A messages → processed in order
Order B messages → processed in order
Order C messages → processed in order

But 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 → C3

Within 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 3

but you don’t necessarily need:

Customer A Transaction 1

to block:

Customer B Transaction 1

You could conceptually use:

MessageGroupId = customer-A
MessageGroupId = customer-B

Now 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 5

You 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 C

The 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
OrderCreated

with 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 groups

This is the real architectural decision.

Example: Image Processing

Suppose users upload:

Image A
Image B
Image C
Image D

Your 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 D

Throughput matters more than ordering.

Standard is the natural choice.

Example: Financial Transactions

Now consider:

Account 123
|
+----> Deposit ₹1,000
+----> Withdraw ₹300
+----> Withdraw ₹200

The sequence may matter to the business.

You may need:

Deposit

Withdraw 300

Withdraw 200

rather than arbitrary ordering.

FIFO becomes a strong candidate.

Example: Email Notifications

Suppose you’re sending:

Welcome Email
Password Reset Email
Marketing Email

Do these messages need strict global ordering?

Usually not.

A Standard queue may be completely sufficient:

SQS Standard
|
+----> Worker
+----> Worker
+----> Worker

There’s little value in forcing an ordering guarantee that the business doesn’t need.

Example: Video Processing

Imagine:

10,000 videos

need transcoding.

The goal is:

Process as many videos as safely possible.

You don’t care whether:

Video 1

finishes before:

Video 2

You care about throughput.

Standard queues are a natural fit.

Example: Order State Transitions

Now imagine:

OrderCreated
OrderPaid
OrderShipped
OrderDelivered

The sequence represents a business state machine.

If consumers process:

OrderShipped

before:

OrderPaid

you 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 C

Each 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
GenerateThumbnail

There’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
PaymentRefunded

must 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 processing

versus:

FIFO
|
v
More controlled ordered processing

This 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
C3

must 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 → C3

This 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 Worker

This 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 jobs

Lambda + FIFO SQS

The architecture can also look like:

                     SQS FIFO
|
+----------+----------+
| |
v v
Lambda A Lambda B
Group A work Group B work

Now 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 workflows

when the ordering requirement is genuinely part of the business logic.

Press enter or click to view image in full size
Order Within Groups. Scale Across Groups.

Retry Behavior Still Matters

Regardless of queue type, messages can fail processing.

For example:

Queue
|
v
Consumer
|
X
Failure
|
v
Retry

Eventually, a repeatedly failing message may need to go to a dead-letter queue.

Queue
|
v
Consumer
|
X
Failure
|
v
Retry
|
v
Retry
|
v
DLQ

Your 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 invisible

If 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 B

You 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
DLQ

Monitor 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 messages

and processing capacity is:

10,000 messages/minute

No major problem.

But suppose:

Queue depth = 10,000
Oldest message = 45 minutes

Now 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 limits

The queue itself may not be the root cause.

A Subtle FIFO Problem: Ordering Can Reduce Parallelism

Imagine:

10,000 messages

all 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 C

If yes, Standard is usually a natural fit.

Question 3: Do messages represent a sequence?

For example:

Create Account
Deposit
Withdraw
Close Account

If 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
Device

use 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 stream

It’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
+----> Worker

Order doesn’t matter.

Use:

Standard SQS

Workload 2: Process order state transitions

OrderCreated
|
v
OrderPaid
|
v
OrderShipped
|
v
OrderDelivered

The 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 Processing

There 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 Service

Always 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 processing

And FIFO as:

Ordering
+
Deduplication capabilities
+
Partitioned ordered processing

A 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 → C3

The 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.

--

--

TheVega.AI
TheVega.AI