카프카 프로듀서의 주요 기능은 각각의 메시지를 토픽 파티션에 매핑하고 파티션의 리더에 요청을 보내는 것이다.
프로듀서로 메시지 보내기
카프카 옵션 중에 auto.create.topics.enable = true 로 되어있으면
프로듀서가 존재하지 않는 토픽으로 메시지보내면 자동으로 토픽이 생성된다.
콘솔, 자바, 파이썬 등으로 메시지를 보낼 수 있다.
콘솔 프로듀서로 보내기
~ {KAFKA_HOME}/bin/kafka-console-producer.sh \
--broker-list {콤마로 구분된 브로커 목록(호스트명:포트번호)} \
--topic {토픽명}
자바와 파이썬 프로듀서로 보내기
자바와 파이썬으로 보낼 때는 카프카에서 제공하는 라이브러리가 존재하기 때문에 그것을 이용해서 보내면 된다.
기본적으로 프로듀서에서 서버로 메시지를 보내고 성공적으로 도착했는지 확인하지는 않는다.
프로듀서가 자동으로 재전송하므로 대부분 성공하지만 일부 메시지는 손실될 수 있다. 때문에 일반적인 서비스 환경에서는 성공 여부를 확인하여 실패 시에 대한 처리를 한다.
성공 여부를 확인하려면 자바의 경우 send() 메소드의 리턴값인 Future 객체를 받아 get() 메소드를 호출함으로써 확인할 수 있다.
비동기로 전송할 수도 있는데 전송 결과에 대한 콜백을 등록하는 것이다.
비동기로 전송하면 응답을 기다리지 않고 빠른 전송이 가능하며 실패 시에 대한 처리도 할 수 있는 장점이 있다. (에러 로그 출력 등)
[콜백 클래스 예시]
class MyCallback implements Callback {
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (metadata != null) {
System.out.println(metadata);
} else {
exception.printStackTrace();
}
}
}
프로듀서에서 key옵션을 지정해서 특정 파티션으로만 메시지를 보낼 수도 있다. (디폴트값은 라운드로빈 방식임)
프로듀서 주요 옵션
boostrap.servers
카프카 클러스터에 처음 연결하기 위한 호스트와 포트 정보이다. 콤마로 구분해 복수 입력한다.
카프카 클러스터는 클러스터 마스터 개념이 없어서 클러스터 내 모든 서버가 클라이언트의 요청을 받을 수 있다.
호스트 하나만 입력할 수도 있지만 추천하지는 않고 (장애 발생할 수 있으므로) 전체 입력을 권장한다.
acks
프로듀서가 토픽 리더에게 메시지 보내고 요청을 완료 처리하기 위한 ack(승인응답) 수.
작으면 성능이 좋지만 손실 가능성이 있고 크면 성능이 좋지 않지만 손실 가능성도 줄어든다.
acks=0 이면 프로듀서는 서버의 ack를 기다리지 않는다.
acks=1 이면 토픽 리더는 데이터를 기록하지만 모든 팔로워는 확인하지 않는다.
acks=all 또는 -1 이면 리더는 ISR의 모든 팔로워의 데이터의 ack까지 체크한다.
batch.size
프로듀서가 클러스터로 배치로 보낼 갯수.
성능 개선을 위해 배치 처리를 하는데 이 값으로 갯수를 조절한다.
linger.ms
배치로 메시지를 보내기 전에 추가적인 메시지를 기다릴 최대 시간.
배치 사이즈에 도달하면 이 값과 상관없이 보내지만 도달하지 않아도 이 시간이 흐르면 전송을 한다.
0이 기본값(지연 없음)이다.
(batch.size를 설정한다면 이 값은 필수로 같이 바꿔줘야할 듯하다.)
케이스에 따른 전송 옵션값 설정
1. 손실 가능성이 높지만 빠른 전송 필요한 경우
acks=0으로 설정
2. 손실 가능성이 적고 적당한 속도의 전송이 필요한 경우
acks=1로 설정.
프로듀서가 리더의 ack만 기다리기 때문에 속도도 적당히 빠르고 손실 가능성도 적다.
손실이 발생하는 경우는 리더에 장애가 발생하는 경우이다.
최근 프로듀서 애플리케이션으로 많이 사용하는 로그스태시, 파일비트등에서 acks 옵션 기본값을 1로 하고 있고
다른 프로듀서 애플리케이션들도 1을 기본값으로 하는 경우가 많다.
특별한 경우가 아니라면 속도와 안정성을 확보할 수 있는 1을 추천한다.
3. 속도는 느리지만 손실이 없어야 하는 경우
acks=all로 설정.
손실없는 메시지 전송을 원한다면 다른 옵션값들도 같이 신경써줘야 하는데,
손실없는 메시지 전송을 원한다면 다음과 같이 설정해야 한다.
acks=all
min.insync.replicas=2
토픽 리플레케이션 팩터=3
min.insync.replicas를 3이 아닌 2로 설정해야 하는 이유는
3으로 설정되면 브로커 하나만 다운되더라도 카프카로 메시지를 보낼 수 없는 상황이 되기 때문이다.
하지만 브로커가 2대 이상 다운되는 상황에서는 위 옵션으로도 장애가 발생할 수 있다.
'개발' 카테고리의 다른 글
자주 사용하는 Docker 명령어 모음 (0) | 2021.10.22 |
---|---|
카프카, 데이터 플랫폼의 최강자 - 6장 카프카 운영 가이드 (0) | 2020.09.12 |
카프카, 데이터 플랫폼의 최강자 - 3장 카프카 디자인 (0) | 2020.08.30 |
카프카, 데이터 플랫폼의 최강자 - 2장 카프카 설치 (0) | 2020.08.26 |
카프카, 데이터 플랫폼의 최강자 - 1장 카프카란 무엇인가 (0) | 2020.08.24 |