안녕하세요 F4팀의 혁잔디입니다. Apache Kafka를 활용한 프로젝트를 기획하면서 Apache Kakfa에 대해 제가 이해한 점을 정리하고 공유하기 위해 글을 작성합니다. 부족한 부분이 있으면 말씀해주셔요😊

Apache Kafka

Apache Kafka는 웹사이트, 어플리케이션, 센서 등에 취합한 데이터를 스트림 파이프라인을 통해 실시간으로 관리하고 보내기 위한 분산 스트리밍 플랫폼입니다. 데이터를 생성하는 어플리케이션과 데이터를 소비하는 어플리케이션 간의 중재자 역할을 함으로써 데이터의 전송 제어, 처리, 관리 역할을 합니다. 카프카 시스템은 여러 요소(노드)와 함께 구성될 수 있어 카프카 클러스터 라고 하기도 하는데 다른 메시징 시스템과 마찬가지로 어플리케이션과 서버 간의 비동기 데이터 교환을 용이하게 하고, 하루에 수 조개의 이벤트 처리가 가능하게 하는 역할을 합니다.
즉, 카프카는 플랫폼에 서비스를 연결하여 다양한 서비스에서 나오는 데이터 흐름을 실시간으로 제어하는 서비스의 중추역할을 하는 플랫폼입니다.

Kafka의 주요 기능

  1. 애플리케이션에서 데이터 또는 이벤트 스트림을 게시하거나 구독할 수 있게 합니다.
  2. 장애가 발생하더라도 안전하고 안정적인 방식으로 정확하게 레코드를 저장합니다.
  3. 레코드를 순서대로 실시간 처리합니다.

EventDriven이란?

image 출처 : https://m.blog.naver.com/arkdata/222632637775

Event Driven Architecture란 이벤트의 생산, 갑지, 소비 및 반응 또는 시스템 상태의 중대한 변화를 지원하는 소프트웨어 모델 또는 아키텍처의 패러다임이다. 분산 아키텍처 환경에서 이벤트를 생성하고 발행된 이벤트를 수신자에게 전송하는 구조로 수신자는 그 이벤트를 처리하는 방식으로, 상호 간 결합도를 낮추기 위해 비동기 방식으로 메시지를 전달하는 패턴이다.

Kafka의 기본 구성 요소

image 출처 : https://jyeonth.tistory.com/30

  1. Cluster : 여러 대의 컴퓨터들이 연결되어 하나의 시스템처럼 동작하는 컴퓨터들의 집합
  2. Producer : 데이터를 만들어내어 전달하는 전달자의 역할
  3. Consumer : 프로듀서에서 전달한 데이터를 브로커에 요청하여 메시지를 소비하는 역할
  4. Broker : 생산자와 소비자와의 중재자 역할을 하는 역할
  5. Topic : 보내는 메시지를 구분하기 위한 카테고리화
  6. Partition : 토픽을 구성하는 데이터 저장소로서 수평확장이 가능한 형태

Producer는 Topic에 메세지를 보내고, 하나의 Topic은 한 개 이상의 Partition으로 나눠진다. Partition은 Topic을 분할한 단위이며 Partition이 여러 개일 경우 Producer가 보낸 메세지의 순서는 보장할 수 없지만 Partition 안에서의 메세지는 순서가 보장된다.



이해를 위한 단순 예제

WebBrowser -> Controller(producer) -> Consumer 순으로 동작

spring:
  kafka:
    bootstrap-servers:
    - localhost:9092
    consumer:
      group-id: testconsume
      auto-offset-reset: earliest
      key-deserializer:
        org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer:
        org.apache.kafka.common.serialization.StringDeserializer
    producer:
      bootstrap-servers:
      - localhost:9092

application.yml


@RestController
@RequestMapping(value = "/test")
@RequiredArgsConstructor
public class TestController {

	private final KafkaTemplate<String, String> kafkaTemplate;

	private static String TOPIC_NAME = "test";

	@PostMapping
	public String sendMessage() {
		String messageData = "이거 돌아가는거 맞는건가";
		kafkaTemplate.send(TOPIC_NAME, messageData);
		return "성공이라고요";
	}
}

Postman을 통해 /test url에 요청을 보내면 KafkaTemplate를 통해 test라는 토픽에 이벤트를 발행합니다.


@Service
public class TestConsumer {
	@KafkaListener(topics = "test")
    public void messageListener(ConsumerRecord<String, String> record) {
        log.info("### record: " + record.toString());
        log.info("### topic: " + record.topic() + ", value: " + record.value() + ", offset: " + record.offset());
	}
}

test라는 Topic을 구독하고 있던 Consumer에서 데이터를 받고 출력합니다.



정리 😵

단순하게 생각해서 Producer에서 이벤트를 발행하면 Consumer에서 데이터 받아서 자기 할 일 한다고 생각하면 될 것 같습니다.
예제가 간단해서 Kafka의 필요성을 잘 느끼시지 못할 것 같은데 제가 생각한 Kafka의 장점은

  1. 여러 서비스가 얽혀있는 복잡한 시스템에서 한 번의 이벤트 발행으로 여러 서비스를 실행시킬 수 있다.
  2. 처리 속도가 빠르다.
  3. 일관된 결과를 가져올 수 있다.
  4. 처리 순서를 안정적으로 유지할 수 있다.

더 많은 장점을 갖고 있겠지만 굉장히 복잡하다는 단점도 있을거라고 생각됩니다. 하지만 데이터를 빠르게 처리해야 하는 상황이라면 Kafka 사용을 고려하는 것이 좋을 것 같습니다.😁