반응형

kafka-topics.sh

// 토픽 목록 조회
kafka-topics.sh --bootstrap-server <broker-address> --list

// 토픽 생성 (생성 시 파티션 사이즈 및 레플리카 개수 지정)
kafka-topics.sh --bootstrap-server <broker-address> --create --topic <topic-name> --partitions <size> --replication-factor <size>

// 토픽 정보 조회
kafka-topics.sh --bootstrap-server <broker-address> --describe --topic <topic-name>

// 토픽 삭제
kafka-topics.sh --bootstrap-server <broker-address> --delete --topic <topic-name>

 

kafka-console-producer.sh

// 메시지 발행
kafka-console-producer.sh --bootstrap-server <broker-address> --topic <topic-name>

 

kafka-console-consumer.sh

// 메시지 소비 (--from-beginning는 메시지를 처음부터 읽음, 없으면 최신 메시지 부터 읽음)
kafka-console-consumer.sh --bootstrap-server <broker-address> --topic <topic-name> --from-beginning

 

kafka-consumer-groups.sh

// 컨슈머 그룹 목록 조회
kafka-consumer-groups.sh --bootstrap-server <broker-address> --list

// 특정 그룹 상태 확인
kafka-consumer-groups.sh --bootstrap-server <broker-address> --describe --group <group-name>

// 컨슈머 그룹이 구독하는 모든 토픽에 대해 오프셋 리셋(처음부터 다시 읽기)
kafka-consumer-groups.sh --bootstrap-server <broker-address> --gruop <group-name> --reset-offsets --to-earliest --all-topics --execute
반응형

'공부 > Kafka' 카테고리의 다른 글

[Kafka] Topic, Partition, Producer, Consumer  (0) 2025.08.29
[Kafka] Zookeeper와 Broker  (0) 2025.06.29
[Kafka] Kafka의 특징  (0) 2021.06.13
[Kafka: 카프카] Kafka란?  (0) 2021.06.07
반응형

Topic

  • Topic은 카프카에서 메시지를 분류하는 논리적 단위이다
  • Producer와 Consumer는 Topic을 기준으로 메시지를 전송하거나 메시지를 읽는다
  • 토픽은 여러 파티션에 걸쳐서 나누어 분산 저장 된다
  • 파티션들의 집합

Partition

  • Kafka에서 실제로 메시지를 저장 하는 공간으로 브로커 내에 존재
  • 각 파티션 내에서는 데이터의 순서가 보장된다
  • 파티션 수를 늘리면 처리량을 늘릴 수 있다(스케일 아웃)

Producer

Producer는 Kafka 클러스터에 데이터를 보내는 클라이언트로 메시지를 발행하는 역할을 한다

  • 메시지 발행
  • 파티션 선택(키를 통해 특정 파티션으로 메시지를 발행할 수 있다, 키 없으면 RoundRobin)
  • 데이터 직렬화
  • 전송 확인 및 재시도 acks
  • 0 : 전송 확인 안함(빠름)
  • 1 : 리더 브로커 저장 확인 후 응답
  • all or -1 : ISR(In-Sync Replicas) 에도 모두 저장이 된 후 응답(상대적으로 느림, 안전성 높음)

Consumer

Producer에 의해 발행된 메시지를 구독하며 메시지를 가져와 처리하는 클라이언트로 메시지를 소비 하는 역할을 한다

  • Topic 구독 및 메시지 처리
  • 하나 이상의 Topic을 구독하여 Topic에 저장된 메시지를 읽고 처리한다
  • 오프셋 관리
  • 자신이 읽은 메시지의 위치를 관리하며 이를 통해 재시작 시 해당 위치부터 이어서 읽어 처리할 수 있다

Consumer Group

Consumer Group은 하나 이상의 Consumer 들이 모여 Topic의 메시지를 읽고 처리하는 논리적 집합 이다

  • Consumer는 Consumer Group에 속해야 한다(단독도 가능하지만 확장성이 떨어진다)
  • Consumer Group을 통해 확장성을 확보할 수 있다(Scale Out)
  • Consumer Group 내 특정 파티션이 문제가 생겼을 때 다른 Consumer가 이를 받아 처리함으로 서 내결함성을 가진다

 

★ 중요

Consumer Group B (파티션의 수가 Consumer의 수 보다 많은 경우)

  • 하나의 Topic 내에 리더 파티션이 3개가 있는 Topic을 Consumer를 2개 가지고 있는 Consumer Group이 구독 하고 있는 상태 이다
  • Consumer Group 내 Consumer의 수 가 파티션 수 보다 적으면 하나의 Consumer가 다 수의 파티션의 이 할당되게 된다
  • 이론적으로 Consumer에 할당될 수 있는 파티션의 수에는 제약이 없으나 Consumer의 리소스적 한계가 있기 때문에 Consumer의 수를 적절하게 조절해야 한다

Consumer Group C (파티션의 수 보다 Consumer의 수가 더 많은 경우)

  • 하나의 Topic 내에 리더 파티션이 3개가 있는 Topic을 Consumer를 4개 가지고 있는 Consumer Group이 구독하고 있는 상태 이다
  • Consumer Group 내 Consumer의 수 가 파티션의 수 보다 많은 경우 파티션의 개수 만큼만 Consumer에 파티션이 할당되고 남은 Consumer는 대기 상태로 파티션이 할당되지 않고 메시지 소비도 일어나지 않는다
  • 할당 될 수 있는 Consumer의 수는 최대 파티션의 수 만큼만 할당 가능하다

 

Spring 적용 예제

주문, 결제의 경우 비동기 처리를 하는 경우가 있는데,

이런 경우에 카프카를 사용하는 경우가 많다

그러한 상황에 대한 간단한 예제로, 주문 발생 시 Kafka로 결제 event를 발행하고 결제 서비스가 이를 consume함으로써 결제가 이루어지는 경우에 대한 예제에 대한 일부 코드를 구성한 것이다

주문

YML

spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer

Controller

@RestController
@RequestMapping("/orders")
class OrderController(private val orderProducer: OrderProducer) {

    @PostMapping
    fun createOrder(@RequestBody order: OrderCreatedEvent): ResponseEntity<String> {
        orderProducer.sendOrder(order)
        return ResponseEntity.ok("${order.orderId} 주문 완료!")
    }
}

Producer

@Service
class OrderProducer(private val kafkaTemplate: KafkaTemplate<String, OrderCreatedEvent>) {
    fun sendOrder(order: OrderCreatedEvent) {
        kafkaTemplate.send("order-created", order.orderId, order)
    }
}

 

결제

Config

@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfig : WebSocketMessageBrokerConfigurer {
    override fun registerStompEndpoints(registry: StompEndpointRegistry) {
        registry.addEndpoint("/ws").setAllowedOriginPatterns("*").withSockJS()
    }

    override fun configureMessageBroker(registry: MessageBrokerRegistry) {
        registry.enableSimpleBroker("/topic")
    }
}

YML

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: payment-service
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring.json.trusted.packages: "*"
      auto-offset-reset: latest

Service

@Service
class PaymentProcessor(
    private val kafkaTemplate: KafkaTemplate<String, PaymentCompletedEvent>,
    private val messagingTemplate: SimpMessagingTemplate
) {
    @KafkaListener(topics = ["order-created"], groupId = "payment-service")
    fun handleOrderEvent(event: OrderCreatedEvent) {
    
        // business logic
        // PG 결제 등등
        
        val completed = PaymentCompletedEvent(
            orderId = event.orderId,
            success = true,
            transactionId = UUID.randomUUID().toString()
        )
        
        messagingTemplate.convertAndSend("/topic/payment/\\${completed.orderId}", completed)
    }
}
반응형

'공부 > Kafka' 카테고리의 다른 글

[Kafka] Kafka CLI  (0) 2025.08.29
[Kafka] Zookeeper와 Broker  (0) 2025.06.29
[Kafka] Kafka의 특징  (0) 2021.06.13
[Kafka: 카프카] Kafka란?  (0) 2021.06.07
반응형

Zookeeper

Zookeeper는 Broker들을 관리하는 역할을 한다

  • Broker 등록 / 상태 관리
  • 브로커의 상태를 감시
  • Controller 선출
  • 파티션 리더 선출 및 정보 관리
  • 클러스터 메타데이터 관리

주키퍼는 카프카에 종속되지 않은 별개의 시스템으로 브로커 관리를 위해 존재한다

Kafka 2.8 부터 이에 대한 의존성을 제거하고자 KRaft를 통해 이를 대처하려고 하고 있다

Broker

Broker는 메시지 저장 및 메시지 제공 등의 역할 수행하며 Producer/Consumer와 직접 통신하는 주체이다

  • 데이터 저장소
  • 메시지 수신 / 전달
  • 파티션 및 레플리카 관리
  • 파티션 리더 역할 수행
  • Controller 역할 수행

 

Kafka의 Broker들의 모음을 Kafka Cluster라고 한다

Zookeeper는 Kafka Cluster 내 Controller를 선출하는 역할, Broker들을 관리하는 역할을 하며 Broker들의 상태를 감시하고 브로커의 상태를 Controller에게 전달하여 Controller가 Failover를 할 수 있도록 한다

반응형

'공부 > Kafka' 카테고리의 다른 글

[Kafka] Kafka CLI  (0) 2025.08.29
[Kafka] Topic, Partition, Producer, Consumer  (0) 2025.08.29
[Kafka] Kafka의 특징  (0) 2021.06.13
[Kafka: 카프카] Kafka란?  (0) 2021.06.07
반응형

카프카의 특징

  • 디스크에 데이터 적재
  • 수평적으로 확장 가능
  • 대량의 데이터를 빠르게 처리
  • 실시간 데이터 스트리밍을 지원
  • 파티션 내 메시지 순서 보장

카프카는 메시지 큐로서 시스템 간 비동기적 데이터 처리를 위해 많이 사용이 된다

ex) 메시지 알림 센터, 배달 주문 접수 등

반응형

'공부 > Kafka' 카테고리의 다른 글

[Kafka] Kafka CLI  (0) 2025.08.29
[Kafka] Topic, Partition, Producer, Consumer  (0) 2025.08.29
[Kafka] Zookeeper와 Broker  (0) 2025.06.29
[Kafka: 카프카] Kafka란?  (0) 2021.06.07
반응형

Kafka는 pub-sub 구조를 가지는 큐이다.

 

Kafka는 프로듀서, 브로커, 컨슈머 이렇게 3개로 이루어져 있고,

프로듀서에서 메시지를 브로커에게 전달하면 전달된 메시지를 컨슈머가 브로커를 통해 가져와 처리하게 된다.

 

Kafka의 처리 흐름을 보면

 

 

 

프로듀서 -> 브로커 <- 컨슈머

로 브로커를 중심으로 프로듀서가 메시지를 브로커에 전달하고, 컨슈머가 브로커에게 가서 메시지를 받아와 처리하는 구조이다.

 

Kafka는 많은 장점을 가지고 있다.

그 중 두드러 지는 장점이 고성능, 고가용성, 확장성 이다.

Kafka는 일반적인 MQ 시스템에서 지원하는 기능들을 배제함으로서 message당 오버헤드를 줄이는 등을 통해 고성능을 확보했다고 한다.

 

 

Kafka는 정해진 시간 동안 브로커가 받은 메시지를 가지고 있기 때문에 컨슈머가 이슈로 정상 동작을 하지 않을 경우 다른 컨슈머가 브로커에 저장된 메시지를 가지고 이어서 작업할 수 있어 가용성이 높다.

 

그리고 Kafka의 브로커는 topic과 partition으로 이루어져있다. 하나의 토픽에 여러 파티션이 있을 수 있고 메시지는 파티션에 저장되게 된다. 브로커가 프로듀서로부터 많은 메시지를 받는 경우 필요시 파티션을 늘려 수신되는 메시지를 분산 시킬 수 있다. 이때 기본 설정은 RR로 동작하게 된다. 이렇게 늘린 파티션에 컨슈머를 추가로 배치하여 수평 확장을 할 수 있다.

 

 

Reference:

Kafka: a Distributed Messaging System for Log Processing (논문)

반응형

'공부 > Kafka' 카테고리의 다른 글

[Kafka] Kafka CLI  (0) 2025.08.29
[Kafka] Topic, Partition, Producer, Consumer  (0) 2025.08.29
[Kafka] Zookeeper와 Broker  (0) 2025.06.29
[Kafka] Kafka의 특징  (0) 2021.06.13

+ Recent posts