[Kafka][Consumer] Consumer Group

Joney의 SW 공부 블로그·2024년 5월 22일
0

Kafka study

목록 보기
7/7

Consumer Group 개요

Consumer가 처리하는 속도보다 Producer가 메시지를 발행하는 속도가 빠른 경우, Consumer가 처리해야하는 메시지는 점점 쌓이게 된다.

이런 경우 Consumer를 확장해야하지만, 단순히 Consumer를 확장하게 되면, offset 정보가 뒤섞여서 처리가 복잡해게 된다.

Kafka에서는 동일한 Topic에 대해 여러 Consumer가 가져갈 수 있도록 Consumer Group이라는 기능을 제공하고 있다.

하나의 토픽에 여러 Consumer Group이 동시에 접속해 메시지를 가져올 수 있기 때문에 Consumer Group을 활용하면 하나의 데이터를 여러 용도로 사용할 수 있다.

기존의 다른 메시지 큐 솔루션에서 Consumer가 메시지를 가져가면 큐에서 메시지가 삭제되는 것과 다른 kafka의 특징이다.


Consumer Group의 동작 시나리오

파티션 > Consumer


그림과 같이 Topic(peter-01)에 파티션이 3개고 Consumer Group에 Consumer가 1개(컨슈머01)인 경우, 컨슈머01이 peter-01에 들어오는 모든 메시지를 처리하게 된다.

peter-01 Topic에 메시지가 과도하게 들어오는 경우 컨슈머01이 처리하지 못하는 메시지가 지속적으로 쌓이게 되고 시스템에 큰 문제가 될 수도 있다.


파티션 = Consumer

Consumer Group 안에서 Consumer들은 메시지를 가져오고 있는 Topic의 파티션에 대해 소유권을 공유한다.

Consumer Group내 Consumer의 수가 부족하게 돼서 처리가 못 따라가면 Consumer를 추가해줘야한다.

그림과 같이 컨슈머02, 컨슈머03을 추가하면 컨슈며01이 처리하고 있던 파티션1과 파티션2를 각각의 Consumer가 소유하게 된다.

이와 같이 소유권이 이동하는 것을 리밸런스(rebalance)라고 한다.

리밸런스의 장점

  • Consumer를 안전하게 추가하고 제거할 수 있도록 하기 때문에 시스템의 가용성과 확장성을 확보 가능

리밸런스의 단점

  • 일시적으로 Consumer Group내의 Consumer가 메시지를 가져올 수 없게 됨 (경험적으로 대략 5초 이내)

파티션 < Consumer

위와 같이 Consumer를 추가했지만 메시지가 너무 많아 Consumer의 처리가 못 따라가서 컨슈머04를 추가하는 경우를 알아보자.

컨슈머04를 추가해도 컨슈머04는 메시지를 가져오지 않고 대기하게 된다.
이는 Topic의 파티션은 한 Consumer Group안의 하나의 Conusmer에만 연결 가능하기 때문이다.

한 파티션에 여러개의 Consumer가 연결되게 되면 파티션안의 메시지의 순서가 보장될 수 없게 된다.

그래서 파티션 수와 Consumer의 수를 동일하게 늘렸는데도 메시지의 속도를 따라가지 못하면 위 그림과 같이 파티션가 Consumer를 같이 늘려줘야 한다.


Consumer가 다운되는 경우

Consumer가 Consumer Group 안에서 맴버로 유지하고 파티션의 소유권을 유지하는 방법은 주기적으로 하트비트를 보내는 것이다.

하트비트는 Consumer가 poll할 때와 가져간 메시지의 offset을 커밋할 때 보내게 되기 때문에 하트비트를 보낸다는 건 Consumer가 잘 동작하고 있다는 것을 의미한다.

만약 Consumer가 오랫동안 하트비트를 보내지 않으면 세션 타임아웃이 나고 해당 Consumer가 다운되었다고 판단하여 리밸런스가 시작된다.

위 그림과 같이 컨슈머04가 다운되게 되면 리밸런스가 일어나고 컨슈머03이 파티션3을 소유하게 된다.

이로서 Consumer Group은 안정적으로 동작하지만 Consumer간의 불균형이 일어나기 때문에 일부 메시지가 늦어지는 현상이 발생할 수 있다. 그래서 되도록이면 장애 상황을 인지하고 Consumer를 추가하주는게 좋다.


Consumer Group의 특징

일반적인 메시지 큐 솔루션은 특정 Consumer가 메시지를 가져가면 큐에서 메시지가 삭제되는 다른 Consumer는 가져갈 수 없지만, Kafka는 메시지를 삭제하지 않기 때문에 다른 Consumer가 가져갈 수 있다.

위 그림과 같이 Cosnumer Group을 나누게 되면 각 Consumer Group에서 Offset을 따로 관리하기 때문에, 한 Topic에 대해 여러 Consumer가 독립적으로 메시지를 소비할 수 있다.

profile
SW 지식 노트 블로그

0개의 댓글