Import project from github
Producer
- 카프카로 데이터 (key, value) 전송
- ProducerRecode 객체를 생성
- Java Kafka-client 제공
- 그 외 3rd party language의 경우 아래 링크 참고
- https://cwiki.apache.org/confluence/display/KAFKA/Clients
Clients - Apache Kafka - Apache Software Foundation
How The Kafka Project Handles Clients Starting with the 0.8 release we are maintaining all but the jvm client external to the main code base. The reason for this is that it allows a small group of implementers who know the language of that client to quickl
cwiki.apache.org
- 어떤 데이터를 보낼까?
- Web, Application 클릭 로그
- 공유 자전거/자동차의 위치 정보
- 스마트팩토리 공장의 머신 센서정보
- 상호 통신하기 위한 application
- 기타 등,,
Dependency
dependencies {
compile group: 'org.apache.kafka', name: 'kafka-clients', version: '2.5.0'
}
- 일부 카프카 브로커와 클라이언트 버전의 호환에 이슈가 있음
PRACTICE - Simple producer code
- import한 프로젝트 내 simple-kafka-producer 폴더 참고
- Producer Options
- bootstrap.servers : 카프카 클러스터에 연결하기 위한 브로커 목록
- key.serializer : 메시지 키 직렬화에 사용되는 클래스
- value.serializer : 메시지 값을 직렬화 하는데 사용되는 클래스
- 선택옵션 - default 값 존재
- acks : 레코드 전송 신뢰도 조절 (리플리카)
- comression.type : snappy, gzip, lz4 중 하나로 압축하여 전송
- retries : 클러스터 장애에 대응하여 메시지 전송을 재시도하는 횟수
- buffer.memory : 브로커에 전송될 메시지의 버퍼로 사용될 메모리 양
- batch.size : 여러 데이터를 함께 보내기 위한 레코드 크기
- linger.ms : 현재의 배치를 전송하기 전까지 기다리는 시간
- client.id : 어떤 클라이언트인지 구분하는 식별자
- 실행결과
- 코딩으로 ProducerRecode 객체를 생성하여 원격지로 produce
- 원격지 consumer을 이용하여 produce 한 데이터 확인
- bin\windows\kafka-console-consumer.bat --bootstrap-server {aws ec2 public ip}:9092 --topic test --from-beginning
Producer
PRACTICE - Produce with key/value records
- import한 프로젝트 내 kafka-producer-key-value 폴더 참고
- ProducerRecord<String, String> record = new ProducerRecord<>(TOPIC_NAME, Integer.toString(index), data);
- Integer.toString(index) - KEY
- data - VALUE
- 실행결과
- 코딩으로 ProducerRecode 객체를 (KEY/VALUE) 형식으로 생성하여 원격지로 produce
- 원격지 consumer을 이용하여 produce 한 데이터 확인
- bin\windows\kafka-console-consumer.bat --bootstrap-server {aws ec2 public ip}:9092 --topic test --property print.key=true --property key.separator="-"
- --property print.key=true / KEY 프린트
- --property key.separator="-" / KEY와 VALUE의 구분자
Record Key
- 레코드 키
- 역할 : 메시지를 구분하는 구분자 역할
- 특징
- 동일 키, 동일 파티션 적재 by Default partitioner
- 순서를 보장하므로 상태 머신(state machine)을 사용 가능
- 역할에 따른 컨슈머 할당 적용 가능
- 레코드 값(value)를 정의하는 구분자
- 키에 레코드 값 해수값을 넣음으로써 중복처리 방지 기능
Record Value
- 레코드 값
- 역할 : 실질적으로 전달하고 싶은 데이터
- 어떤 형(type)을 보낼 수 있나요?
- String, ByteArray, Int 등 사실상 제한 없음
- 어떤 데이터포맷이 좋나요?
- CSV, TSV, JSON, Object 등 서비스의 특징에 맞게 사용 권장
- JSON 사용 시
- key/value 형태로서 확장성이 뛰어남. 컬럼 정보(key) 포함
- CSV 사용 시
- comma(,) 기준으로 데이터 구분, 용량 이득
- 포맷을 관리하는 다른 방법?
- 컨플루언트 스키마 레지스트리
- 어떤 형(type)을 보낼 수 있나요?
PRACTICE - Produce exact partition
- import한 프로젝트 내 kafka-producer-exact-partition 폴더 참고
- ProducerRecord<String, String> record = new ProducerRecord<>(TOPIC_NAME, PARTITION_NUMBER, Integer.toString(index), data);
- PARTITION_NUMBER
- 실행결과
- 코딩으로 ProducerRecode 객체를 (KEY/VALUE) 형식으로 생성하여 원격지로 1번 파티션에 produce
- 원격지 consumer을 이용하여 produce 한 데이터 확인
- bin\windows\kafka-console-consumer.bat --bootstrap-server {aws ec2 public ip}:9092 --topic test --property print.key=true --property key.separator="-"
- bin\windows\kafka-console-consumer.bat --bootstrap-server {aws ec2 public ip}:9092 --topic test --property print.key=true --property key.separator="-"
Producer acks
- acks = 0
- 가장 속도가 빠름, 유실 가능성이 높음
- 프로듀서가 브로커와 소켓 연결을 맺어 보낸 즉시 성공으로 간주
- 브로커가 정상적으로 받아서 리더 파티션에 저장했는지는 알 수 없음
- 팔로워 파티션에도 저장되고 있는지 알 수 없음
- 전송 속도가 중요하고 일부 유실되어도 무관한 데이터에 사용
- 전송 속도가 중요하고 일부 유실되어도 무관한 데이터에 사용
- acks = 1(default)
- 속도 보통, 유실 가능성이 있음
- 프로듀서가 보낸 메시지가 리더 파티션에 정상 저장되었는지 확인
- 팔로워 파티션에 저장되었는지는 모름
- 즉, 리더 파티션에 저장되고 해당 브로커가 죽으면 데이터 유실
- acks = 0에 비해 신뢰도가 높지만 아직 유실 가능성은 있음
- acks = 0에 비해 신뢰도가 높지만 아직 유실 가능성은 있음
- acks = all 또는 -1
- 속도 가장 느림, 메시지 전달 손실 가능성 없음
- 프로듀서가 보낸 메세지가 리더, 팔로워 파티션에 정상 저장되었는지 확인
- 리더 파티션의 데이터가 팔로워 파티션까지 복제될 때 까지 기다린다.
- 복제가 완료되기 까지 기다림으로 인해 속도가 드리다.
- 유실 가능성이 없지만, 속도가 느리다.
- 유실 가능성이 없지만, 속도가 느리다.
'DataBase > Kafka' 카테고리의 다른 글
Kafka 활용 실습 (0) | 2021.12.01 |
---|---|
Kafka Consumer application (0) | 2021.12.01 |
Kafka 설치, 실행, CLI (0) | 2021.11.25 |
Kafka 기본개념 및 생태계 (0) | 2021.11.25 |