Bird
Raised Fist0
Microservicessystem_design~20 mins

Message brokers (Kafka, RabbitMQ) in Microservices - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
Message Broker Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
2:00remaining
Understanding Message Broker Roles

Which of the following best describes the primary role of a message broker like Kafka or RabbitMQ in a microservices architecture?

AIt facilitates asynchronous communication by routing messages between services.
BIt directly processes user requests and returns responses synchronously.
CIt stores large files and serves them to clients on demand.
DIt manages database transactions and ensures ACID compliance.
Attempts:
2 left
💡 Hint

Think about how services talk to each other without waiting for immediate replies.

Architecture
intermediate
2:30remaining
Choosing Between Kafka and RabbitMQ

You need to design a system that processes a high volume of streaming data with strict ordering guarantees. Which message broker is more suitable and why?

AKafka, because it is optimized for high-throughput, ordered, and durable event streaming.
BKafka, because it uses push-based delivery to consumers for low latency.
CRabbitMQ, because it stores messages on disk for long-term archival.
DRabbitMQ, because it supports complex routing and flexible message patterns.
Attempts:
2 left
💡 Hint

Consider which broker is designed for streaming large volumes of ordered data efficiently.

scaling
advanced
3:00remaining
Scaling Message Brokers for High Availability

Which approach best ensures high availability and fault tolerance in a Kafka cluster?

AUse RabbitMQ instead because Kafka cannot replicate data.
BUse multiple Kafka brokers with replication factor greater than one for each partition.
CDeploy a single Kafka broker with multiple partitions on one server.
DDisable replication and rely on client retries to handle failures.
Attempts:
2 left
💡 Hint

Think about how Kafka keeps copies of data to survive broker failures.

tradeoff
advanced
3:00remaining
Tradeoffs Between Push and Pull Messaging Models

RabbitMQ uses a push model to deliver messages to consumers, while Kafka uses a pull model. What is a key tradeoff of the pull model used by Kafka?

APull model reduces consumer control over message flow, causing overload.
BPull model increases latency because consumers must request messages actively.
CPull model allows consumers to control consumption rate, improving backpressure handling.
DPull model requires brokers to maintain consumer state, increasing complexity.
Attempts:
2 left
💡 Hint

Consider how consumers manage message flow and avoid being overwhelmed.

estimation
expert
4:00remaining
Estimating Kafka Cluster Capacity

You expect to handle 30,000 messages per second, each 1 KB in size, with a replication factor of 3 and retention of 7 days. Approximately how much storage capacity (in TB) should your Kafka cluster have to store all replicas?

AAbout 18 TB
BAbout 1.8 TB
CAbout 378 TB
DAbout 54 TB
Attempts:
2 left
💡 Hint

Calculate total data per day, multiply by retention days and replication factor, then convert to TB.

Practice

(1/5)
1. What is the primary role of a message broker like Kafka or RabbitMQ in a microservices architecture?
easy
A. To store large amounts of user data permanently
B. To enable services to communicate asynchronously by passing messages
C. To replace the database in microservices
D. To directly execute business logic in services

Solution

  1. Step 1: Understand message broker function

    Message brokers act as middlemen that help services send and receive messages without waiting for each other.
  2. Step 2: Identify correct role in microservices

    They enable asynchronous communication, improving scalability and fault tolerance.
  3. Final Answer:

    To enable services to communicate asynchronously by passing messages -> Option B
  4. Quick Check:

    Message broker = asynchronous communication [OK]
Hint: Message brokers pass messages between services asynchronously [OK]
Common Mistakes:
  • Confusing brokers with databases
  • Thinking brokers execute business logic
  • Assuming brokers store permanent user data
2. Which of the following is the correct way to declare a RabbitMQ queue in code?
easy
A. channel.queueDeclare('task_queue', true, false, false, null);
B. channel.createQueue('task_queue', durable=true);
C. queue.declare('task_queue', persistent=True);
D. rabbitmq.queue('task_queue', durable=True);

Solution

  1. Step 1: Recall RabbitMQ queue declaration syntax

    In RabbitMQ Java client, channel.queueDeclare is used with parameters: queue name, durable, exclusive, autoDelete, and arguments.
  2. Step 2: Match correct syntax

    channel.queueDeclare('task_queue', true, false, false, null); matches the official method signature and parameter order correctly.
  3. Final Answer:

    channel.queueDeclare('task_queue', true, false, false, null); -> Option A
  4. Quick Check:

    RabbitMQ queueDeclare syntax = channel.queueDeclare('task_queue', true, false, false, null); [OK]
Hint: Remember RabbitMQ uses channel.queueDeclare with 5 parameters [OK]
Common Mistakes:
  • Using incorrect method names like createQueue
  • Passing parameters with wrong names or order
  • Confusing RabbitMQ syntax with other brokers
3. Given the following Kafka consumer code snippet, what will be the output if the topic has 3 messages and auto-commit is enabled?
consumer.subscribe(['orders'])
for message in consumer.poll(timeout_ms=1000).values():
    print(message.value.decode('utf-8'))
medium
A. Prints nothing because poll returns a dict of lists
B. Prints only the first message and stops
C. Prints all 3 messages from the 'orders' topic
D. Raises an error due to wrong method usage

Solution

  1. Step 1: Analyze Kafka consumer.poll() return type

    The poll() method returns a dictionary where keys are partitions and values are lists of messages.
  2. Step 2: Understand iteration over poll().values()

    Iterating over values() gives lists of messages, not individual messages, so calling message.value will cause an error because message is a list, not a message object.
  3. Final Answer:

    Raises an error due to wrong method usage -> Option D
  4. Quick Check:

    poll() returns dict of lists; iterating directly over values and accessing message.value causes error [OK]
Hint: poll() returns dict of lists, not single messages [OK]
Common Mistakes:
  • Assuming poll() returns a flat list of messages
  • Not decoding message values properly
  • Ignoring that poll() returns per-partition batches
4. A developer wrote this RabbitMQ consumer code but it never receives messages:
channel.basicConsume('task_queue', autoAck=False, callback=process_message)

What is the likely issue?
medium
A. The consumer must call channel.start_consuming() to begin receiving messages
B. The callback function name should be 'on_message' instead of 'process_message'
C. autoAck must be set to True for messages to be received
D. The queue name 'task_queue' is invalid and must be changed

Solution

  1. Step 1: Understand RabbitMQ consumer lifecycle

    After setting up basicConsume, the consumer must start the event loop with channel.start_consuming() to receive messages.
  2. Step 2: Identify missing call

    The code lacks start_consuming(), so no messages are delivered.
  3. Final Answer:

    The consumer must call channel.start_consuming() to begin receiving messages -> Option A
  4. Quick Check:

    Missing start_consuming() = The consumer must call channel.start_consuming() to begin receiving messages [OK]
Hint: Remember to call start_consuming() after basicConsume [OK]
Common Mistakes:
  • Thinking callback function name must be fixed
  • Believing autoAck controls message receipt
  • Assuming queue name is invalid without evidence
5. You need to design a scalable order processing system using Kafka. Which approach best ensures message order per customer while allowing parallel processing across customers?
hard
A. Use a single Kafka partition for all orders to keep global order
B. Use multiple topics, one per customer, to isolate order streams
C. Partition messages by customer ID so each customer's orders stay ordered in their partition
D. Send all orders to a single consumer instance to maintain order

Solution

  1. Step 1: Understand Kafka partitioning and ordering

    Kafka guarantees order only within a partition, so to keep order per customer, messages must be partitioned by customer ID.
  2. Step 2: Evaluate options for scalability and ordering

    Partitioning by customer ID allows parallel processing across partitions (customers) while preserving order per customer.
  3. Final Answer:

    Partition messages by customer ID so each customer's orders stay ordered in their partition -> Option C
  4. Quick Check:

    Partition by key for order + parallelism = Partition messages by customer ID so each customer's orders stay ordered in their partition [OK]
Hint: Partition by customer ID to keep order and scale processing [OK]
Common Mistakes:
  • Using single partition limits scalability
  • Creating many topics adds unnecessary complexity
  • Using single consumer blocks parallelism