Foreign-Key Join(KIP-213) — 재키잉 없이 서로 다른 키의 테이블을 조인한다
Kafka Streams Foreign-Key Join(KIP-213) 및 KIP-441(Smooth Scaling Out) 공식 문서·기술 블로그 종합 (웹 리서치, 2026) — Apache Kafka KIP-213(Support non-key joining in KTable), KIP-441(Smooth Scaling Out for Kafka Streams), Confluent 공식 블로그 Apache Kafka KIP-213: Support non-key joining in KTable, Confluent 공식 블로그
이 모듈을 다 읽으면
- 일반 KTable-KTable 조인이 왜 co-partitioning(같은 키)을 전제하는지, foreign-key join은 이걸 어떻게 우회하는지 설명할 수 있다
- 구독(subscription)-응답(response) 메시지 패싱 방식이 전체 테이블 복사 없이 조인을 가능하게 하는 원리를 설명할 수 있다
kafka-learn-65에서 다룬 GlobalKTable(전체 복제로 co-partitioning을 우회)과는 다른 방식으로, Foreign-Key Join(KIP-213)이 파티션 단위 분산은 그대로 유지하면서 서로 다른 키의 두 KTable을 조인하는 메커니즘을 정리한다.
왜 일반 KTable-KTable 조인은 같은 키를 전제하는가
일반적인 프라이머리 키 조인은 양쪽 테이블의 같은 파티션을 같은 노드에 배정하기만 하면, 그 노드가 로컬에서 바로 조인 결과를 계산할 수 있다는 단순한 전제 위에 서 있다 — 이게 co-partitioning이다. 그런데 foreign-key join은 서로 다르게 키가 지정되고 다르게 파티셔닝된 두 테이블을 다룬다. 'A 테이블과 B 테이블의 같은 파티션을 같은 노드에 배정한다'는 단순한 방식이 애초에 통하지 않는다 — 두 테이블의 파티셔닝 기준 자체가 다르기 때문이다.
핵심 포인트
- 일반 프라이머리 키 조인: 양쪽 테이블의 같은 파티션을 같은 노드에 배정 → 로컬에서 바로 조인 가능(co-partitioning 전제)
- foreign-key join: 두 테이블의 키·파티셔닝 기준 자체가 다름 — '같은 파티션을 같은 노드에' 방식이 통하지 않음
구독-응답 메시지 패싱 — 전체 테이블 복사 없이 조인한다
kafka-learn-65의 GlobalKTable은 이 문제를 '아예 전체를 복제해서 로컬에 다 갖고 있자'는 방식으로 우회했다. Foreign-key join은 다른 방식을 쓴다 — 왼쪽(예: Product) 테이블의 태스크가 갱신을 받으면, 그 레코드가 참조하는 외래키를 기준으로 오른쪽(예: Merchant) 테이블의 담당 태스크에게 '구독(subscription)' 메시지를 보낸다. 오른쪽 태스크는 '이 특정 Merchant에 관심 있는 Product가 있다'는 사실을 기록해둔다. 이후 오른쪽(Merchant) 쪽에 갱신이 생기면, 합성 키(composite key) 기반의 내부 상태 저장소에서 그 접두사(prefix)로 스캔해 매칭되는 구독자들을 찾아 응답 메시지를 보내준다. 이 방식은 GlobalKTable처럼 전체를 복제하지 않고도, 파티션 단위 분산을 유지한 채 조인을 가능하게 한다.
핵심 포인트
- 왼쪽 테이블 갱신 시 외래키 기준으로 오른쪽 담당 태스크에 '구독' 메시지 전송 → 오른쪽이 관심 있는 왼쪽 레코드를 기록
- 오른쪽 갱신 시 합성 키 기반 내부 저장소를 prefix scan해 매칭되는 구독자에게 '응답' 메시지 전송 — GlobalKTable과 달리 전체 복제 없이 파티션 분산을 유지한 채 조인
전형적 용도 — CDC 토픽을 수동 재키잉 없이 조인하기
이 기능이 해결하는 가장 흔한 문제는 CDC(Change Data Capture)로 관계형 DB의 여러 테이블을 각각 Kafka 토픽으로 캡처했을 때 생긴다 — 이런 레코드는 보통 외래키 참조를 그대로 담고 있어서, KIP-213 이전에는 조인하려면 최소 한쪽 토픽을 수동으로 재키잉(re-key)해야 했다. Foreign-key join은 값(value)에서 추출한 필드를 기준으로 두 토픽을 곧바로 조인할 수 있게 해, 필요한 재키잉을 자동으로 처리해준다 — 정규화된 DB 테이블들을 즉석에서 역정규화(denormalize)하는 전형적 시나리오다.
핵심 포인트
- CDC로 캡처한 여러 DB 테이블 토픽은 보통 외래키 참조를 담고 있어, 이전엔 조인 전 수동 재키잉이 필요했음
- Foreign-key join은 값에서 추출한 필드 기준으로 재키잉 없이 즉석 조인 — 정규화된 테이블들을 즉석 역정규화하는 전형적 용도