마이크로 서비스 아키텍처의 필요성
책나눔 서비스는 대규모 트래픽을 효율적으로 처리할 수 있는 시스템 구조가 필수적이었습니다.
이에 따라 기존의 모놀리식 구조에서 마이크로서비스 아키텍처로 전환하며, 이 과정에서 카프카를 도입하기로 결정했습니다.
카프카는 대용량 데이터를 여러 컨슈머가 병렬로 처리할 수 있게 해주어, 트래픽이 급증하는 상황에서도 메시지의 유실 없이 높은 처리량을 유지할 수 있습니다.
또한 각 마이크로서비스가 독립적으로 확장될 수 있도록 지원함으로써, 서비스의 확장성과 안정성을 보장하고, 시스템 전체의 부하 분산을 가능하게 합니다.
이러한 이유로 카프카는 고가용성이 요구되는 대용량 트래픽 환경에 매우 적합한 선택이라고 판단했습니다.
기존 서버의 모놀리식 아키텍처 흐름도
카프카란?
카프카는 실시간 데이터 피드를 관리하기 위한 오픈 소스 스트리밍 플랫폼입니다.
분산 스트리밍 플랫폼으로서, 카프카는 높은 처리량, 내결함성, 확장성 및 실시간 처리 기능을 제공하며, 대규모 데이터 파이프라인을 구축하는 데 주로 사용됩니다.
카프카의 기본 개념과 주요 특징
1.
토픽
카프카에서 데이터 스트림은 토픽으로 구분되며, 이는 메시지를 특정 카테고리로 분류하는 데 사용됩니다.
2.
프로듀서
데이터를 생성하고 카프카 시스템에 전송하는 역할을 합니다.
프로듀서는 특정 토픽으로 메시지를 발행합니다.
3.
컨슈머
카프카 시스템에서 데이터를 읽어가는 역할을 합니다.
컨슈머는 하나 이상의 토픽을 구독하고, 데이터를 소비합니다.
4.
브로커
카프카 서버의 단위로, 메시지를 저장하고 컨슈머에게 전달하는 역할을 합니다.
여러 브로커는 클러스터를 형성하여 처리량을 증가시키고, 데이터를 복제하여 고가용성을 제공합니다.
5.
파티션
토픽은 여러 파티션으로 나뉠 수 있으며 각 파티션은 순차적으로 증가하는 ID를 갖는 메시지들의 불변적인 순서를 가집니다.
이를 통해 데이터의 병렬 처리가 가능해집니다.
6.
오프셋
각 컨슈머는 자신이 어느 메시지까지 읽었는지를 오프셋을 통해 관리합니다.
이는 메시지를 순차적으로 소비할 수 있게 하며, 장애 발생 후 복구가 가능하게 합니다.
7.
내결함성과 확장성
카프카는 데이터의 복제를 통해 시스템 장애에도 데이터 유실 없이 서비스를 유지할 수 있는 내결함성을 제공합니다.
또한 카프카 클러스터는 브로커를 추가함으로써 수평적으로 확장이 가능합니다.
메시지 큐잉 시스템과 카프카의 차이점
1.
처리량
카프카는 높은 처리량을 목표로 설계되었습니다.
이를 위해 메시지는 디스크에 지속적으로 쓰여지고, 이는 메시지 큐 시스템이 메모리 기반으로 작동하는 것과 대조됩니다.
2.
스케일 아웃
카프카는 클러스터로 구성되어 있어 수평적 확장이 용이하며, 많은 수의 프로듀서와 컨슈머를 수용할 수 있습니다.
전통적인 메시지 큐는 이러한 수평적 확장이 제한적일 수 있습니다.
3.
데이터 레플리케이션
카프카는 데이터의 복제를 통해 높은 가용성을 보장합니다.
대부분의 메시지 큐잉 시스템에서도 데이터 복제 기능을 제공하지만, 카프카는 이를 더 강력하게 지원합니다.
4.
소비자 모델
카프카는 다중 소비자 모델을 지원하여, 여러 컨슈머가 동일한 데이터 스트림을 독립적으로 읽을 수 있습니다. 메시지 큐의 경우 일반적으로 한 번의 소비가 메시지를 큐에서 제거하게 됩니다.
5.
장기 데이터 보존
카프카는 데이터를 장기간 보존할 수 있으며, 이를 통해 데이터를 나중에 다시 읽거나 처리할 수 있습니다.
전통적인 메시지 큐잉 시스템은 메시지를 가능한 빨리 처리하고 삭제하는 것에 중점을 둡니다.
마이크로서비스 아키텍처와 카프카 결합
마이크로서비스 아키텍처 적용 흐름도
카프카를 선택한 이유
카프카와 같은 다양한 메시징 시스템
1.
RabbitMQ
가장 널리 사용되는 오픈 소스 메시지 브로커 중 하나로, AMQP를 지원합니다. 높은 신뢰성과 유연성, 다양한 메시징 패턴을 지원합니다.
2.
ActiveMQ
Apache Software Foundation에서 개발한 또 다른 오픈 소스 메시지 브로커로, Java Message Service를 지원하며, 클러스터링 클라이언트와 브로커 보안 등의 기능을 제공합니다.
3.
ZeroMQ
소켓을 기반으로 하는 라이브러리로 고성능의 메시징 솔루션을 제공합니다.
브로커리스 아키텍쳐를 사용하며, 상대적으로 가볍고 유연합니다.
4.
Amazon SQS
AWS에서 제공하는 관리형 메시지 큐 서비스 로 큐를 통해 서버간 애플리케이션 간 메시지를 송수신할 수 있습니다.
스케일링이 쉽고 인프라 관리에 대한 걱정 없이 사용할 수 있습니다.
카프카와 비교
•
RabbitMQ
RabbitMQ는 뛰어난 메시지 라우팅 기능을 가지고 있지만 카프카는 대규모 데이터 처리와 더 높은 처리량을 위해 설계되었습니다.
책나눔 서비스에서 동시에 많은 양의 메시지가 발생할 것으로 예상되기에 RabbitMQ보다 카프카가 더 높은 처리량을 감당할 수 있다고 생각됩니다.
•
ActiveMQ
ActiveMQ는 JMS를 지원하며 많은 기업 시스템에서 잘 작동하지만 대용량 트래픽 처리와 데이터의 지속적인 스트림 처리에서는 카프카의 성능이 더 우수합니다.
특히 대규모 분산 시스템 환경에서 카프카의 확장성과 처리 속도는 ActiveMQ보다 더 큰 장점을 제공합니다.
•
ZeroMQ
ZeroMQ는 경량 메시징 시스템으로 뛰어난 속도와 유연성을 가지고 있지만 메시지 브로커가 없어서 내구성과 데이터의 안정적인 저장이 보장되지 않습니다.
반면 카프카는 데이터를 신뢰성 있게 저장하고 필요할 때 재처리할 수 있는 기능을 제공하여 대용량 데이터 처리에 더 적합합니다.
https://www.educba.com/zeromq-vs-kafka/
•
Amazon SQS
Amazon SQS은 관리형 서비스로서 인프라 관리의 편의성을 제공하지만 대규모 메시지 처리 시 비용이 급격히 증가할 수 있습니다.
카프카는 오픈 소스이며 자체 클러스터를 구축할 경우 장기적으로 더 경제적일 수 있고 맞춤형 구성이 가능하여 대용량 트래픽을 가진 책나눔 서비스에 더 적합할 수 있습니다.
아키텍처 설계
동시성 문제와 분산 락
책나눔 서비스는 여러 서버가 카프카를 활용하여 대량의 트래픽을 처리합니다.
카프카는 뛰어난 처리량과 메시지 순서를 유지하는 분산 스트리밍 플랫폼입니다.
개별 파티션 내에서는 이 목표를 잘 달성하지만 여러 파티션에서 병렬 처리가 이루어질 때는 동시성 문제가 발생 하였습니다.
이런 문제를 해결하기 위해 우리는 레디스를 이용한 분산 락을 도입하였습니다.
레디스는 인 메모리 데이터 스토어로서 빠른 처리 속도를 제공하며 대규모 트래픽 상황에서도 안정적인 성능을 보장합니다.
레디 스를 사용함으로써 카프카의 강력한 병렬 처리 능력을 유지하면서도 동시성 문제를 효율적으로 해결하고 전체 시스템의 성능을 향상시킬 수 있는 방법을 찾을 수 있었습니다.