Skip to main content

Command Palette

Search for a command to run...

Day 12: Message Queues & Event-Driven Architectures (Kafka, RabbitMQ)

Published
3 min read

Hello guys, we know modern distributed systems rarely run as one giant monolith anymore. They are broken into services like payment service, user service, notification service, etc.

But this creates a problem:
How do these services talk to each other reliably without becoming tightly coupled?

That’s where Message Queues & Event-Driven Architectures (EDA) come in.

🔹 What is a Message Queue?

A Message Queue is a buffer that stores messages between services.

  • A Producer pushes messages into the queue.

  • A Consumer pulls messages out of the queue and processes them.

This decouples the sender and receiver:

  • Sender doesn’t care if the receiver is online right now.

  • Receiver can process at its own pace.

  • System becomes more fault-tolerant.

📌 Example:
When you order on Swiggy/Zomato:

  • Order service → sends “new order placed” message.

  • Payment service, Restaurant service, Delivery service → consume it independently.


🔹 Event-Driven Architecture (EDA)

EDA extends the idea of queues into a publish-subscribe model.

  • Instead of one-to-one, we move to one-to-many communication.

  • An Event Broker (Kafka, RabbitMQ, etc.) delivers events to multiple consumers.

📌 Example:
Event: “User Registered”

  • Send a welcome email

  • Create a user profile entry

  • Push onboarding tasks

  • Trigger analytics pipeline

All react to the same event → loosely coupled and scalable.


🔹 Kafka vs RabbitMQ

Both are popular, but they solve slightly different problems.

FeatureKafkaRabbitMQ
ModelDistributed event streaming platformTraditional message broker
Use CaseReal-time data pipelines, event sourcing, logs, analyticsTask queues, background jobs, request/response messaging
Message RetentionKeeps messages for a configurable time (replay possible)Messages removed once consumed (unless requeued)
ThroughputExtremely high (millions/sec)Moderate
OrderingPreserved within a partitionPreserved in a queue
ScalabilityBuilt for distributed scaleVertical scale or cluster mode

🔹 System Design: Why Use Queues?

Let’s look at how a queue fits into real-world architectures.

✅ Benefits:

  • Loose coupling between services

  • Failure isolation (if one service is down, others still work)

  • Scalability (multiple consumers can process in parallel)

  • Replayability (especially with Kafka)


🔹 Challenges & Tradeoffs

Like everything in system design, queues come with tradeoffs:

  • At-Least-Once Delivery → risk of duplicates, need idempotency

  • Ordering Guarantees → easy in a single queue, hard in distributed partitions

  • Latency → adds small delay (vs direct synchronous call)

  • Operational Complexity → need to manage brokers, partitions, offsets


🔹 When to Use What?

  • Use RabbitMQ for:

    • Background jobs (e.g., send email, resize image)

    • Work distribution among workers

    • Request-response async patterns

  • Use Kafka for:

    • Real-time data pipelines (e.g., streaming analytics, monitoring)

    • Event sourcing & audit logs

    • Microservice event backbone (all services publish/subscribe)


🚀 Key Takeaways

  • Message Queues decouple services and add reliability.

  • Event-Driven Architecture enables reactive, loosely coupled systems.

  • RabbitMQ is great for traditional queuing, Kafka shines for real-time event streaming.

  • Both require thinking about delivery semantics, retries, and scalability.

Let’s meet again tomorrow👋👋

More from this blog

Node & Beyond

14 posts

Not just a blog. Definitely not clean code. Just me stumbling, learning, and sometimes celebrating small wins with Node.js and backend systems.