so3500 / TIL

0 stars 0 forks source link

2024-02-04 #13

Open so3500 opened 8 months ago

so3500 commented 8 months ago

인프런강의 : 아파치 카프카 애플리케이션 프로그래밍 by 데브원영

so3500 commented 8 months ago

파티션은 카프카 병렬처리의 핵심

그룹으로 묶인 컨슈머들이 레코드를 병렬처리 할 수 있도록 매칭됨 컨슈머의 처리량이 한정된 상황에서 많은 레코드를 병렬로 처리하는 가장 좋은 방법 : 컨슈머 개수 늘리기 (scale out) + 파티션 개수 늘리기 -> 전체 처리량 증가

기본적으로 파티션은 하나의 컨슈머만 가질 수 있다. 1 partition = 1 consumer 컨슈머는 여러개의 파티션 데이터를 소비할 수 있다. 1 consumer = n partition 일부 컨슈머가 장애나더라도 다른 컨슈머에서 데이터를 처리한다.

프로듀서 10개/초 - 컨슈머 1개/초 -> 최소 10파티션, 10컨슈머로 커버가능 지연발생 (컨슈머 렉) 이를 줄이기 위해 컨슈머와 파티션을 늘려 처리량을 늘리는것임

파티션 개수를 줄이는 것은 불가능

카프카에서 파티션 개수를 줄이는 것은 지원하지 않기 때문에 한번 파티션을 늘릴 때 신중해야 한다. 한번 늘리면 줄이는 것은 불가능하므로 토픽을 삭제하고 재생성하는 방법 외에는 없다. 카프카에서는 파티션의 데이터를 세그먼트로 저장하고 있으며 만약 지원한다 하더라도 여러 브로커에 저장된 데이터를 취합하고 정렬해야 하는 복잡한 과정을 거쳐야 하기 때문에 클러스터에 큰 영향이 가게 된다. KIP-692 에서 파티션 개수를 줄이는 것은 논의했지만 더 이 상 진행되지 않고 있음

만약 지원한다고 해도... 특정 디렉토리에 파티션 데이터를 디스크에 저장중. 파티션 줄일 시 이 디렉토리 합치고 조합하고 타임 인덱스 재설정.. 매우 어렵다.

[ 레코드 상세히 살펴보기 ]

레코드

프로듀서가 생성한 레코드가 브로커로 전송되면 오프셋과 타임스탬프가 지정되어 저장됨 브로커에 한번 적재된 레코드는 수정할 수 없고 리텐션 기간 또는 용량에 따라서만 삭제됨

timestamp

offset

headers

key

value

[ 유지보수하기 좋은 토픽 이름 정하기 ]

토픽 이름 제약 조건

빈 문자열 토픽 이름은 지원하지 않는다 토픽 이름은 마침표 하나(.) 또는 마침표 둘(..)로 생성될 수 없다 길이는 249자 미만 허용 문자열 : a-zA-Z0-9 와 마침표(.), 언더바(_), 하이픈(-) 조합으로 생성할 수 있다. 카프카 내부 로직 관리 목적으로 사용되는 2개 토픽 (__cousumer_offsets, __transactionstate) 과 동일한 이름으로 생성가능 카프카 내부적으로 사용하는 로직 때문에 토픽 이름에 마침표(.) 와 언더바()가 동시에 들어가면 안됨 생성은 할 수 있지만 사용시 이슈가 발생할 수 있으므모 마침포(.)와 언더바(_)가 들어간 토픽 이름을 사용하면 WARNING 메시지 발생

의미 있는 토픽 이름 작명 방법

사전에 규칙을 정의하고 구성원들이 잘 따라야 한다. test-20210204, abcd, test 같은 토픽 이름은 누가 어떤 용도로 사용중인지, 어떻게 만들어졌는지 알 수 없으므로 지양한다. 규칙을 따르지 않은 토픽 이름은 기술부채의 원인이 될 수 있다. 단발성으로 생성된 토픽이면 삭제하고 실제 사용을 위한 토픽이라면 삭제 후 신규로 만드는 것을 권장한다.

토픽 작명의 템플릿과 예시

<environment>.<team-name>.<application-name>.<messate-type>
e.g. prd.marketing-team.sms-platform.json

<project-name>.<service-name>.<environment>.<event-name>
e.g. commerce.payment.prd.notification

<environment>.<service-name>.<jira-number>.<message-type>
e.g. dev.email-sender.jira-1234.email-vo-custom

<kafka-cluster-name>.<env>.<service-name>.<message-type>
e.g. aws-kafka.live.marketing-platform.json