Kafka Streams Application with Spring Cloud - 1. 프로젝트 구성하기

라빈·2022년 8월 28일
0

Kafka Streams + Spring Cloud를 활용한 배달 데이터 처리 애플리케이션을 구성해봅니다 :)

가상의 배달 도메인을 구성하고 실시간 스트림을 이용하여 배달 데이터를 수신해 실시간 분석 기능을 갖는 애플리케이션을 구현합니다. 실시간 분석에 대한 주제는 도메인 구성 이후에 정의해보도록 하겠습니다.

참고하는 문서로는:

  • Kafka Streams in Action
  • Spring Cloud References

입니다.

프로젝트 버전

작성 기준 스프링 부트 최신 버전을 사용합니다. 제가 가장 익숙한 언어인 Java를 이용해서 작성합니다.

  • Spring Boot 2.7.3
  • Spring Cloud Version 2021.0.3
  • Spring cloud starter stream kafka 3.2.4
  • Gradle 7.5
  • Java 11

Spring Cloud 프로젝트는 사용하는 Spring Boot 버전에 맞춰서 설정해주어야 합니다. Spring Boot 1.5.x ~ 2.0.x 버전에 해당하는 Spring Cloud 버전은 더 이상 지원하지 않는다고 합니다.

코드는 아래 깃헙에서 확인해 보실 수 있습니다 :)

Spring Cloud

Spring Cloud 프로젝트는 분산 시스템의 일부 공통 패턴을 빠르게 구성할 수 있는 도구를 제공합니다. 분산 시스템을 만드는 과정에서 boiler plate 패턴이 발생하게 되고 Spring Cloud를 사용하면 개발자는 이런 중복 패턴을 빠르게 구성할 수 있습니다.
Spring Cloud가 제공하는 분산 시스템의 일반적인 패턴들은 아래와 같습니다:

  • Distributed/versioned configuration
  • Service registration and discovery
  • Routing
  • Service-to-service calls
  • Load balancing
  • Circuit Breakers
  • Global locks
  • Leadership election and cluster state
  • Distributed messaging

이번 예제 프로젝트에서 Spring Cloud가 제공하는 패턴 중 Distributed messaging을 활용하여 구성해보도록 하겠습니다.
분산 메시징에 대해서 간략하게 정리하면 다음과 같습니다. 분산 메시징은 안정적으로 메시지를 발행 / 구독하기 위해 메시지 큐를 사용합니다. 메시지는 클라이언트 애플리케이션과 메시징 시스템 사이에서 비동기적으로 이동합니다. 따라서 분산 메시징 시스템은 안정성(reliability), 확장성(scalability), 영속성(persistence)을 제공합니다. 분산 메시징 패턴은 보통 publish-subscribe(발행자-구독자) 패턴을 따릅니다. 발행자가 메시지를 전송하면 구독자는 필터링 옵션에 의해 메시지를 취사선택 할 수 있습니다. 보통 필터링은 토픽(topic) 기반 필터링 또는 내용(content) 기반 필터링을 적용합니다. 이 구조는 메시지 기반으로 통신하기 때문에 느슨한 결합을 갖는 아키텍처입니다. 왜냐하면 메시지를 발행하는 쪽에서는 어떤 구독자가 생길지 알 수 없기 때문입니다. 유명한 분산 메시징 시스템으로는 Apache Kafka, RabbitMQ 등이 있습니다. 그림으로 구조를 나타내면 다음과 같습니다.

이번 예제에서 사용할 분산 메시징 시스템으로는 Apache Kafka를 선택하고 메시지 처리를 위해서 Kafka Streams를 선택하겠습니다. 두 기술을 선택하는 이유는 현재 실무에서 다루고 있기 때문에 연습을 위해 선택하게 되었습니다. 다른 메시징 시스템들과의 뚜렷한 장/단점을 비교해서 선택한 부분은 아닙니다.

Spring Cloud Stream

Spring Cloud Stream은 분산 메시징 시스템을 이용한 확장성 높은 이벤트 기반 마이크로서비스를 구축하는데 도움을 주는 프로젝트입니다. Spring Cloud Stream 프레임워크를 활용하면 pub / sub 이론, consumer groups, stateful partitions 등을 지원하고 Spring의 개념에 친숙하고 모범 사례를 활용해 유연한 프로그래밍 모델을 구축할 수 있다고 설명하고 있습니다.

Srping Cloud Stream은 다양한 분산 메시징 시스템의 binder(Kafka Streams, RabbitMQ, Apache Kafka, AWS SQS, AWS SNS 등)를 구현하고 있습니다.
Spring Cloud Stream의 핵심 구현체는 다음 세 가지 입니다:

  • Destination Binders: 외부 메시징 시스템과 통합을 담당하는 컴포넌트
  • Destination Bindings: 외부 메시징 시스템과 최종 사용자가 제공하는 애플리케이션 코드(producer / consumer)를 이어주는 컴포넌트
  • Message: producer / consuemr가 외부 메시지 시스템과 통신하는 표준화된 데이터 규격

각 구성요소들의 구현 방법에 대해서는 프로젝트를 진행하면서 정리해보도록 하겠습니다.

정리

지금까지 어떤 프로젝트를 진행할지에 대한 간략한 설명과 학습해볼 기술에 대해서 정리해봤습니다.
다음 시간에는 이번 프로젝트에 사용하는 분산 메시징 시스템인 Apache Kafka를 로컬에 구축하여 간단하게 메시지를 발행하는 부분에 대해서 정리해보겠습니다.

profile
작은 개발지식부터 공유해요 :)

0개의 댓글