본문 바로가기

Kafka

Kafka 내부 메커니즘 - 3)쓰기/읽기요청

쓰기요청(produce request)

일단 쓰기 요청의 흐름을 알기 전에 acks 매개변수에 대해 간단히 알고 넘어가자.

acks매개 변수란, Producer config정보에서 ack(acknowlegement)옵션이 있다. 메세지를 보내고 잘 받았다고 확인받는 메세지라고 보면된다. 이 ack옵션에 따라서 네트워크를 몇번을 타야하는지를 결정할 수 있다. 

all

메세지를 리더한테 보내고 쓰여지고, 나머지 follower들이 똑같이 메세지를 다 복사할 때까지 기다린다.

복사까지 완벽하게 되면, 그제서야 ack옵션을 producer에게 보낸다.(메세지 잘 쓰여졌고, 복사까지 잘 됬어!)라고

- 장점은 leader가 어느 순간 뻗어도, 복제된 데이터가 follower들에게 있으니, 메세지의 유실이 전혀 없다

- 단점은 복제할때 까지 기달려야하는 네트워크를 타고 흐르는 시간을 기달려야 하는 비용이 든다.

1 메세지를 리더한테까지만 받으면 성공으로 간주한다
0 브로커의 수신 응답을 기다리지 않는다

특정 파티션의 리더 리플리카를 포함하는 브로커가 해당 파티션의 쓰기 요청(produce request)을 받으면 다음 사항의 검사를 시작한다.

- 이거 요청한 Client는 이 토픽에 대한 쓰기 권한 갖고 있는거야?

- 이 요청에 지정된 acks 값(0 || 1 || all) 적합한 값 왔어?

- 만일 acks값이 all인 경우, 메세지를 안전하게 쓰는데 충분한 동기화 리플리카들이 있어?

 

위 3가지 항목을 모두 통과하면 로컬 디스크에 요청 받은 메세지를 쓴다.

메세지를 쓰고 나면, 브로커는 acks 값을 확인해 본다. acks에 따라 아래와 같이 행동한다

0 혹은 1인 경우 즉시 응답을 전송함
all Follow Replica들이 해당 메세지 복제 했는지 리더가 확인 할 때까지 퍼거토리(purgatory)라고 하는 버퍼에 해당 요청을 저장함

 

읽기 요청(fetch request)

읽기 요청에대한 구성요소

- 읽기를 원하는 토픽

- 읽기를 원하는 파티션과 오프셋

- 반환받을 데이터의 최대 크기(optional)

- 반환받을 데이터의 최소 크기(optional)

쉽게 말로 풀어서 가장 간단하게 요청한다면, "reprosessing 토픽의 1파티션의 235 오프셋부터 시작하는 메세지 전송해주라!"

 

이를 받은 Broker는 요청 한 파티션이 리더 파티션인지 혹은 존재하는 오프셋인지 가장 먼저 검사하게 된다. 만약 타당하지 않은 요청이라면 에러를 반환하게 된다.

 

반환받을 데이터의 최대 크기

Client는 요청데이터에 추가적으로 반환받을 데이터의 크기에 대해서도 제한할 수 있다(이는 읽기를 반환받은 Client의 역량에 달려 있다. 데이터를 무조건적으로 크게 받는다면, 메모리 부족을 초래하는 행위이다. 더불어 읽은 데이터를 그대로 DB에 저장하는 경우 설정된 query socket size를 오버하면서 insert error를 경험한 적이 있기 때문에 이부분은 서비스 시 때때로 떠올릴 수 있도록 하자)

 

카프카가 데이터를 반환해주는 방식

그럼 요청한 데이터를 어떤 방식으로 전송해줄까? 데이터 사이즈가 큰 경우 성능이 느리진 않을까?

카프카는 제로카피(zero-copy) 기법을 사용한다

즉, 파일의 메세지를 중간 버퍼 메모리에 쓰지 않고 곧바로 네트워크 채널로 전송한다. 이는 메모리로부터 데이터를 복사하고 버퍼를 관리하는 부담을 제거하므로 성능이 훨씬 더 향상된다.

 

반환받을 데이터의 최소 크기

앞서, 반환받을 데이터의 최대치에 대한 사이즈를 설정 할 수 있다고 했는데, 최소치에 대해서도 설정이 가능하다.

예를들어 최소치가 10KB라면, 이는 즉 "데이터가 적어도 10KB되면 데이터 반환해줘~"라는 뜻이다.

이는 메세지 읽기 요청에 대한 CPU와 네트워크 사용을 줄일 수 있는 좋은 방법이다.

 

그렇다고 한없이 특정 사이즈가 될때까지 기다리는것을 Client가 또 원하지 않을 수도 있다. 이 경우에는 타임아웃을 지정하면 된다,

"적어도 10KB는 되야 데이터 반환 받을건데, 최대 5초만 기다릴거야. 만약 5초가 됬는데 10KB 안되더라도 그냥 보내줘~"

 

읽기 요청에 대해 알아야 할 점

파티션 리더에 존재하는 데이터를 모두 읽을 수 있는것은 아니다. 읽기 요청이 올때 반환되는 데이터들은 모든 동기화 리플리카에 쓰여진 데이터들만을 기준으로 하여 반환해준다. 이유는, 아직 모든 리플리카에 복제되지 않은 리더만 갖고있는 데이터들은 '불안전한' 것으로 간주되며, 만일 리더가 중단되는 경우 해당 데이터는 아직 복제되지 않았기 때문에 다른 리더가 선출된 경우 존재하지 않는 데이터이기 때문이다.

 

 

'Kafka' 카테고리의 다른 글

Kafka 모니터링  (0) 2020.02.02
Kafka 신뢰성 보장  (0) 2020.01.27
Kafka 내부 메커니즘 - 1)소개,주키퍼, 복제  (0) 2020.01.21
Kafka 내부 메커니즘 - 4)스토리지  (0) 2020.01.20
Kafka 내부 메커니즘 - 2)요청처리  (0) 2020.01.20