0
0
Kafkadevops~20 mins

At-most-once delivery in Kafka - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Kafka At-most-once Delivery Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
🧠 Conceptual
intermediate
1:30remaining
Understanding At-most-once Delivery in Kafka

Which statement best describes at-most-once delivery semantics in Kafka?

AMessages are delivered only if the consumer commits offsets manually.
BMessages are guaranteed to be delivered at least once, possibly multiple times.
CMessages are delivered exactly once, with no duplicates.
DMessages are delivered zero or one time, with no retries on failure.
Attempts:
2 left
💡 Hint

Think about what happens if a message fails to be processed or acknowledged.

Predict Output
intermediate
1:30remaining
Output of Kafka Producer with At-most-once Settings

Given the following Kafka producer configuration snippet, what is the expected delivery guarantee?

props.put("enable.idempotence", "false");
props.put("acks", "0");
props.put("retries", 0);

What is the expected behavior?

AMessages are retried until acknowledged; at-least-once delivery.
BMessages may be lost but will not be duplicated; at-most-once delivery.
CMessages are delivered exactly once with no duplicates.
DMessages are only sent after manual commit.
Attempts:
2 left
💡 Hint

Consider what disabling idempotence and setting acks to 0 means.

Predict Output
advanced
2:00remaining
Kafka Consumer Offset Behavior with At-most-once Delivery

Consider this Kafka consumer code snippet:

consumer.subscribe(List.of("topic"));
while (true) {
  var records = consumer.poll(Duration.ofMillis(100));
  for (var record : records) {
    System.out.println(record.value());
  }
  consumer.commitSync();
}

If the commitSync() call is moved before processing the records, what delivery guarantee does this provide?

AExactly-once delivery, because commitSync ensures atomicity.
BAt-least-once delivery, because offsets are committed after processing.
CAt-most-once delivery, because offsets are committed before processing.
DNo delivery guarantee, because commitSync is not used.
Attempts:
2 left
💡 Hint

Think about what happens if the consumer crashes after committing but before processing.

🔧 Debug
advanced
2:00remaining
Identify the Error in At-most-once Kafka Producer Code

What error will this Kafka producer code cause?

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("acks", "0");
props.put("enable.idempotence", "true");
props.put("retries", 0);
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
producer.send(new ProducerRecord<>("topic", "key", "value"));
producer.close();
AIllegalArgumentException because idempotence requires retries > 0.
BNo error; code runs with at-most-once delivery.
CTimeoutException because acks=0 disables idempotence.
DNullPointerException due to missing serializers.
Attempts:
2 left
💡 Hint

Check Kafka producer configuration rules for idempotence.

🚀 Application
expert
2:30remaining
Designing At-most-once Delivery with Kafka Consumer

You want to implement a Kafka consumer that guarantees at-most-once delivery. Which of the following code snippets correctly implements this behavior?

A
consumer.subscribe(List.of("topic"));
while (true) {
  var records = consumer.poll(Duration.ofMillis(100));
  consumer.commitSync();
  for (var record : records) {
    process(record.value());
  }
}
B
consumer.subscribe(List.of("topic"));
while (true) {
  var records = consumer.poll(Duration.ofMillis(100));
  for (var record : records) {
    process(record.value());
  }
  consumer.commitSync();
}
C
consumer.subscribe(List.of("topic"));
while (true) {
  var records = consumer.poll(Duration.ofMillis(100));
  for (var record : records) {
    process(record.value());
    consumer.commitSync();
  }
}
D
consumer.subscribe(List.of("topic"));
while (true) {
  var records = consumer.poll(Duration.ofMillis(100));
  for (var record : records) {
    process(record.value());
  }
  consumer.commitAsync();
}
Attempts:
2 left
💡 Hint

Remember that committing offsets before processing leads to at-most-once delivery.