Kafka를 활용한 실시간 데이터 스트리밍 시스템 구축 경험 — 5개월간의 도전과 80% 처리 속도 향상 사례 분석
긴 글, 핵심만 먼저 — 이 글을 3줄로 정리해드려요.
실시간 데이터 스트리밍 시스템을 구축하는 과정은 여러 도전과제를 동반한다. 특히 Kafka를 활용한 시스템은 그 강력한 메시징 기능 덕분에 많은 기업에서 채택하고 있지만, 실제로 구현해보면 예상치 못한 함정이 많다. 이 글에서는 5개월간의 경험을 바탕으로 Kafka를 활용한 실시간 데이터 스트리밍 시스템 구축 과정에서 겪은 시행착오와 성과를 공유하고자 한다.
Kafka의 선택과 초기 설정
Kafka를 선택한 이유는 높은 처리량과 내구성 때문이다. 하지만 초기 설정 과정에서 여러 문제에 직면했다. 예를 들어, 브로커와 주제를 설정할 때, 적절한 파티션 수를 정하는 것이 중요하다. 파티션 수를 너무 적게 설정하면 병목 현상이 발생할 수 있고, 반대로 너무 많이 설정하면 관리가 복잡해진다.
초기에는 파티션 수를 3으로 설정했지만, 트래픽이 증가함에 따라 6으로 늘리게 되었다. 이 과정에서 데이터 분산이 어떻게 이루어지는지 충분히 이해하지 못해, 메시지가 균등하게 분산되지 않아 일부 소비자에 부하가 집중되는 현상이 발생했다. 이를 해결하기 위해 메시지 키를 적절히 설정하는 것이 중요했다.
# Kafka 주제 생성 시 파티션 수 조정
kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 6 --replication-factor 1
데이터 모델링과 메시지 포맷
다음으로는 데이터 모델링과 메시지 포맷을 결정하는 과정이었다. JSON 포맷을 사용하기로 했지만, 성능을 고려할 때 Avro와 같은 바이너리 포맷도 검토할 필요가 있었다. JSON은 사람이 읽기 쉬운 장점이 있지만, 데이터 크기가 커지면 성능에 악영향을 미친다.
결국, Avro를 사용하기로 결정했지만, 스키마 관리 문제에 부딪혔다. 스키마 레지스트리를 도입하여 버전 관리를 하기로 했는데, 초기 스키마 변경 시 소비자와 생산자 간의 호환성을 유지하는 것이 어려웠다. 이 과정에서 여러 번의 테스트와 롤백을 반복해야 했다.
성능 최적화와 모니터링
구축 후에는 성능 최적화 작업이 필요했다. Kafka의 기본 설정으로는 충분한 성능을 발휘하지 못했기 때문에, 여러 파라미터를 조정해야 했다. 예를 들어, linger.ms, batch.size와 같은 설정을 통해 배치 전송을 최적화했다.
이와 함께 모니터링 시스템을 구축하여, 소비자와 생산자의 처리 속도를 실시간으로 체크했다. Grafana와 Prometheus를 활용하여 Kafka의 지표를 시각화하고, 문제 발생 시 즉각적으로 대응할 수 있는 체계를 마련했다. 이로 인해 전체 처리 속도가 약 80% 향상되는 성과를 거두었다.
# Prometheus 설정 예시
scrape_configs:
- job_name: 'kafka'
static_configs:
- targets: ['localhost:9092']
트레이드오프와 교훈
실시간 데이터 스트리밍 시스템을 구축하는 과정에서 여러 트레이드오프를 경험했다. 높은 성능을 위해서는 복잡한 설정과 관리가 필요하고, 반면에 단순한 시스템은 성능이 떨어진다. 또한, 메시지 포맷 선택에서도 가독성과 성능 간의 균형을 맞추는 것이 중요하다.
이러한 경험을 통해 얻은 교훈은 명확하다. 처음부터 완벽한 시스템을 구축하려고 하지 말고, 점진적으로 개선해 나가는 것이 중요하다. 또한, 팀원 간의 커뮤니케이션을 통해 문제를 신속하게 해결하는 것이 시스템의 안정성을 높이는 데 기여한다.
결론적으로, Kafka를 활용한 실시간 데이터 스트리밍 시스템 구축은 많은 도전과제가 있지만, 이를 통해 얻은 경험은 개발자로서의 성장에 큰 도움이 된다. 앞으로도 이러한 경험을 바탕으로 더 나은 시스템을 구축할 수 있도록 노력할 것이다.