중화사전망 - 자전 검색 - 카프카 데이터 소비

카프카 데이터 소비

소비자들은 구독의 주제에서 메시지를 추출할 책임이 있으며, 소비자 집단은 논리적 개념이다. 한 소비자는 한 소비자 그룹에만 속하고, 한 소비자 그룹에는 한 명 이상의 소비자가 포함됩니다. 메시지가 주제에 게시되면 각 소비자 그룹에 전달되지만 각 소비자 그룹 중 한 명의 소비자만 메시지를 소비할 수 있습니다.

소비자들은 어떤 구역을 소비하는지 어떻게 알 수 있습니까? 소비자 그룹의 소비자 수가 변경될 때 구역 분배는 어떻게 변경됩니까?

총 소비자 수와 총 파티션 수를 나누어 하나의 스팬을 얻은 다음 스팬에 따라 구역을 균등하게 분배하여 구역이 모든 소비자에게 최대한 고르게 분산되도록 합니다. 각 주제에 대해 이 전략은 이름의 사전 순서에 따라 소비자 그룹의 모든 소비자를 정렬한 다음 각 소비자에 대해 고정 분할 범위를 나눕니다. 균등하게 분산되지 않은 경우 사전 순서가 가장 높은 소비자는 추가 파티션을 할당합니다.

N= 분할 수/소비자 수, m= 분할 수% 소비자 수를 가정한다면, 처음 M 명의 소비자들은 각각 n+ 1 개의 분할 영역을 할당하고, 그 뒤에 있는 각 소비자들은 N 개의 분할 영역을 할당한다.

그림과 같이 주제에는 7 개의 파티션이 있습니다. 이 시점에서 소비자 그룹 중 단 한 명의 소비자 C0 만 있고, C0 은 7 개 구역에 가입했습니다.

소비자 집단에 대한 소비자의 참여도가 높아지면서 구역은 C0 에서 C 1~C6 으로 점차 분배되고 있다. 마지막 소비자 C7 이 가입하면 항상 8 명의 소비자가 있지만 7 개의 구역만 있기 때문에 C7 은 구역을 할당할 수 없기 때문에 어떤 메시지도 소비할 수 없습니다.

소비자가 많을수록 좋다. 소비자의 수는 파티션의 수보다 작거나 같아야 합니다. 그렇지 않으면 자원이 낭비될 수 있습니다.

단점:

소비자 그룹이 4 개의 파티션이 있는 두 개의 주제에 가입하면 파티션 할당 결과는 다음과 같습니다. 이러한 결과는 비교적 균일합니다.

그러나 두 주제에 각각 세 개의 파티션이 있는 경우 다음과 같은 문제가 발생합니다. 비슷한 상황이 확대되면 소비자 과부하 문제가 발생할 수 있다.

소비자 그룹의 모든 소비자 및 소비자가 가입한 모든 주제의 파티션은 사전 순서로 정렬된 다음 폴링을 통해 각 소비자에게 순차적으로 할당됩니다. 소비자 그룹의 소비자 가입 정보가 동일하면 분할 영역 할당이 더욱 균일해집니다. 예를 들어, 한 소비자 그룹의 두 소비자가 그림과 같이 3 이 있는 두 파티션의 주제에 가입했습니다.

그러나, 소비자층의 소비자들의 가입 정보가 다를 때, 불균형한 분포 문제가 발생할 수 있다. 그림과 같이 소비자 그룹에 세 명의 소비자가 있고 테마 1/2/3 에는 각각 1/2/3 개의 파티션이 있다고 가정합니다. C0 구독 주제 1, C 1 구독 주제 1 및 2, C2 구독 주제 1/2/3, 분할 결과는 다음과 같습니다.

이 전략은 나중에 도입되었습니다. 주요 목적은 다음과 같습니다.

세 명의 사용자가 각각 두 개의 파티션이 있는 네 개의 주제에 가입한다고 가정하면 초기 파티션 할당 결과는 다음과 같습니다.

언뜻 보면 결과는 RoundRobin 할당 전략과 동일하지만, 이 시점에서 C 1 오프라인 상태인 경우 소비자 그룹은 밸런싱 조정 작업을 수행하고 메시지 분할 영역을 재할당합니다. 순환 정책의 경우 할당 결과는 다음과 같습니다.

점성 할당 전략의 경우 결과는 다음과 같습니다.

StickyAssignor 는 C0 과 C2 의 최종 할당 결과를 유지하고 C 1 의 파티션을 C0 과 C2 에 할당하여 균형을 조정합니다.

분할 재분배가 발생하는 경우 동일한 분할 영역에 대해 이전 소비자와 새로 지정된 소비자가 다를 수 있으며 이전 소비자의 처리가 새로 지정된 소비자 간에 다시 반복되어 중복 소비가 발생할 수 있습니다. StickyAssignor 할당 정책은 이름 "Sticky" 와 마찬가지로 할당 정책을 "점성" 으로 만들고 이전 및 다음 할당을 가능한 한 동일하게 만들어 시스템 리소스 손실 및 기타 예외 사항을 줄입니다.

RoundRobinAssignor 의 예를 들어 소비자의 가입 정보가 다른 경우를 살펴보겠습니다.

소비자 그룹에 세 명의 소비자가 있고 테마 1/2/3 에는 각각 1/2/3 개의 파티션이 있다고 가정합니다. C0 구독 주제 1, C 1 구독 주제 1 및 2, C2 구독 주제 1/2/3, RoundRobinAssignor

StickyAssignor 를 사용할 경우 분할 영역 할당 결과는 다음과 같습니다.

C0 이 현재 오프라인인 경우 RoundRobinAssignor 재할당의 결과는 다음과 같습니다.

StickyAssignor 재할당의 결과는 다음과 같습니다.

결론적으로:

StickyAssignor 할당 전략의 장점은 분할 영역을 "점성" 으로 재할당하고 불필요한 분할 영역 이동을 줄일 수 있다는 것입니다 (한 소비자 앞의 분할 영역을 분리하여 다른 새 소비자에게 할당).

Kafka 의 메시지 소비는 풀 패턴을 기반으로합니다.

Kafka 는 다음과 같은 형식으로 메시지 그룹을 한 번에 추출합니다.

메서드를 추출할 때마다 사용되지 않은 메시지 세트가 반환됩니다. 이 기능을 실현하기 위해서는 지난 소비 시의 소비 변위를 알아야 하고, 소비자는 소비 메시지를 마친 후 소비 변위를 제출해야 하며, 소비 변위는 지속되어야 하며 __consumer_offsets 주제에 저장해야 한다.

현재 인출 메시지의 최대 오프셋은 x 이고, 소비자 소비 완료 제출 변위의 오프셋은 실제로 x+ 1 이며, 이는 다음 인출 메시지의 시작 위치를 나타냅니다.

자동 커밋

기본값은 자동 커밋 (auto-submit) 으로, 기본값은 5s 마다 파티션당 최대 메시지 변위를 커밋합니다. 실제 제출 작업은 메시지를 가져오는 논리에서 수행됩니다. 메시지를 당길 때마다 오프셋을 제출할 수 있는지 여부를 결정하고, 가능한 경우 마지막 오프셋을 제출합니다. 다음 그림과 같이 두 가지 문제가 있습니다.

반복 소비: 현재 메시지 X+2 및 X+7 을 당기고 있으며 현재 소비는 X+5 에 도달했습니다. 소비자 변위를 제출하기 전에 소비자는 하향식입니다. 새로운 소비자들은 여전히 X+2 에서 메시지를 끌어다가 중복 소비를 초래할 것이다.

메시지 누락: 현재 메시지 X+2 및 X+7 을 당기고 있으며 현재 X+5 를 사용하고 있습니다. 다음 당기기에 소비 변위가 X+8 로 제출되었습니다. 이때 소비자가 다운되면 새 소비자는 X+8 부터 소비하게 되며, 이로 인해 X+5 부터 X+7 까지의 메시지가 소비되지 않아 메시지가 손실됩니다.

수동 커밋

동기식 및 비동기식 커밋.

동기화 제출은 기본적으로 X+2 및 X+7 의 이 풀 메시지와 같은 이 풀 파티션 메시지의 최대 오프셋으로 설정되고 동기화 커밋 X+8 의 기본 커밋 위치입니다. 이때 동기화 커밋은 커밋된 오프셋을 지정할 수도 있습니다. 예를 들어 한 번의 커밋은 1 번 소비됩니다. 커밋 자체는 동기화 작업이므로 성능이 어느 정도 소모됩니다.

동시 제출은 소비가 완료된 후 제출 전 소비자 가동 중지 시간과 같은 반복 소비 문제도 야기할 수 있습니다.

비동기 제출 소비자 스레드는 차단되지 않으므로 성능이 향상되지만 비동기 제출 실패 재시도로 인해 제출 변위가 덮어쓰여지는 문제가 발생할 수 있습니다 (예: 비동기 제출 offset=X 실패, 다음 비동기 제출 offset=X+y 성공). 이 시점에서 이전 커밋이 재시도되고 offset=x 가 다시 제출됩니다. 업무에 재시도 검사가 없을 경우 상계를 덮어 결국 중복 소비를 초래할 수 있다.

새로운 소비자 그룹이 수립되고 소비자가 새로운 주제에 가입하거나 이전에 제출한 변위 정보가 만료되어 삭제된 경우 기록된 소비 변위를 찾을 수 없습니다. Kafka 는 최신 또는 가장 빠른 것부터 사용하도록 구성할 수 있습니다.

Kafka 는 또한 특정 변위부터 소비를 지원하여 역추적 소비를 가능하게 한다. Kafka 내부에서는 Seek () 메서드를 제공하여 소비 교체를 재설정합니다.

지정된 시간 이후의 메시지를 역추적해야 하는 경우 먼저 offsetsForTimes 메서드를 사용하여 지정된 시간 이후 첫 번째 메시지의 변위를 찾은 다음 seek 를 사용하여 변위를 재설정할 수 있습니다.

파티션의 소유권은 한 소비자에서 다른 소비자로 이전되어 소비자 집단의 고가용성과 확장성을 보장하므로 소비자를 쉽고 안전하게 삭제하거나 추가할 수 있습니다.

Kfaka 는 그룹 coordinator 와 ConsumerCoordinator 를 제공합니다. 전자는 소비층을 관리하고, 후자는 전자와 상호 작용하는 것을 책임진다. 둘 중 가장 중요한 임무는 운영의 균형을 재조정하는 것이다.

예를 들어, 소비자가 소비자 단체에 가입할 때 소비자, 소비자 단체 및 단체 코디네이터는 일반적으로 다음과 같은 몇 가지 단계를 거칩니다.

1 단계 (코디네이터 찾기)

소비자는 자신이 속한 소비자 그룹에 해당하는 GroupCoordinator 가 있는 에이전트를 식별하고 에이전트와 통신할 수 있는 네트워크 연결을 만들어야 합니다.

소비자는 적절한 그룹 조정자를 찾기 위해 클러스터의 한 노드에 FindCoordinatorRequest 를 보냅니다.

Kafka 는 다음 그림과 같이 요청에 있는 coordinator_key (즉, groupld) 의 해시를 기준으로 __consumer_offsets 의 파티션 번호를 계산합니다. 해당 분할 영역을 찾은 후 해당 분할 영역의 leader 복제본이 있는 broker 노드를 찾습니다. 이 노드는 현재 소비자 그룹이 있는 group coordinator 노드입니다.

소비자 그룹의 최종 파티션 할당 시나리오와 그룹 내 소비자가 제출한 소비자 교체 정보가 브로커 노드로 전송됩니다. Broker 노드는 GroupCoordinato 의 역할뿐만 아니라 그룹 내 소비자 변위와 파티션 할당 체계를 보존하는 역할을 하여 대량의 중간 회전으로 인한 불필요한 오버헤드를 줄일 수 있습니다.

2 단계 (단체 가입)

소비자 그룹에 해당하는 그룹 코디네이터를 성공적으로 찾으면 소비자는 소비자 그룹 가입 단계에 들어간다. 이 단계에서 사용자는 JoinGroupRequest 요청을 GroupCoordinator 에 보내고 응답을 처리합니다.

다음 작업은 주로 그룹 코디네이터 내에서 수행됩니다.

* * * * 소비자 팀장을 선출하다.

현재 팀에 팀장이 없다면, 처음으로 소비팀에 가입한 사람이 팀장이다. Leader 가 전화를 끊으면 그룹 코디네이터는 내부적으로 유지 관리되는 HashMap (소비자 정보, 키워드 member_id) 에서 첫 번째 키워드를 새 leader 로 선택합니다.

선거 구역 할당 전략

위에서 설명한 바와 같이 각 소비자는 다음과 같이 여러 파티션 할당 전략을 보고할 수 있습니다.

3 단계 (동기화 그룹)

Leader 소비자는 2 단계에서 획득한 조닝 (zoning) 할당 정책에 따라 조닝 (zoning) 할당을 구현한 다음 할당 결과를 그룹 조정자와 동기화합니다. 각 소비자는 그룹 조정자에게 SyncGroupRequest 요청을 전송하여 할당 시나리오를 동기화합니다.

요청 구조는 그림과 같이 리더가 보낸 요청에는 group_assignment 가 있습니다.

여기에는 각 소비자에 대한 특정 배포 체계가 포함되어 있습니다. 여기서 member_id 는 소비자의 고유 식별자를 나타내고, member_assignment 는 그림과 같이 소비자에 대한 배포 시나리오입니다.

특정 파티션 할당 시나리오를 받으면 소비자는 하트비트 작업을 시작하고 그룹 조정자에게 정기적으로 하트비트 요청을 전송하여 온라인 상태를 확인합니다.

4 단계 (하트비트)

정식 소비를 하기 전에 소비자는 메시지를 끌어들이는 시작 위치도 결정해야 한다. 이전에 마지막 소비 변위가 성공적으로 제출되었다고 가정하면 소비자는 마지막으로 제출된 소비 변위를 요청하고 여기서 소비를 계속할 것입니다.

하트비트 스레드는 폴링 메시지의 간격에서 보낼 수 있는 독립 스레드입니다. 만약 소비자들이 심장 박동 전송을 충분히 오래 멈추면 그룹 코디네이터는 소비자가 이미 죽었다고 생각하고 재조정 행위를 트리거할 것이다.