kafka 순서 보장
kafka 순서 보장
- kafka는 한 파티션 내에서의 순서는 보장해준다. (단, max.in.flight.requests.per.connection=1 인 경우)
- 그러나 파티션이 여러 개 있을 때, 여러 파티션에 걸쳐 흩어진 item들 간의 순서는 보장 할 수 없다.
- 보내는 쪽에서 순차적으로 1, 2, 3 파티션에 프로듀스 한다고 해도, 받는 쪽에서 어떤 순서대로 파티션에 접근해서 데이터를 가져갈지 알 수 없기 때문이다.
순서 보장하는 법 A - 파티션 1개만 사용한다.
⇒ 완전한 의미의 순서 보장. 보낸 순서대로 받는다. ⇒ 분산처리 X ⇒ 처리량 ⬇
순서 보장하는 법 B - 파티션키 + 파티션 내 순서보장 이용한다
이렇게 전체 파티션들을 아우르는 순서보장은 kafka의 병렬 처리 컨셉 상 불가능하지만
[파티션키로 원하는 파티션에 데이터를 전달 하는 기능 + 파티션 내의 순서가 보장된다는 점]을 이용해서, 어느 정도는 순서를 보장 할 수 있다.
원거래와 취소거래를 kafka로 전달 할 때, 원거래가 항상 먼저 produce 및 consume 되어야 한다고 가정하자.
- 대상 items를 거래key로 sorting해서 불러온다. (거래key값이 더 작은 원거래건이 항상 먼저 불러와진다.)
- 원거래key를 파티션키로 사용해서 produce하면, 원거래와 취소거래가 같은 파티션으로 produce되고, 파티션 내 순서가 보장되기 때문에 항상 원거래가 취소거래 보다 먼저 전달되도록 만들 수 있다. 즉, 특정 그룹에 속하는 item들을 하나의 파티션으로 프로듀스해서 그룹 내 순서만을 보장 하는 방법.
파티션키를 파티션 번호로 변환하는 책임
kafkaTemplate.send시 파티션키를 주면, 동일 key는 동일 파티션으로 들어가는게 보장된다.- key string이 들어왔을 때, 파티션 번호에 해당하는 int값을 자동으로 계산해준다.
- 이건 기본적으로
BuiltInPartitioner가 처리한다.
1
2
3
4
5
6
7
package org.apache.kafka.clients.producer.internals;
public class BuiltInPartitioner {
...
public static int partitionForKey(byte[] serializedKey, int numPartitions) {
return Utils.toPositive(Utils.murmur2(serializedKey)) % numPartitions;
}
}
%연산으로 처리한다.ProducerConfig.PARTITIONER_CLASS_CONFIG를 지정하면 기본 파티셔너를 다른것으로 교체 할 수 있다.
This post is licensed under CC BY 4.0 by the author.