[Kafka] 순서보장 ( Producer 2개와 Consumer 1개 예시 )

2021. 5. 5. 17:03개발/Kafka

Producer가 발생시킨 메세지를 발생한 순서에 따라 Consumer가 얻을 수 있을까??? 구글링해보면 Topic내의 파티션 간에는 순서가 보장되지 않으며, 파티션내에선 순서를 보장한다고 한다. 한번 테스트 해보자.

 

 

Kafka의 Config 폴더로 이동해서 server.properties를 연다. Kafka에 대한 각종 설정을 할수 있늗네 여기서 num.partitions를 1로 셋팅한다. topic을 생성할 때 기본적으로 셋팅되는 partition 갯수를 1로 셋팅한다는 의미다.

 

 

sample-topic1 토픽을 생성하고 실제로 partition이 1개 인지 확인한다. 

 

2개의 Producer와 1개의 Consumer를 사용한다. 전체적인 구조는 아래와 같다.

 

 

먼저 1번 Producer를 실행해서 아래와 같이 입력한다. sample-topic1로 데이터를 Pub하며 별도로 partition 할당에 대한 옵션은 작성하지 않았다.

 

그다음 2번 Producer를 실행해서 아래와 같이 입력한다.

 

이때 Consumer를 실행해보면 입력한 순서대로 메세지가 출력될까??

Consumer

Partition이 하나밖에 없기때문에 모든 Producer는 Partition1에만 메세지를 보내게 된다. 

 

 

Partition이 1개인 기존의 sampl-topic1을 제거하고 server.properties 셋팅을 살짝 수정해보자. 

Topic 생성시 기본 Partition을 3개로 할 수 있도록 num.partitions를 3으로 셋팅한다. 

 

sample-topic1을 생성하며 3개의 partition이 정상적으로 생성되었는지 확인해본다. 

 

앞선 에제와 마찬가지로 2개의 Producer와 1개의 Consumer를 사용한다. 전체적인 구조는 아래와 같다. 

Producer를 셋팅하거나 실행할때 별도의 Partition에 메시지를 보내라는 옵션을 추가하지 않았으므로 어떤 Partition이든 데이터가 Pub될 수 있다. Consumer로 특정 Partition의 메시지를 읽어오라는 옵션을 별도로 주지 않았기 때문에 모든 Partition에 있는 데이터를 다 sub한다.

 

Producer 1번을 실행해서 아래와 같이 메세지를 입력한다

Producer 2번을 실행해서 아래와 같이 메세지를 입력한다. 

 

 

이제 Consumer를 실행해서 sample-topic으로 부터 데이터를 가져오자.

전혀 순서를 지키지 않은채로 데이터가 출력된다. 심지어 1번 Producer에서 넣었던 1_1, 1_2, 1_3, 1_4의 순서가 다르다. (2번 Producer도 마찬가지다) 1번 Producer에서 입력한 데이터들이 같은 Partition으로 들어간게 아니라 3개의 Partition에 분산되어 들어갔으며, 각 Partition간에는 순서를 보장하지 못한다는 것을 의미한다. 

이유는 기본적으로 Topic은 받아온 데이터를 Round-Robin 방식으로 메시지를 Partition에 할당하기 때문이다.

 

개인적으로 생각해본 순서보장 방법.

1. Producer가 발생한 시킨 순서대로 Consumer가 데이터를 받아오기 위해선 Topic의 Partition 갯수를 1개로 제한한다. 다수의 Partition을 가졌을때 얻을 수 있었던 병렬성에 대한 이점은 포기한다.

2. Producer가 보내는 메세지에 order 번호를 부여해서 메세지를 전달받은 Consumer 쪽에서 재정렬 한다. 병렬성은 확보되지만 Producer가 메세지마다 order 번호를 부여해야한다. ( 채번이 잘못되기라도 한다면??? ㄷㄷ )

3. Producer가 Round Robin 형태로 Partition에 메세지를 넣는것이 아니라 특정 Partition에만 메세지를 Pub할 수 있도록 별도 개발을 수행한다. (구글에 Partition assignment로 검색) 성능은 1번과 비슷할것으로 생각되나 아직 학습이 부족해서 이 부분은 더 공부해봐야 할듯하다.