728x90
1.토픽과 파티션
- 토픽은 Kafka에서 데이터를 구분하기 위해 사용하는 단위이다. 토픽은 1개 이상의 파티션을 소유하고 있다.
- 파티션에는 Producer가 보낸 데이터들이 들어가 저장되는데 이 데이터를 '레코드' 라고 부른다.
- 토픽 생성 시 파티션은 0번 브로커 부터 시작하여 Round Robin 방식으로 리더 파티션들이 생성 된다.
- Kafka에 파티션은 Consumer가 데이터를 가져 가도 삭제되지 않는다.
- 파티션이 5개인 토픽을 생성했을 경우 리더 파티션들은 아래와 같이 Round Robin 방식으로 생성 된다.
1.1. 특정 브로커에 리더 파티션이 몰린 경우
- 리더 파티션이 몰린 특정 브로커만 Kafka 클라이언트와 통신하기 때문에 CPU, Memory 사용량이 높아진다.
- kafka-resassign-partition.sh 명령으로 파티션을 재분배 할 수 있다.
1.2. 파티션 개수와 Consuumer 개수의 데이터 처리량 관계
- Consumer 개수와 파티션 개수를 동시에 늘리면 데이터 처리량이 증가하는 효과를 볼 수 있다.
- 파티션 개수를 줄이는 것은 불가능하다. 토픽을 삭제하고 재 생성하는 방법 외에는 없다.
초당 10개 데이터가 토픽에 들어오는 데 Consumer가 초당 1개를 처리한다면 데이터 9개 처리는 지연이 발생한다.
이런 경우 파티션과 Consumer 개수를 늘려 데이터 처리 지연을 해결할 수 있다.
2. 레코드
- 레코드는 타임스탬프, 헤더, 메시지 키, 메시지 값, 오프셋으로 구성되어 있다.
- Producer가 생성한 레코드가 브로커로 전송되면 오프셋과 타임스탬프가 지정되어 저장된다.
- 브로커에 한번 적재된 레코드는 수정할 수 없고 로그 Retention 또는 용량에 대해서만 삭제할 수 있다.
- 레코드 구조
2.1. 타임스탬프(timestamp)
- Unix TimeStamp가 포함되며 Producer에서 따로 설정하지 않으면 기본 값으로 ProducerRecord 생성 시간이 들어간다
- LogAppendTime으로 설정하는 경우 브로커에 데이터 적재 시간으로 설정 된다.
- message.timestamp.type 옵션으로 설정할 수 있다.
2.2. 오프셋
- 레코드가 브로커에 적재될 때 오프셋이 지정된다. 오프셋은 0부터 시작하고 1씩 증가한다.
- Consumer는 오프셋을 기반으로 처리가 완료된 데이터와 앞으로 처리해야 할 데이터를 구분한다.
- 각 메시지는 파티션별로 고유한 오프셋을 가지므로 Consumer에서 중복 처리 방지를 위해 사용된다.
2.3. 헤더
- key/value 데이터를 추가할 수 있으며 레코드의 스키마 버전이나 포맷과 같이 데이터 프로세싱에 참고할 정보를 담는다.
2.4. 메시지 Key
- 파티셔닝에 사용하는 메시지 키는 파티셔너에 따라 토픽의 파티션 번호가 정해진다.
- 메시지 키는 필수 값이 아니며, 지정하지 않으면 null로 된다.
- 메시지 키가 null인 레코드는 특정 토픽의 파티션에 Round Robin으로 전달 된다.
2.5. 메시지 Value
- 실질적으로 처리할 데이터가 담기는 공간이다.
3. 클라이언트 메타 데이터
3.1. 클라이언트 메타데이터
- Kafka 클라이언트는 통신하고자 하는 리더 파티션의 위치를 알기 위해 데이터를 주고(Producer) 받기(Consumer)전에 메타 데이터를 브로커로부터 전달 받는다.
- Kafka Producer 메타 데이터 옵션
- metadata.max.age.ms : 메타 데이터를 강제로 Refresh하는 간격. 기본 값은 5분이다.
- metadata.max.idle.ms : Producer가 유휴 상태일 경우 메타 데이터를 캐시에 유지하는 기간. 기본 값은 5분이다.
3.2. 클라이언트 메타 데이터 이슈 발생 경우
- 메타 데이터가 현재의 파티션 상태에 맞게 Refresh 되지 않은 상태에서 잘못된 브로커로 요청을 하면 LEADER_NOT_AVAILABLE Exception이 발생한다.
- 위 에러가 발생하는 경우 메타 데이터 Refresh 간격을 확인하고 클라이언트가 정상적인 메타 데이터를 가지고 있는지 확인이 필요하다.
4. 토픽 이름 설정
4.1. 토픽 이름 제약 조건
- 빈 문자열 토픽 이름은 지원하지 않는다.
- 토픽 이름은 마침표 하나 또는 마침표 둘로 생성될 수 없다.
- 토픽 이름의 길이는 249자 미만으로 생성되어야 한다.
- 토픽 이름은 영어 대, 소문자와 숫자 0부터 9 그리고 마침표(.), 언더바(_), 하이픈(-) 조합으로 생성할 수 있다. 이 외 문자열이 포함된 토픽 이름은 생성 불가하다.
- Kafka 내부 로직 관리 목적으로 사용되는 2개 토픽(_consumer_offsets, _transaction_state)과 같은 이름은 생성 불가하다.
- 마침표와 언더바가 동시에 들어가면 안된다. 생성은 가능 하나 WARNING 메시지가 발생한다.
- Kafka는 토픽 이름 변경을 지원하지 않는다. 토픽을 다시 생성해야 한다.
4.2. 토픽 작명의 템플릿과 예시
- <환경>.<팀명>.<애플리케이션명>.<메시지타입> ex) prd.marketing-team.sms-platform.json
- <프로젝트명>.<서비스명>.<환경>.<이벤트명> ex) commerce.payment.prd.notification
- <카프카 클러스터명>.<환경>.<서비스명>.<메시지타입> ex) aws-kafka.op.marketing-platform.json
728x90
'Message Queue > Kafka' 카테고리의 다른 글
[Kafka]기본 개념-1 (0) | 2024.07.08 |
---|---|
[Kafka]설 치 (0) | 2024.07.08 |
[Kafka] Kafka (0) | 2024.03.11 |