Consumer


일반적으로 메시징 시스템은 queuing 기반 모델과 publish-subscribe 
기반의 모델로 나누어 볼 수 있다.


queuing기반의 메시징 시스템은 sender가 queue에 쌓아 놓은 메시지를 
pool에 있는 receiver중 하나에 각각 할당하는 방식이며 이 과정은 
비동기적으로 이루어진다. (point-to-point)


publish-subscribe기반의 메시징 시스템은 publisher가 메시지를 생성한 후
subscriber에게 broadcasting해준다.


Kafka는 consumer group이라는 개념을 만들어 이 두가지 방식을 종합하고 있다.


토픽으로 발행된 메시지들은 분산된 프로세스나 장비에 있는 consumer 그룹 내의 consumer 중 

오직 하나에게만 전달된다.



이 때, consumer들이 1개의 그룹으로만 묶여있으면 전통적인 queuing 방식으로 작동하고 

( consumer group = consumer pool) 모든 consumer가 서로 다른 그룹에 있으면 

publish-subscribe방식으로 작동하여 메시지들이 전체 consumer에게 broadcasting된다.


아래 그림에서 Consumer Group A가 없다고 생각해보자 Server 1과 Server 2에 있는 각각의 

topic partition들은 Group B 내의 consumer instance들과 1:1로 대응된다. 즉 point-to-point 방식의 

queuing이 되는 것이다.



하지만 그림과 같이 2개의 consumer 그룹이 있으면 각각의 partition들은 각 그룹으로 broadcasting을 

하게 되는 것이다.



이미지 출처1


간단하게 말하자면 이 구조는 구독자가 consumer의 클러스터로 되어있는 경우에는 결국 publish-subscribe 모델과 

다를바가 없다고 볼 수 있다.


Kafka는 전통적인 메시지 시스템보다 강력한 순차적 처리를 보장한다.


전통적인 queue 역시 메시지를 서버에 순차적으로 저장하고 다수의 consumer가 queue로부터 메시지를 사용할 때
저장된 순서에 따라 consumer들에게 메시지를 전달하지만 메시지 전달이 비동기적으로 일어나기 때문에 서로 다른 
consumer에 순서에 맞지 않는 메시지가 도착할 수도 있다.


이러한 동작은 사실상 병렬로 메시지가 사용 됨으로 인해 메시지 정렬의 의미가 퇴색하는 것이다.


종종 이런 상황을 회피하기 위해 ’배타적 consumer’라는 개념을  두어 queue에서 메시지를 읽을 때 단일 프로세스만 

사용하도록 하는 경우도 있는데 이는 당연히 병렬 처리를 못하게 되는 결과를 가져온다.


Kafka는 순차적인 처리를 더 잘 해낼 수 있다. topic 내에 partition이라는 병렬 처리의 개념을 둔 것이다.
이로인해 Kafka는 순처적인 처리에 대한 보장과 pool로 구성된 consumer들의 처리에 대한 load balancing을 

모두 제공할 수 있다.


이전 내용의 그림을 다시 보자


이미지 출처2


이러한 이점은 topic 내의 partision들을 consumer 그룹에 할당을 하고 각각의 partition들은 그룹 내에서 반드시 

하나의 consumer에 의해서만 사용되도록 함으로써 얻을 수 있다. 


이를 통해 어떤 consumer가 유일하게 특정 partition으로부터만 메시지를 소비하고 있으며 이로 인해 partition에 

정렬된 순서에 따라 메시지를 소비하고 있다는 것을 확신할 수 있는 것이다. 게다가 이런 과정이 진행되는 동안 

부하의 균형이 유지될 수 있다. 다만 consumer 그룹 내에 partition보다 많은 consumer들이 있게 되면 노는 

consumer들이 발생하니 주의가 필요하다.


Kafka는 동일 partition 내에서만 순서를 보장한다. 위의 그림에서 보자면 C3의 경우 P0와 1:1로 연결되어있기 때문에
순차적인 처리를 확실하게 보장 받을 수 있지만 C1의 경우 P0와 P3의 메시지를 함께 받고 있으며 이 두 개의 partition을
포괄하는 순차 처리는 보장 받을 수 없게 되는 것이다.



만일 전체적인 범위에서의 메시지 정렬이 필요하다면 topic이 단지 하나의 partition만을 갖도록 하여 처리할 수 있디.
하지만 이럴 경우 consumer 그룹 당 하나의 consumer 프로세스만 있게 되는 것이다.


Guarantee

높은 수준의 Kafka 구현은 다음과 같은 내용을 보장한다.


  • 메시지는 보내진 순서대로 추가된다. 즉 동일한 producer에서 보내진 message M1과 
    message M2가 있고 M1이 먼저 보내졌다면 M1이 M2 보다 낮은 offset을 갖고 로그에도 먼저 나온다.
  • consumer 인스턴스는 로그상에 정렬된 순서대로 메시지를
    인지한다.
  • N개의 복제 팩터를 가진 topic에 대해 메시지 손실 없이 N-1대의
    서버 장애를 허용한다.
  1. 이미지 출처 : Kafka 공식 홈페이지 (http://kafka.apache.org/documentation.html#introduction↩︎
  2. 이미지 출처 : Kafka 공식 홈페이지(http://kafka.apache.org/documentation.html#introduction↩︎


블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^