kafka / / 2022. 12. 23. 07:13

kafka publisher의 성능 비교

[궁금점]
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)

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유