[궁금점]
kafka publisher로 메시지 전송 시 아래와 같은 궁금점에 대해 테스트해 보았다.
- 동기(sync)와 비동기(async)의 성능 차이가 얼마나 날까?
- topic의 partition 수를 늘리면 성능이 빨라질까?
- producer의 acks 설정이 성능에 어떤 영향을 줄까?
[테스트 환경]
개발환경: spring boot, java 8, spring-kafka
kafka는 원격서버에 위치
single-kafka: brokder 1대
multi-kafka: broker 3대 (replication-factor: 3)
[테스트 방법]
메시지 내용: 100개의 문자열
publisher를 1000번 실행한 시간에 대한 3회 평균 시간
[테스트 코드]
// 동기
@Transactional
public void sendSync(TextMessage message) {
try {
String key = UUID.randomUUID().toString();
kafkaTemplate.send(TopicPublic.TOPIC_NAME, key, message).get();
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
// 비동기
@Transactional
public void sendAsync(TextMessage message) {
String key = UUID.randomUUID().toString();
kafkaTemplate.send(TopicPublic.TOPIC_NAME, key, message);
}
동기(sync)와 비동기(async)의 성능 차이가 얼마나 날까?
파티션 수 1개
- | 동기(sync) | 비동기(async) |
---|---|---|
single broker | 1693(ms) | 14(ms) |
multi broker | 1981(ms) | 10(ms) |
비동기가 동기보다 100배 이상 빠른 것으로 나온다.
topic의 partition 수를 늘리면 성능이 빨라질까?
파티션 수 3개
- | 동기(sync) | 비동기(async) |
---|---|---|
single broker | 1519(ms) | 14(ms) |
multi broker | 3505(ms) | 10 (ms) |
파티션 수를 증가하면 multi broker에서는 오히려 더 늦은 결과가 나온다.
producer의 acks 설정이 성능에 어떤 영향을 줄까?
파티션 수 3개
multi broker에서 실행
- | 동기(sync) | 비동기(async) |
---|---|---|
acks=0 | 127 (ms) | 10 (ms) |
acks=1 | 1914 (ms) | 7 (ms) |
acks=-1(all) | 14277 (ms) | 12 (ms) |
acks=0은 broker의 전송여부를 기다리지 않으므로 빠르다.
acks=1은 자신의 broker에 응답을 기다린다.
acks=-1(all)은 min.insync.replicas만큼 복제가 됨을 기다려야 하므로 느린다. (multi brokder ==> min.insync.replicas: 3)
반응형