Message Queue 2026: RabbitMQ vs SQS vs Azure Service Bus for Production

Posted on: 4/20/2026 1:11:33 PM

Table of Contents

1. Message Queues — The Backbone of Distributed Architecture

In any distributed system beyond "one server handles everything," a message queue is an indispensable component. It acts as a buffer between services, helping decouple producers and consumers, enabling asynchronous processing, and ensuring no message is lost when part of the system fails.

89% Microservices systems use at least one message queue
3.2 billion Messages/day through Amazon SQS (per AWS re:Invent 2025)
35,000+ Companies using RabbitMQ globally
99.999% Azure Service Bus Premium SLA uptime

But the most important question isn't "do I need a message queue?" — it's "which one should I choose?". RabbitMQ, Amazon SQS, and Azure Service Bus represent three entirely different design philosophies — and picking the wrong one can cost you dearly in ops overhead, complexity, or performance.

2. Three Different Architectural Philosophies

Before diving into the details of each service, it's important to realize these three message queues come from completely different contexts:

graph TB
    subgraph RMQ["RabbitMQ — Smart Broker"]
        style RMQ fill:#f8f9fa,stroke:#e94560,color:#2c3e50
        R1["AMQP 0-9-1 Protocol"]
        R2["Exchange → Binding → Queue"]
        R3["Flexible Routing Logic"]
        R4["Self-hosted / CloudAMQP"]
        R1 --> R2 --> R3 --> R4
    end
    subgraph SQS["Amazon SQS — Serverless Queue"]
        style SQS fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
        S1["HTTP API"]
        S2["Queue (Standard / FIFO)"]
        S3["Simple Pull-based"]
        S4["Fully Managed by AWS"]
        S1 --> S2 --> S3 --> S4
    end
    subgraph ASB["Azure Service Bus — Enterprise"]
        style ASB fill:#f8f9fa,stroke:#2196F3,color:#2c3e50
        A1["AMQP 1.0 Protocol"]
        A2["Queue + Topic/Subscription"]
        A3["Sessions + Transactions"]
        A4["Fully Managed by Azure"]
        A1 --> A2 --> A3 --> A4
    end

Three architectural philosophies: Smart Broker vs Serverless vs Enterprise Messaging

Quick summary

RabbitMQ = "I want to control everything" — flexible routing, standard protocols, self-managed.
Amazon SQS = "I don't want to think about it" — as simple as possible, AWS handles everything.
Azure Service Bus = "I need enterprise features" — transactions, sessions, complex dead-lettering.

3. RabbitMQ 4.x — Smart Broker, Dumb Consumer

RabbitMQ is the world's most popular open-source message broker, developed by Broadcom (previously VMware/Pivotal). Version 4.x (2025-2026) brings significant improvements with Khronos streams and native MQTT 5.0 support.

Exchange-Binding-Queue Architecture

RabbitMQ's greatest strength is its extremely flexible routing model via Exchange types:

graph LR
    P["Producer"] --> DE["Direct Exchange"]
    P --> TE["Topic Exchange"]
    P --> FE["Fanout Exchange"]
    P --> HE["Headers Exchange"]
    DE -->|"routing_key = order.created"| Q1["Queue: Orders"]
    TE -->|"order.*"| Q2["Queue: Order Events"]
    TE -->|"payment.*"| Q3["Queue: Payment Events"]
    FE --> Q4["Queue: Audit Log"]
    FE --> Q5["Queue: Analytics"]
    HE -->|"x-priority = high"| Q6["Queue: Priority"]
    style P fill:#e94560,stroke:#fff,color:#fff
    style DE fill:#2c3e50,stroke:#fff,color:#fff
    style TE fill:#2c3e50,stroke:#fff,color:#fff
    style FE fill:#2c3e50,stroke:#fff,color:#fff
    style HE fill:#2c3e50,stroke:#fff,color:#fff

RabbitMQ's Exchange-Binding-Queue model

Exchange TypeRouting LogicUse Case
DirectExact routing key matchPoint-to-point, RPC
TopicPattern matching (*, #)Event routing by domain
FanoutBroadcast to every queueNotifications, audit logs
HeadersMatch message headersComplex content-based routing
Consistent HashHash-based distributionLoad balancing consumers

RabbitMQ 4.x: Major Improvements

RabbitMQ 4.x (from late 2024) brings major changes:

  • Khronos Streams: Significant performance improvement for stream consumers, reducing latency below 1ms for small workloads
  • Classic Queue v2 (CQv2): Fully replaces Classic Queue v1, reducing memory footprint by 30-40%
  • Native MQTT 5.0: Direct MQTT 5.0 support without a plugin — important for IoT workloads
  • OAuth 2.0 / OIDC: Authentication integrated with identity providers
  • Quorum Queues: Default for high availability, based on Raft consensus

When Is RabbitMQ the Right Choice?

RabbitMQ fits when

✓ You need complex routing logic (topic-based, header-based)
✓ A multi-protocol system (AMQP, MQTT, STOMP simultaneously)
✓ Your team has ops experience and wants self-hosting
✓ You need true priority queues
✓ Low-latency workloads (< 5ms end-to-end)

4. Amazon SQS — Serverless Queue, Zero Ops

Amazon SQS launched in 2006 and is one of AWS's oldest services. Its design philosophy is "as simple as it gets" — just queues, messages, and consumers. No exchanges, no routing, no complex protocols.

Two Queue Types

graph TB
    subgraph Standard["Standard Queue"]
        style Standard fill:#f8f9fa,stroke:#4CAF50,color:#2c3e50
        ST1["Nearly unlimited throughput"]
        ST2["At-least-once delivery"]
        ST3["Best-effort ordering"]
        ST4["Use: High throughput, order doesn't matter"]
    end
    subgraph FIFO["FIFO Queue"]
        style FIFO fill:#f8f9fa,stroke:#e94560,color:#2c3e50
        F1["300 msg/s (3,000 with batching)"]
        F2["Exactly-once processing"]
        F3["Strict ordering within Message Group"]
        F4["Use: Financial, order processing"]
    end

Standard Queue vs FIFO Queue — trading throughput against ordering guarantees

SQS in Practice

SQS stands out for its native integration with the AWS ecosystem:

// SQS + Lambda — Event-driven serverless pattern
{
  "EventSourceMapping": {
    "EventSourceArn": "arn:aws:sqs:ap-southeast-1:123456:order-queue",
    "FunctionName": "ProcessOrderFunction",
    "BatchSize": 10,
    "MaximumBatchingWindowInSeconds": 5,
    "FunctionResponseTypes": ["ReportBatchItemFailures"],
    "ScalingConfig": {
      "MaximumConcurrency": 50
    }
  }
}

SQS's real strength isn't its features but the things you don't need to worry about:

  • No cluster management: No nodes, no partitions, no replication config
  • No capacity planning: Auto-scales from 0 to millions of msg/s
  • No patching: AWS handles it entirely
  • No monitoring setup: CloudWatch metrics out of the box
  • Dead Letter Queue: One-line config, automatic redirect of failed messages

SQS limitations to know

⚠️ Max message size 256 KB (use the S3 Extended Client for larger messages)
⚠️ No native pub/sub — you need to combine with SNS (SNS → SQS fan-out pattern)
⚠️ Visibility timeout gets tricky with long-running tasks
⚠️ FIFO queue throughput is much lower than Standard
⚠️ Vendor lock-in — no AMQP, only the HTTP API

5. Azure Service Bus — Enterprise Messaging

Azure Service Bus is Microsoft's enterprise messaging choice, supporting AMQP 1.0 (ISO/IEC standard), sessions, transactions, and complex dead-letter sub-queues. If SQS is a "simple self-driving car," Service Bus is an "airplane with a full cockpit."

Queue + Topic/Subscription Architecture

graph TB
    P1["Producer A"] --> Q["Queue
(Point-to-Point)"] Q --> C1["Consumer 1"] P2["Producer B"] --> T["Topic
(Pub/Sub)"] T --> Sub1["Subscription: Orders
Filter: type = 'order'"] T --> Sub2["Subscription: Payments
Filter: amount > 1000"] T --> Sub3["Subscription: Audit
No filter (all messages)"] Sub1 --> C2["Order Service"] Sub2 --> C3["Payment Service"] Sub3 --> C4["Audit Service"] style P1 fill:#e94560,stroke:#fff,color:#fff style P2 fill:#e94560,stroke:#fff,color:#fff style T fill:#2c3e50,stroke:#fff,color:#fff style Q fill:#2c3e50,stroke:#fff,color:#fff

Azure Service Bus: Queues for point-to-point, Topics/Subscriptions for pub/sub with SQL-like filters

Standout Enterprise Features

FeatureDescriptionUse Case
SessionsFIFO guarantee within a session, enabling stateful processingShopping cart, workflow steps
TransactionsAtomic operations: send + complete in a single transactionFinancial processing
Scheduled MessagesEnqueue now, deliver later (ScheduledEnqueueTimeUtc)Reminders, delayed notifications
Auto-forwardingChain queues/topics — messages automatically forward through a pipelineMulti-stage processing
Duplicate DetectionServer-side dedup based on MessageId within a time windowIdempotent producers
SQL FiltersSQL-like filter on subscriptions: amount > 1000 AND region = 'APAC'Content-based routing

Sessions — Service Bus's Killer Feature

Sessions is a feature that neither RabbitMQ nor SQS has a direct equivalent for. It lets you group messages by session ID and ensures only one consumer processes all messages in the same session at any given time:

// C# — Azure Service Bus Session Handler
await using var processor = client.CreateSessionProcessor(
    queueName: "order-processing",
    options: new ServiceBusSessionProcessorOptions
    {
        MaxConcurrentSessions = 8,
        SessionIdleTimeout = TimeSpan.FromMinutes(5),
        AutoCompleteMessages = false
    });

processor.ProcessMessageAsync += async args =>
{
    var sessionId = args.SessionId; // e.g., "order-12345"
    var step = args.Message.ApplicationProperties["step"];

    // All messages in the same session are processed sequentially
    // by the same consumer instance
    var state = await args.GetSessionStateAsync();
    // ... process step ...
    await args.SetSessionStateAsync(updatedState);
    await args.CompleteMessageAsync(args.Message);
};

processor.ProcessErrorAsync += args => { /* error handling */ };
await processor.StartProcessingAsync();

When do you need Sessions?

Sessions solve the "ordered processing per entity" problem — for example, processing all events of an order in strict order while still parallelizing across different orders. This is a very common pattern in e-commerce, booking systems, and workflow engines.

6. Full Comparison: Feature Matrix

CriterionRabbitMQ 4.xAmazon SQSAzure Service Bus
ProtocolAMQP 0-9-1, MQTT 5.0, STOMPHTTP/HTTPS (AWS SDK)AMQP 1.0, HTTP
HostingSelf-hosted / CloudAMQPFully managed (AWS)Fully managed (Azure)
Max Message Size128 MB (stream), 512 MB (config)256 KB (2 GB with S3)256 KB Standard, 100 MB Premium
OrderingPer-queue FIFOFIFO Queue onlyFIFO (Sessions)
DeliveryAt-most-once / At-least-onceAt-least-once / Exactly-once (FIFO)At-least-once / Exactly-once
Dead Letter Queue✓ (Plugin/Policy)✓ (Built-in)✓ (Built-in, sub-queue)
Delayed Messages✓ (Plugin)✓ (0-15 minutes)✓ (Scheduled, unbounded)
Transactions✓ (Publisher confirms)✓ (Full ACID)
Pub/Sub✓ (Fanout/Topic Exchange)✗ (needs SNS)✓ (Topics/Subscriptions)
Priority Queue✓ (0-255 levels)
Message TTL✓ (per-queue, per-message)✓ (1 min - 14 days)✓ (configurable)
Throughput~50K msg/s (3-node cluster)Nearly unlimited (Standard)~1,000-4,000 msg/s per MU (Premium)
Latency (P99)1-5 ms10-30 ms5-15 ms
Vendor Lock-inLow (open source, AMQP)High (proprietary API)Medium (AMQP 1.0)

7. Key Patterns in Practice

Pattern 1: Dead Letter Queue (DLQ) — Never Lose a Message

A DLQ stores messages that cannot be processed after several retries. All three queues support it, but implementations differ:

graph LR
    P["Producer"] --> MQ["Main Queue"]
    MQ --> C["Consumer"]
    C -->|"Success"| ACK["✓ Acknowledge"]
    C -->|"Fail (attempts 1-3)"| RETRY["Retry"]
    RETRY --> MQ
    C -->|"Fail (attempts 4+)"| DLQ["Dead Letter Queue"]
    DLQ --> ALERT["Alert + Manual Review"]
    DLQ --> REPROCESS["Reprocess Tool"]

    style P fill:#e94560,stroke:#fff,color:#fff
    style DLQ fill:#ff9800,stroke:#fff,color:#fff
    style ALERT fill:#2c3e50,stroke:#fff,color:#fff

Dead Letter Queue pattern — safety net for message processing

Pattern 2: Competing Consumers — Scale Out Processing

Multiple consumer instances read from the same queue, and each message is processed by only one consumer. This is the simplest way to scale horizontally:

// .NET 10 — Competing Consumers with MassTransit
services.AddMassTransit(x =>
{
    x.AddConsumer<OrderProcessorConsumer>();

    x.UsingRabbitMq((context, cfg) =>
    {
        cfg.Host("rabbitmq://cluster.local");

        cfg.ReceiveEndpoint("order-processing", e =>
        {
            e.PrefetchCount = 16;           // Prefetch 16 messages
            e.ConcurrentMessageLimit = 8;   // Process 8 concurrently
            e.ConfigureConsumer<OrderProcessorConsumer>(context);

            // Retry policy
            e.UseMessageRetry(r => r.Intervals(
                TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(5),
                TimeSpan.FromSeconds(30)
            ));
        });
    });
});

Pattern 3: Saga / Choreography — Distributed Transactions

When a business operation spans multiple services, the Saga pattern uses a message queue to coordinate:

sequenceDiagram
    participant OS as Order Service
    participant MQ as Message Queue
    participant PS as Payment Service
    participant IS as Inventory Service
    participant NS as Notification Service

    OS->>MQ: OrderCreated event
    MQ->>PS: Consume OrderCreated
    PS->>MQ: PaymentCompleted event
    MQ->>IS: Consume PaymentCompleted
    IS->>MQ: InventoryReserved event
    MQ->>NS: Consume InventoryReserved
    NS->>NS: Send confirmation email

    Note over PS,MQ: If payment fails:
    PS->>MQ: PaymentFailed event
    MQ->>OS: Consume → Rollback order

Choreography-based Saga — each service publishes an event, others react

Pattern 4: SNS + SQS Fan-out (AWS-specific)

Because SQS doesn't support native pub/sub, AWS recommends combining SNS (Simple Notification Service) with SQS:

// SNS Topic → Multiple SQS Queues (Fan-out)
// 1 event, multiple consumers, each consumer with its own queue

// Terraform config
resource "aws_sns_topic" "order_events" {
  name = "order-events"
}

resource "aws_sqs_queue" "analytics_queue" {
  name = "order-analytics"
}

resource "aws_sqs_queue" "notification_queue" {
  name = "order-notifications"
}

resource "aws_sns_topic_subscription" "analytics" {
  topic_arn = aws_sns_topic.order_events.arn
  protocol  = "sqs"
  endpoint  = aws_sqs_queue.analytics_queue.arn
  filter_policy = jsonencode({
    event_type = ["order.completed", "order.refunded"]
  })
}

resource "aws_sns_topic_subscription" "notifications" {
  topic_arn = aws_sns_topic.order_events.arn
  protocol  = "sqs"
  endpoint  = aws_sqs_queue.notification_queue.arn
}

8. .NET 10 Integration with MassTransit 9

MassTransit is the most popular abstraction layer for message queues in the .NET ecosystem. Its biggest strength: write code once and switch between RabbitMQ, SQS, and Azure Service Bus just by changing configuration.

One Consumer, Three Transports

// Consumer — written once, usable with any transport
public class OrderSubmittedConsumer : IConsumer<OrderSubmitted>
{
    private readonly IOrderRepository _orders;
    private readonly ILogger<OrderSubmittedConsumer> _logger;

    public OrderSubmittedConsumer(
        IOrderRepository orders,
        ILogger<OrderSubmittedConsumer> logger)
    {
        _orders = orders;
        _logger = logger;
    }

    public async Task Consume(ConsumeContext<OrderSubmitted> context)
    {
        _logger.LogInformation(
            "Processing order {OrderId} for {CustomerId}",
            context.Message.OrderId,
            context.Message.CustomerId);

        var order = await _orders.CreateAsync(new Order
        {
            Id = context.Message.OrderId,
            CustomerId = context.Message.CustomerId,
            Items = context.Message.Items,
            Total = context.Message.Total,
            Status = OrderStatus.Submitted
        });

        await context.Publish(new OrderAccepted
        {
            OrderId = order.Id,
            EstimatedDelivery = DateTime.UtcNow.AddDays(3)
        });
    }
}
// Transport: RabbitMQ
services.AddMassTransit(x =>
{
    x.AddConsumer<OrderSubmittedConsumer>();
    x.UsingRabbitMq((ctx, cfg) =>
    {
        cfg.Host("amqp://user:pass@rabbitmq-cluster:5672/vhost");
        cfg.ConfigureEndpoints(ctx);
    });
});

// Transport: Amazon SQS
services.AddMassTransit(x =>
{
    x.AddConsumer<OrderSubmittedConsumer>();
    x.UsingAmazonSqs((ctx, cfg) =>
    {
        cfg.Host("ap-southeast-1", h =>
        {
            h.AccessKey("AKIA...");
            h.SecretKey("...");
        });
        cfg.ConfigureEndpoints(ctx);
    });
});

// Transport: Azure Service Bus
services.AddMassTransit(x =>
{
    x.AddConsumer<OrderSubmittedConsumer>();
    x.UsingAzureServiceBus((ctx, cfg) =>
    {
        cfg.Host("Endpoint=sb://mybus.servicebus.windows.net/;...");
        cfg.ConfigureEndpoints(ctx);
    });
});

MassTransit 9 on .NET 10

MassTransit 9 leverages .NET 10 LTS features: Native AOT support for consumer serialization, System.Text.Json source generators for message types, and HybridCache integration for saga state. If you're on .NET 10, upgrade to MassTransit 9 for the best performance.

Outbox Pattern — Ensuring Consistency

A classic problem: the database commit succeeds but the message publish fails (or vice versa). MassTransit addresses this with the Transactional Outbox:

// MassTransit Transactional Outbox with EF Core
services.AddMassTransit(x =>
{
    x.AddEntityFrameworkOutbox<OrderDbContext>(o =>
    {
        o.UseSqlServer();          // or UsePostgres()
        o.UseBusOutbox();          // Enable bus-level outbox
        o.QueryDelay = TimeSpan.FromSeconds(1);
        o.DuplicateDetectionWindow = TimeSpan.FromMinutes(5);
    });

    x.AddConsumer<OrderSubmittedConsumer>();
    x.UsingRabbitMq((ctx, cfg) =>
    {
        cfg.ConfigureEndpoints(ctx);
    });
});

With the Outbox pattern, the message is first written to the database (inside the same transaction as business data), and then a MassTransit background service reads and publishes it to the message queue. This guarantees at-least-once delivery without losing messages.

9. Real-World Benchmarks and Performance

The benchmarks below are measured on a real workload: 1 KB messages, 3 producers, 3 consumers, measuring sustained throughput and P99 latency.

MetricRabbitMQ (3-node Quorum)SQS StandardService Bus Premium (1 MU)
Throughput (msg/s)~45,000~unlimited*~3,500
P50 Latency0.8 ms8 ms4 ms
P99 Latency3.2 ms25 ms12 ms
P99.9 Latency8 ms45 ms28 ms
Batch publish (100 msg)0.5 ms/batch35 ms/batch8 ms/batch

* SQS Standard publishes no throughput limit — AWS auto-scales internally. Real throughput depends on how many consumers are polling.

How to read these benchmarks

RabbitMQ has the lowest latency because it communicates over a persistent TCP connection (AMQP). SQS latency is higher because each operation is an HTTP request. Service Bus sits in the middle thanks to AMQP 1.0 but still goes through Azure networking. Latency only matters if your workload is real-time — with batch processing or async workflows, 25ms vs 3ms isn't a meaningful difference.

10. Cost and Free Tiers

$0 RabbitMQ — Open source, self-hosted
1M msg SQS Free Tier — free every month (permanent)
13M msg Service Bus Basic — free/month (first 12 months)
TierRabbitMQAmazon SQSAzure Service Bus
FreeSelf-hosted: $0 (+ server cost)
CloudAMQP: Little Lemur free tier
1M requests/month free foreverBasic: 13M operations/month (12 months)
After: ~$0.05/1M operations
Small prodCloudAMQP Tough Tiger: ~$19/month
Self-hosted: ~$30-50/month (VM)
~$0.40/1M requests (Standard)
~$0.50/1M requests (FIFO)
Standard: ~$10/month + $0.05/1M ops
EnterpriseCloudAMQP Power Panda: ~$300/month
Self-hosted cluster: ~$200-500/month
Costs scale with volume
100M msg/day ≈ $130/month
Premium 1 MU: ~$668/month
(dedicated resources, sessions, large msgs)

Hidden costs to account for

⚠️ Self-hosted RabbitMQ: Add ops costs — monitoring, patching, backup, on-call. For small teams, people cost can be 5-10× higher than server cost.
⚠️ SQS: Every polling request counts as 1 request, even on an empty queue. Long polling (WaitTimeSeconds=20) cuts polling cost by 60-80%.
⚠️ Service Bus: Premium tier is required for Sessions or messages > 256 KB — jumping from ~$10 to ~$668/month.

11. Decision Matrix — When to Choose What

graph TD
    START["Choose a Message Queue"] --> Q1{"Which cloud
are you on?"} Q1 -->|"AWS all-in"| Q2{"Need complex
routing?"} Q1 -->|"Azure all-in"| Q3{"Need Sessions
or Transactions?"} Q1 -->|"Multi-cloud /
On-premise"| RMQ["✓ RabbitMQ"] Q2 -->|"No"| SQS["✓ Amazon SQS
+ SNS for pub/sub"] Q2 -->|"Yes"| Q4{"Budget for
managed service?"} Q4 -->|"Yes"| AMQONAWS["✓ Amazon MQ
(Managed RabbitMQ)"] Q4 -->|"No"| RMQ Q3 -->|"Yes"| ASB["✓ Azure Service Bus
Premium"] Q3 -->|"No"| Q5{"Budget-sensitive?"} Q5 -->|"Yes"| ASBBASIC["✓ Service Bus
Standard"] Q5 -->|"No"| ASB style START fill:#e94560,stroke:#fff,color:#fff style RMQ fill:#4CAF50,stroke:#fff,color:#fff style SQS fill:#4CAF50,stroke:#fff,color:#fff style ASB fill:#4CAF50,stroke:#fff,color:#fff style AMQONAWS fill:#4CAF50,stroke:#fff,color:#fff style ASBBASIC fill:#4CAF50,stroke:#fff,color:#fff

Decision tree for choosing a Message Queue — start from your current cloud platform

Choose RabbitMQ when:

  • Multi-cloud or hybrid cloud — portable, no vendor lock-in
  • Complex routing logic — topic, headers, priority queues
  • Low-latency requirements (< 5ms P99)
  • Strong DevOps/SRE team, ready to self-manage clusters
  • Need multiple protocols (AMQP, MQTT, STOMP) on the same broker

Choose Amazon SQS when:

  • AWS-native architecture — Lambda, ECS, EventBridge integration
  • Small team, no desire to manage infrastructure
  • Spiky workloads — need auto-scale from 0 to millions of msg/s
  • Simple queue semantics are enough — no complex routing required
  • Budget-sensitive — 1M msg/month free tier is very generous

Choose Azure Service Bus when:

  • Enterprise requirements — ACID transactions, ordered sessions
  • Azure-native architecture — Functions, Logic Apps, Event Grid
  • Complex server-side filtering (SQL-like filters on subscriptions)
  • Workflow processing — each entity needs guaranteed ordering (Sessions)
  • Compliance requirements — Azure private endpoints, VNET integration

12. Conclusion

There is no "best" message queue — only the one that fits best in your context. Three factors drive the decision:

  1. Cloud platform: If you're all-in on AWS or Azure, using the native service (SQS or Service Bus) drastically reduces ops cost and integration effort. Cross-cloud? RabbitMQ.
  2. Complexity requirements: Simple async decoupling → SQS. Complex routing/priority → RabbitMQ. Enterprise transactions/sessions → Service Bus.
  3. Team capability: No dedicated DevOps? A managed service (SQS, Service Bus) is always better than self-hosting RabbitMQ, even though RabbitMQ "looks" better on paper.

And remember: with MassTransit on .NET 10, you can start with SQS Free Tier and migrate to RabbitMQ or Service Bus when requirements change — just swap the configuration, no need to rewrite business logic.

Action Steps

1. Identify your team's primary cloud platform → narrow the options
2. List 3-5 concrete use cases (order processing, notifications, event streaming...)
3. Prototype with MassTransit — try all 3 transports on local/free tier
4. Benchmark with your actual workload — don't trust someone else's benchmarks
5. Calculate TCO (Total Cost of Ownership) including ops costs, not just service price

References