Apache Kafka 사용기

 안녕하십니까.

이번 포스팅에서는 제가 사용하였던 아파치 카프카에 대하여 간략하게 리뷰하려고 합니다. 

Apache Kafka

아파치 카프카란?

아파치 카프카란 오픈소스 기반 확장 가능한 분산 스트리밍 플랫폼 입니다. 이에 대하여 각각 살펴봅시다. 아래에서의 모든 예시는 광고 노출 데이터로 가정하겠습니다. 

확장 가능 분산

수평 확장이 가능하다는 말은 kafka에 트래픽이 몰리면 이를 위해 클러스터에 리소스를 더 투입할 수 있다는 말입니다.

스트리밍 pub sub 구조

스트리밍이라는 말은 데이터가 흐름과 같이 오면 이를 받아서 처리한다는 것과 비슷합니다. 예를 들어서 자료구조의 Queue를 생각하시면 편합니다. 이와 같은 구조를 펍 섭 구조라고 합니다. 데이터를 계속 넣어주는 부분을 publish 이라고 합니다. 이를 받아서 처리하는 부분을 subscribe 라고 합니다. pub sub은 디자인 패턴 중 하나로써 중간 플랫폼을 카프카가 담당을 하게되고, pub sub 부분은 개발자가 직접 디자인 해야 합니다. 

Producer : 카프카에 데이터를 넣어주는 역할을 합니다. 예를 들어서 광고 노출이 직접 노출되는 클라이언트 코드에서 노출 데이터를 Producing하여 카프카에 전송 합니다. 

Consumer : 카프카에 있는 데이터를 받아서 처리하는 역할을 합니다. 예를 들어서 광고 노출 데이터를 받아서 과금을 하는 등의 처리를 할 수 있습니다. 

Partition Group Topic

카프카의 이해를 쉽게하기 위해서 다음과 같이 도식화 하였습니다.
카프카의 파티션 도식화

Message: 카프카 데이터의 가장 작은 단위 입니다. 예를 들어서 광고 노출 데이터라고 할 시에 노출 데이터 한건으로 볼 수 있습니다.
Topic : 데이터의 그룹 중 가장 큰 단위 입니다. 예를 들어서 광고 노출 Topic으로 볼 수 있습니다.
Partition : 토픽을 나누는 단위 입니다. 예를 들어서 광고 노출 토픽을 파티션 10개로 나눌 수 있습니다. 각 파티션은 카프카 컨슈머에 각각 매핑될 수 있습니다. 만약 컨슈머 갯수가 적으면 파티션 여러개가 컨슈머 한개에 매핑될 수 있습니다. 
Group : 해당 토픽을 컨슈밍 하고 있는 어플리케이션의 그룹 단위 입니다. 예를 들어서 여러 팀에서 해당 토픽의 데이터가 필요하다고 하면 각각 그룹으로 나눌 수 있습니다. 

Offset : 각 그룹마다 해당 토픽을 어디까지 봤는지를 저장해야 다음 메시지를 볼 수 있는데요. 이를 위한 개념이 Offset입니다. 

카프카를 고른 이유

카프카를 고른 이유는 간단합니다. 확장이 가능해야했기 때문 입니다. 저희가 진행한 작업의 작업량이 얼마나 늘어날지 예측이 어려운 점이 있었습니다. 초기에 정한 작업량이 있더라도 기획에 따라 언제라던지 작업이 추가가 가능해야 했으며 이를 위해서는 확장이 가능해야 했습니다. 

카프카를 사용하지 않고 일반 DB를 Queue처럼 구현하는 방법도 하나의 방법이었지만, 작업 분배 로직을 직접 새로 짜는것이 번거로워 보였습니다. 또한 이전 경험상 디비를 통해서 Queue를 구현할시에 초기 아키텍쳐가 잘못되면 확장이 불가능한것을 몸소 경험하였기 때문에 kafka로 결정 하였습니다. 

리벨런싱

저희 작업의 특성상 초기에 리벨런싱이 자주 발생 하였습니다. 카프카에서 리벨런싱이란 컨슈머 - 파티션간의 관계를 다시 설정하는 것을 말합니다. 해당 경우가 일어나는 이유는 다음과 같습니다.

1. 하나의 컨슈머가 하나의 message를 오래 가지고 있을 경우 카프카의 입장에서는 작업 중인지, 아니면 작업중 중단인이 확인이 어려움.
2. 작업 중 컨슈머가 죽었을 경우 카프카는 바로 다른 컨슈머에 파티션을 할당 해야 함.

저희 작업은 위의 두가지 경우가 모두 발생하여 처음에 고난이 좀 있었는데요. 작업의 term을 줄이고, 가능하면 죽지 않는 구조로 변경하였습니다. 리벨런싱이 일어나게 되면 모든 카프카 파티션이 재분배를 진행하게 되고, 메시지가 많게 되면 이 작업이 점차 오래걸리게 됩니다. 

리벨런싱이 나게 되면 다음과 같은 로그를 볼 수 있게 됩니다. 이 경우는 컨슈머를 잘 조절 해야합니다.

[06:24:49:885] - [kafka-coordinator-heartbeat-thread | amazon-main-listener] [INFO] - o.a.k.c.c.i.AbstractCoordinator - [Consumer clientId=consumer-amazon-main-listener-1, groupId=amazon-main-listener] Attempt to heartbeat failed since group is rebalancing

파티션 사이즈 조절

카프카를 사용하면 카프카 사이즈도 조절 해야합니다. 카프카 파티션 수가 많아질 수록 여러 컨슈머에서 파티션을 사용 할 수 있습니다. 하지만 너무 많게되면 오히려 거기에 부하가 일어날 수 있고, 파티션 사이즈는 원칙적으로 줄이는게 불가능 합니다. 서로 다른 파티션간의 데이터 교환 기능은 없기 때문입니다. 처음에는 가능하면 적게 하고 점차적으로 올리는게 좋은 전략인듯 합니다. 

댓글

이 블로그의 인기 게시물

고려대학교 야간대학원 중간 후기

포켓몬 고 17셀 확인 포고맵 사용 방법

HTTP 오류 500.19 - Internal Server Error 에러 처리법