카프카를 이해하기 위해서는 메시지 큐와 MOM을 먼저 알아야한다. 메시지 큐는 분산화된 환경에서 발신자와 수신자 사이에서 메시지를 전송하고, 수신하는 기술을 의미한다. MOM(message oriented middleware)를 통해서 구현된다.
메시지큐
메시지 큐를 사용하면 발신자와 수신자가 서로를 직접 알 필요 없으므로 느슨한 결합(decoupling)을 만들어낼 수 있다.
발신자, 수신자 서로가 서로에게 의존하지 않으므로, 각자는 독립적으로 확장(scalable)될 수 있다.
N:1:M 의 형태로 발신자, 수신자 사이에 메시지 큐가 메시지를 중개하기 때문이다.
또한 수신자 서비스가 당장 장애 상황이더라도 발행된 메시지는 모두 메시지 큐에 남아있으므로 결국 발신자가 발생한 모든 메시지는 소비자 서비스에게 전달된다는 보장성(guarantees)를 갖는다. 이러한 여러 특성으로 메시지 큐는 여러 마이크로 서비스가 서로 협력하는 MSA 환경에서 빛을 발한다.
메시지 큐를 사용하면 비동기 통신(asynchronous)을 구현할 수 있다. A 서비스와 B 서비스가 통신을 한다고 가정해보자. A가 B를 HTTP 통신을 통해 request 한다면, A는 B로부터 동기적으로 response를 기다릴 것이다. 반면 A가 메시지를 메시지 큐에 발행하고, B가 그 메시지를 가져가는 방식으로 통신한다면 비동기적으로 통신이 이루어질 수 있다. 이런 특성으로 메시지 큐는 이미지 프로세싱과 같이 굉장히 무거운 작업을 요청하거나, 혹은 이벤트 드리븐 아키텍처에서 이벤트가 발생했음을 알리기 위한 용도로 사용하기 적합하다.
Pub / Sub
Pub/Sub 모델은 발신자가 토픽이라고 불리는 공간에 메시지를 전송하면, 그 토픽을 구독하고 있는 수신자 모두 메시지를 수신하는 방식이다. 즉, 전송 대상이 다수이다.
출처 : https://hudi.blog/what-is-kafka/
Kafka는 파티션(partition) 단위로 분산처리를 수행한다.
이 분산 처리를 할 때 핵심적인 기능이 바로 복제(Replication)이다.
분산 처리를 할 때에는 모든 브로커에 데이터를 동일하게 보내는 것이 아니라 Master -> Slave 방향으로 데이터를 복제하는 것처럼
Kafka는 리더(leader)파티션이 팔로워(follower)파티션에 복제를 수행하게 된다.
파티션들은 어떤 브로커에서 리더가 될지는 모르며 리더의 선출을 주키퍼(zookeeper)가 진행하게 된다.
Zookeeper 란?
왜 복제하는가?
장애 대응과 데이터의 유실을 막기 위해(고가용성) 복제를 한다.
만약 replication이 2개 라면, 브로커(broker) 한개가 죽더라도 복제본이 존재하므로 복구가 가능하다.
- 카프카 클러스터 (kafka cluster): 하나 이상의 카프카 브로커들의 집합
- 브로커 (broker): 브로커는 개별 카프카 서버
브로커는 프로듀서로부터 메시지를 전달받아, 토픽에 저장하고, 컨슈머에 전달하는 역할을 한다. - 토픽 (topic): 데이터의 카테고리 , 주제
토픽은 데이터가 저장되는 단위라고 할 수 있다.
토픽은 이름으로 식별된다. 토픽에 한번 추가된 데이터는 수정할 수 없다. - 파티션 (partition): 토픽의 조각
카프카의 확장성을 위해 토픽은 1개 이상의 파티션으로 나뉠 수 있다.
레코드에 키가 없다면 라운드 로빈으로 파티션에 나뉘어 저장되고, 같은 키를 가진 레코드는 같은 파티션에 저장된다. - 오프셋 (offset): 데이터 ID 값
오프셋은 0부터 시작하며, 파티션에 레코드가 저장될 때 마다 시퀀스가 증가한다.
특정 파티션의 각 레코드는 고유한 오프셋을 갖지만, 서로 다른 파티션 간에는 고유하지 않다.
파티션에서 데이터를 읽을 때 작은 것부터 큰 순서대로 읽는다. - 레코드 (record): 데이터
파티션에 저장 됌.
Key, Value, Timestamp, Compression Type, Optional Headers, Partition and Offset id 로 구성된다. - 프로듀서 (producer): 보내는 역할
카프카의 구성 요소가 아니며, 카프카 외부에서 카프카에 요청하는 애플리케이션이다. - 컨슈머 (consumer): 받는 역할
기본적으로 사용 가능한 가장 낮은 오프셋부터 높은 오프셋까지 순서대로 레코드를 읽어온다.
하나의 토픽의 여러 파티션으로부터 레코드를 읽어올 때는 순서가 보장되지 않는다.
( 파티션 0, 1, 2 로부터 레코드를 읽어올 때 파티션 0의 레코드만 바라봤을 때는 순서가 보장되지만, 읽어온 전체 레코드를 바라볼대는 파티션 0 ~ 2의 레코드가 순서와 상관없이 섞여있을 수 있다. ) - 컨슈머 그룹 (consumer group): 컨슈머 인스턴스를 여러개 생성하여 컨슈머 그룹을 구성할 수 있다.
컨슈머 그룹을 구성하는 여러 컨슈머는 동일한 토픽의 각자 다른 파티션을 도맡아 메시지를 컨슘할 수 있다.
( 토픽 A에 파티션이 0, 1, 2 가 생성되어 있고, 컨슈머 그룹 A에 컨슈머 a, b, c가 있다고 가정하자. 이 경우 컨슈머 a는 파티션 0을, 컨슈머 b는 파티션 1을, 컨슈머 c는 파티션 2를 컨슘한다. )
'개-발 > Infra' 카테고리의 다른 글
[Kafka] 카프카 Console 명령어 (0) | 2023.06.08 |
---|---|
[Kafka] Kafka Zookeeper CMAK 설치 (feat.Docker , 멀티 브로커) (0) | 2023.06.07 |
[Kafka] Zookeeper 란? (1) | 2023.06.07 |
[Elastic] 한글형태소 분석기 (nori 설치) (2) | 2023.06.03 |
[Docker] 네트워크란 ? (0) | 2023.06.03 |