펍섭메세지모델에서 컨슈머들이 같은 메세지를 가져가는 것은 카프카에선 다른 컨슈머그룹을 만들면 토픽의 파티션들도 별도의 오프셋을 추가로 다루게 되어 그냥 가능하다
큐잉모델의 컨슈머들이 다른 메세지를 가져갈 수만 있으므로 인해서 처리속도 증가하는 것을 카프카에선 토픽안에 파티션을 두개이상 사용하는 것으로 고안해내었다.
같은 컨슈머 그룹안에서 컨슈머들이 같은 토픽의 다른 파티션을 보는 경우 큐잉모델의 경우처럼 속도를 낼 수가 있다
다만 큐잉모델이든 카프카의 파티션개념이든 순서가 상관없는 병렬처리로 진행되게 된다
브로커가 여러개 인것은 브로커가 장애로 다운될 경우 죽은 브로커가 살아있을때의 오프셋을 항상 기억하고 있는 역할을 하던 다른 브로커(standby)가 active하게 나서는 HA기능을 위한것이다.
프로듀서가 사용하는 파티션을 1:1로 두고 key:value로 각 파티션을 담당하는 컨슈머를 해시로 정해두는 방식으로 커스텀하게 사용할 수 있다.
시간순서가 중요한 일이 세상의 대부분인데 카프카는 시간 순서가 중요하지 않은 것을 디폴트로 설정되어있다(파티션 여러개). 전송하는 메세지들의 파티션 단위를 잘자르면 순서가 중요하지 않도록 만들 수 있는 것이다.
순서보다 더 중요한 가치가 있는 것이다.
프로듀서가 같은 토픽에 대해서 n:1로 붙는 것은 처리성능을 위해서이다. 같은 토픽에 대해서 한 컨슈머그룹의 컨슈머들이 1:n으로 붙는 것도 처리 성능을 위해서이다. 같은 토픽에 다른 컨슈머 그룹이 1:n으로 붙으면 같은 메세지를 갖고 싶은 것
Partitioner 인터페이스
브로커 수가 많은게 HA말고 성능 향상에 영향을 줄 수도 있나?? 그렇다면 어떻게 그게 이뤄지는거지???????
여러 파티션은 멀티 스레드로 처리됨
isr만드는 데는 싱글 스레드로 처리됨
브로커가 많은데 HA기능이 좋아지는 건 알겠는데 성능이 올라가는 건 어떤 매커니즘인지 여러 책에 나와있는지 찾아가며 보자
브로커 마다 토픽의 갯수와 종류가 다른 것이 아니다. 그리고 브로커 마다 같은 토픽의 파티션 갯수도 같다.
각 브로커가 같은 토픽안에는 같은 파티션정보를 가지고 있는 듯. 파티션 별로 같은 레플리카스 중에서 리더 레플리카가 각각 다르다. 그래서 isr생성 순서도 다르다.
토픽마다 파티션갯수를 정하도록 되어있는데 여기서 파티션 개수가 브로커 개수를 초과하여 설정될 수 없는 이유를 유추해볼 수 있다. 위에서 n:1로 프로듀서가 같은 토픽에 접근하는 것을 설명한적이 있는데. 엄밀하게 자세히 접근하면 사실은 조금 다르다. 하나의 브로커가 가지는 한 토픽안의 다른 파티션들에 여러 프로듀서들이 접근하는 것은 브로커가 하나일 때만 맞다. 사실은 브로커가 여러개일때는 여러 브로커가 각각 같은 토픽을 가지고 있으며, 각 프로듀서는 동시에 하나의 브로커의 같은 토픽의 다른 파티션에 접근하는게 아니라, 각 프로듀서가 동시에 각각 다른 브로커의 같은 토픽의 다른 파티션하나에 접근한다. 그래서 브로커의 개수가 많을 수록 HA능력 뿐만아니라 처리속도도 높아진다고 설명된다!! 파티션 개수를 브로커 갯수보다 적게는 설정 가능한데 이럴때 파티션 갯수는 어떻게 정하게 되는가? 지금 다 알 순 없다.11.5장에서 천천히 설명한다고 한다. 브로커가 4개일때 토픽의 replicationFactor가 3이고 partition 개수가 1인 것도 가능한데, 파티션이 1개 일지라도 이때 순서는 안지켜지지 않을까? replicationFactor를 isr보다 같거나 더 많이 설정해야하는 설정규칙도 생각해보면 이렇다. 브로커개수 >= 파티션개수 브로커개수 >= replicationFactor >= minISR개수(Ack=all일때) 로 설정가능하다. 파티션 개수만큼 리더 레플리카셋이 존재. 한 컨슈머 그룹안의 컨슈머들은 리더 레플리카에서만 메세지를 가져간다 레플리카 셋만 많다고 성능이 전혀 빨라지지 않는다. 레플리카 셋은 오로지 HA를 위한것. 부하가 분산된 좋은 성능을 위해서라면 브로커개수 >= 파티션개수 >= 컨슈머개수
파티션개수가 브로커 개수에 가까울 수록 리더 레플리카 개수가 많아지므로 부하를 분산시킨 균등처리로 인한 성능이 향상된다
브로커의 개수가 isr 개수보다 작아서 카프카가 동작하지 않을때는 토픽작성이 안된다. 토픽작성할때 파티션의 개수를 지정하게 되어 있는데, 파티션 개수가 살아있는 브로커 개수보다 커도 토픽이 만들어 지지 않는다.
파티션이 한개라면 브로커를 추가해봤자 고가용성으로 밖에 못쓴다. 리더 레플리카인 파티션도 하나고 리더 레플리카 하나에서만 컨슈머가 메세지를 가져갈 수 있으므로.
파티션과 브로커가 한개인 구조인데, 자바코드를 워커-스레드 모델로 개발 했었나? 했다면 장점은 잘 살릴 수 있었나?
https://bebong.tistory.com/m/entry/Kafka-Consumer-Design
'Data Engineering > Kafka' 카테고리의 다른 글
카프카 옵션 (0) | 2021.08.13 |
---|---|
Kafka를 왜 사용하는가?, Kafka가 RabbitMQ와 다른점 (0) | 2019.11.15 |
드디어 Kafka 공부한다. (0) | 2019.11.14 |
댓글