토픽이란?
토픽은 카프카에서 데이터를 구분하기위해 사용하는 단위입니다.
토픽은 1개 이상의 파티션을 소유합니다.
파티션의 특징
- 파티션에는 프로듀서가 보낸 데이터들이 저장되어있고 이 데이터를'레코드(record)'라고 부릅니다.
- 파티션의 자료구조는 큐(queue)와 비슷한 구조입니다.
- FIFO구조와 같이 먼저들어간 레코드는 컨슈머가 먼저 가져가지만, 일반 자료구조로 사용되는 큐처럼 데이터를 가져가면 삭제(pop)되는 것과는 반대로 카프카에서는 삭제 하지 않습니다.
- 이러한 특징 때문에 레코드는 다양한 목적을 가진 여러 컨슈머 그룹들이 토픽의 데이터를 여러번 가져갈 수 있습니다.
- 파티션 하나에는 최대 컨슈머 하나만 할당이 가능합니다.
- 많은 레코드를 병렬로 처리하는 가장 좋은 방법은 컨슈머 개수를 늘림과 동시에 파티션 개수도 같이 늘려 처리량을 증가시키는 것 입니다.
- 파티션 개수를 줄이는 것은 불가능합니다.
레코드
- 레코드는 타임스탬프, 헤더, 메시지 키, 메시지 값, 오프셋으로 구성되어 있습니다.
- 프로듀서가 생성한 레코드가 브로커로 전송되면 오프셋과 타임스탬프가 지정되어 저장됩니다.
- 브로커에 한번 적재된 레코드는 수정할 수 없고 로그 리텐션 기간 또는 용량에 따라서만 삭제됩니다.
- 레코드의 오프셋은 프로듀서가 생성한 레코드에는 존재하지않고, 프로듀서가 전송한 레코드가 브로커에 적재될 때 오프셋이 지정됩니다.
- 오프셋은 0부터 시작되고 1씩 증가됩니다.
- 컨슈머는 오프셋을 기반으로 처리가 완료된 데이터와 앞으로 처리해야할 데이터를 구분하니다.
- 각 메시지는 파티션별로 고유한 오프셋을 가지므로 컨슈머에서 중복처리를 방지하기 위한 목적으로도 사용합니다.
- 메시지 키는 처리하고자 하는 메시지 값의 분류를 위한 용도로 사용됩니다.
- 이를 파티셔닝이라고 부르며 파티셔닝에 따라 토픽의 파티션 번호가 정해집니다.
- 메시지 키는 필수 값은 아니며 지정하지 않으면 null로 설정됩니다.
- 메시지 키가 null인 레코드는 특정 토픽의 파티션에 라운드 로빈으로 전달되며 null이 아닌 메시지 키는 해쉬값에 의해서 특정 파티션에 매핑되어 전달됩니다
토픽 이름 제약 조건
- 빈 문자열 토픽 이름은 지원하지 않습니다.
- 영어 대, 소문자와 숫자, 마침표(.), 언더바(_), 하이픈(-)조합으로 생성할 수 있습니다.
- 마침표(.)와 언더바(_)가 동시에 들어가면 안됩니다.