이번에 프로젝트를 진행하면서 고민을 했던 부분에 대해 어떻게 해결을 하였는지 정리해보고자 한다.
Kafka의 메세지는 토픽(topic)으로 분류된다. 토픽은 데이터베이스 테이블이나 파일 시스템의 폴더와 유사하다고 보면 된다. 하나의 토픽은 여러 개의 파티션(partition)으로 구성이 될 수 있다. 파티션 내에서는 순서가 보장이 된다.
하지만!
하나의 토픽에 여러 개의 파티션으로 구성이 된 경우 데이터가 어느 파티션으로 들어갔는지 컨슈머 입장에서는 모른다..
왜 그럴까? 기본적으로 Kafka로 데이터가 들어올 경우 다수의 파티션이 존재하면 RR(Round Robin)형태로 데이터가 분배가 된다.
순서 보장이 되지 않으면 아래와 같은 이슈가 발생 할 수 있다.
A 상품에 대해 프로듀서에서는 데이터 전송을 I -> U -> D 형태로 데이터를 보낸 경우 프로듀서의 입장에서는 순서가 I -> U -> D로 들어가야 하지만 컨슈머 쪽에서는 순서 보장이 되지 않으면 I -> D -> U로 들어올 수 있다는 말이다. 그렇게 되면 Update되어야 할 데이터가 없어서 에러가 날 수 있다.
이렇게 되는 이유는 컨슈머 별로 처리량에 대해 모두 동일하지 않아 특정 파티션에서 데이터가 더 빨리 빠질 수 있기 때문이다.
그럼 순서를 맞추기 위해 1토픽 1파티션으로 구성을 해야 할까?
No! 순서는 보장이 되지만 데이터 규모가 큰 경우에는 성능이 안나오는 초래할 수 없는 상황에 맞이 할 수 있다..
데이터 규모가 큰 경우에는 파티션을 점진적으로 늘리던지 아니면 초기에 이후 데이터의 양을 계산하여 파티션을 많이 늘려놓던지 해야 할 것이다.
그렇다면 어떻게 데이터의 순서를 맞출 수 있을까?
다행히도 Kafka에서는 이런 고민을 쉽게 해결해 줄 수 있도록 기능을 제공하고 있다.
바로 Message를 보낼 때 Message Key값을 같이 넣어서 보내게 되면 Kafka에서는 Message Key를 Hash값으로 변환하여 특정 파티션으로 보낸 뒤 그 다음 같은 Message Key가 들어오면 같은 파티션으로 데이터를 배치해 준다.
Java 코드에서는 다음과 같이 셋팅하면 된다.
ProducerRecord<String, String> record = new ProducerRecord<>("topic명", "메세지key", "메세지값");
나의 경우에는 내가 직접 프로듀서를 구현하지 않았지만 데이터를 보내주신 분에게 Message Key를 넣어서 보내달라고 가이드를 하였다.
'Kafka' 카테고리의 다른 글
카프카 토픽명 규칙 (0) | 2022.01.26 |
---|---|
토픽과 파티션, 레코드 (0) | 2022.01.26 |
Kafka 정리 (0) | 2022.01.26 |
자주쓰는 Kafka 명령어 (0) | 2022.01.26 |
Kafka Connect (0) | 2022.01.26 |