[java] 자바로 카프카에서 발생하는 고가용성 처리하기

카프카(Kafka)는 대용량 실시간 데이터 스트리밍을 위한 분산 메시지 큐로 널리 사용되는 오픈 소스 플랫폼입니다. 하지만 카프카 클러스터의 고장이나 네트워크 문제 등에 의해 메시지 손실이 발생할 수 있습니다. 이러한 상황에 대비하여 카프카에서는 고가용성을 제공하기 위한 다양한 기능을 제공합니다. 이번 블로그에서는 자바로 카프카에서 발생하는 고가용성을 처리하는 방법에 대해 알아보겠습니다.

1. 복제(Replication)

카프카에서 복제는 고가용성을 제공하는 중요한 개념입니다. 복제는 메시지를 여러 개의 브로커(broker)에 복제하여 해당 브로커에 장애가 발생해도 메시지를 손실하지 않고 처리할 수 있도록 합니다. 카프카의 복제 기능은 자바로 구현할 수 있으며, kafka.javaapi.producer.Producer 클래스와 kafka.javaapi.consumer.SimpleConsumer 클래스를 사용하여 구현할 수 있습니다.

2. ISR(In-Sync Replicas)

ISR은 복제된 파티션 중에서 카프카 브로커들이 동기적으로 복제를 수행하는 브로커들의 집합입니다. ISR은 메시지의 안정성을 보장하기 위해 사용되는 개념으로, 메시지를 복제한 후에만 응답을 보내는 방식으로 동작합니다. 자바로 ISR을 설정하기 위해서는 kafka.admin.AdminUtils 클래스를 사용하여 파티션의 ISR 목록을 지정할 수 있습니다.

3. 프로듀서 레코드 ACK 설정

카프카 프로듀서는 메시지 손실을 최소화하기 위해 ACK(Acknowledgement) 설정을 제공합니다. ACK 설정은 프로듀서가 메시지를 브로커로 전송한 후, 브로커로부터 ACK를 수신할 때까지 대기하는 시간을 의미합니다. ACK 설정을 통해 메시지가 정상적으로 브로커에 도달했는지를 확인할 수 있으며, 자바에서는 ProducerConfig 클래스의 acks 속성을 설정하여 ACK 모드를 지정할 수 있습니다.

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

Producer<String, String> producer = new KafkaProducer<>(props);

ProducerRecord<String, String> record = new ProducerRecord<>("my_topic", "key", "value");

producer.send(record);

4. 컨슈머 실패 처리

카프카 컨슈머는 처리하는 도중에 장애가 발생할 수 있습니다. 이러한 경우에 대비하여 자바에서는 kafka.consumer.ConsumerRebalanceListener 인터페이스를 구현하여 컨슈머 장애 시에 대한 처리를 할 수 있습니다. 예를 들어, 컨슈머가 장애로 종료되었을 때 장애가 발생한 컨슈머의 파티션을 다른 컨슈머에게 재할당할 수 있습니다.

참고 자료

  1. Apache Kafka Documentation - https://kafka.apache.org/documentation/
  2. Kafka in Action - 강경식,박준영,신범석,이재진 지음, 2016, 비제이퍼블릭

이상으로 자바로 카프카에서 발생하는 고가용성 처리 방법에 대해 알아보았습니다. 고가용성을 제공하는 것은 카프카 환경에서 중요한 요소이므로, 이를 적절히 처리하여 안정적인 실시간 데이터 처리를 할 수 있도록 해야합니다.