kafka

2024. 8. 4. 22:40Back-End

Kafka란?

Apache Kafka는 고성능, 내구성, 그리고 확장 가능한 분산 스트리밍 플랫폼이다. Kafka는 데이터 파이프라인을 구축하고 실시간 데이터 스트리밍을 처리하는 데 매우 적합하다.

  • 프로듀서(Producer): 메시지를 생성하여 Kafka 토픽으로 전송하는 역할을 한다.
  • 컨슈머(Consumer): Kafka 토픽에서 메시지를 읽어오는 역할을 한다.
  • 브로커(Broker): Kafka 서버로, 토픽과 메시지를 저장하고 관리한다.
  • 토픽(Topic): 메시지가 게시되는 논리적 채널이다.

Kafka는 다음과 같은 경우에 많이 사용된다:

  • 실시간 데이터 처리: 실시간 로그, 이벤트 스트리밍 처리
  • 데이터 파이프라인: 서로 다른 시스템 간의 데이터 전송
  • 분산 시스템: 여러 마이크로서비스 간의 메시지 교환
  • 데이터 통합: 다양한 데이터 소스를 통합하여 분석 및 모니터링

Kafka의 주요 특징

  1. 분산 시스템: Kafka는 분산형 구조로 설계되어 있어, 여러 서버(브로커)에서 데이터를 저장하고 처리할 수 있다. 이로 인해 높은 가용성과 확장성을 제공한다.
  2. 높은 처리량: Kafka는 대규모 데이터 스트리밍을 처리할 수 있는 높은 처리량을 자랑한다. 이를 통해 초당 수백만 개의 메시지를 처리할 수 있다.
  3. 내구성: Kafka는 데이터를 복제하여 여러 브로커에 저장하므로, 서버 장애가 발생해도 데이터가 손실되지 않는다. 데이터의 내구성을 보장한다.
  4. 실시간 데이터 처리: Kafka는 실시간 데이터 처리를 지원하여, 데이터가 생성되는 즉시 소비자에게 전달할 수 있다.
  5. 확장성: Kafka는 새로운 브로커를 추가하여 수평적으로 확장할 수 있다. 이를 통해 데이터 처리 용량을 쉽게 늘릴 수 있다.
  6. 높은 가용성: Kafka 클러스터는 데이터의 복제와 자동 복구 기능을 통해 높은 가용성을 제공한다.

Kafka를 사용하는 이유

  1. 실시간 데이터 스트리밍: 실시간으로 생성되는 데이터를 처리하고 전송할 때 유용하다. 예를 들어, 로그 수집, 트랜잭션 모니터링, 사용자 활동 추적 등에 적합하다.
  2. 대량의 데이터 처리: 대규모 데이터 처리가 필요한 시스템에서 Kafka는 높은 처리량과 낮은 지연 시간을 제공하여, 대량의 데이터를 효율적으로 관리할 수 있다.
  3. 데이터 파이프라인 구축: 다양한 데이터 소스에서 데이터를 수집하고 처리하여 다른 시스템으로 전달하는 데이터 파이프라인을 구축할 때 사용된다. 예를 들어, 데이터 웨어하우스나 분석 시스템으로의 데이터 전송에 활용된다.
  4. 내구성 및 안정성: 데이터가 손실되지 않고 안정적으로 저장되며, 브로커 간의 데이터 복제를 통해 장애 발생 시에도 데이터가 보호된다.
  5. 데이터 통합: 다양한 시스템과 애플리케이션 간의 데이터 통합을 지원한다. Kafka는 다양한 데이터 소스와 소비자 간의 데이터 흐름을 중재할 수 있다.
  6. 확장성: 시스템이 성장함에 따라 처리 용량을 쉽게 확장할 수 있다. Kafka 클러스터에 브로커를 추가하여 수평적으로 확장할 수 있다.

Kafka의 사용 사례

  • 로그 및 이벤트 수집: 서버 로그, 애플리케이션 로그, 사용자 이벤트 등을 실시간으로 수집하고 분석하는 데 사용된다.
  • 모니터링 및 경고: 시스템 성능과 상태를 모니터링하고 이상 징후를 감지하여 경고를 생성하는 데 유용하다.
  • 데이터 파이프라인: 데이터 웨어하우스, 데이터 레이크 등으로 데이터를 전송하는 파이프라인을 구축할 때 사용된다.
  • 실시간 분석: 실시간으로 데이터 분석을 수행하여 인사이트를 얻는 데 활용된다.

Docker로 Kafka 설정

Docker를 사용하면 Kafka를 쉽게 설정하고 실행할 수 있다. Docker Compose 파일을 작성하여 Kafka와 Zookeeper를 설정한다.

이 파일을 통해 Zookeeper와 Kafka 브로커를 Docker 컨테이너로 실행할 수 있다.

 

 

그렇다면 Zookeeper와 브로커는 뭘까??

Kafka의 주요 구성 요소

1. Zookeeper

Zookeeper는 분산 애플리케이션을 위한 중앙 집중형 서비스로, 구성 정보, 네이밍, 동기화, 그룹 서비스를 제공한다. Kafka는 Zookeeper를 사용하여 브로커와 클러스터 메타데이터를 관리하고, 브로커 간의 협업을 돕는다. Zookeeper는 클러스터의 상태를 유지하고, 새로운 브로커가 추가되거나 실패한 브로커를 감지하여 이를 다른 브로커에 통지하는 역할을 한다.

 

2. 브로커(Broker)

브로커는 Kafka 서버를 의미하며, 메시지를 저장하고 관리하는 역할을 한다. 브로커는 여러 개의 토픽을 호스팅하며, 각각의 토픽은 여러 개의 파티션으로 나뉘어진다. 브로커는 각 파티션의 리더와 팔로워를 관리하며, 메시지의 복제와 분산 처리를 수행한다. 클러스터 내의 브로커들은 서로 협력하여 고가용성과 내구성을 제공한다.

Spring Boot에서의 kafka는?

Kafka 프로듀서 작성

Kafka 프로듀서는 메시지를 생성하여 Kafka 토픽으로 전송하는 역할을 한다. Spring Boot에서 Kafka 프로듀서를 작성하려면 KafkaTemplate을 사용하면 된다.

 

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class KafkaProducer {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    private static final String TOPIC = "test_topic";

    @GetMapping("/send")
    public String sendMessage(@RequestParam("message") String message) {
        kafkaTemplate.send(TOPIC, message);
        return "Message sent to Kafka topic";
    }
}
 
Kafka 컨슈머 작성

Kafka 컨슈머는 Kafka 토픽에서 메시지를 읽어오는 역할을 한다. Spring Boot에서 Kafka 컨슈머를 작성하려면 @KafkaListener를 사용하면 된다.

 
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumer {

    @KafkaListener(topics = "test_topic", groupId = "group_id")
    public void consume(String message) {
        System.out.println("Consumed message: " + message);
    }
}

 

클라이언트가 브라우저에서 "http://localhost:8080/send?message=HelloKafka"를 접속하면 "HelloKafka" 메시지가 Kafka 토픽에 전송된다. 컨슈머가 이 메시지를 읽어 콘솔에 출력하는 것을 확인할 수 있다.

Consumed message: HelloKafka