Topic에 메시지를 보낸다.
성능 / 로드밸런싱 / 가용성 / 업무 정합성등을 고려하여
어떤 브로커의 파티션으로 메시지를 보내야 할지전략적
(Key)으로 결정
- Kafka에 데이터를
저장
하는 주체
- Kafka에 데이터를 전송하는 애플리케이션, 서버
- 각각의 메시지를 토픽 파티션에 맵핑
- 파티션 리더에 Write 요청 전송
- 키 값을 정하면,
해당 키를 가진 모든 메시지를 동일한 파티션에 전송 가능
- 키 값을 정하지 않으면,
파티션은Round Robin
방식으로 파티션에 균등하게 분배 (2.4 이전)
2.4 이후에는Sticky Partitioning
으로 분배 전략
- 반드시, 리더 파티션에 있는
Broker
와 통신
- Kafka Broker로 데이터를 전송할 때,
파티셔너
,배치 생성
을 거치게 된다.
- Offset은 레코드가 생성될 때에는 포함하지 않는다.
- Topic과 메시지 값만 있어도 전송하는데에는 문제 없다.
객체 (Object)를 객체의 유형, 데이터의 포맷, 적용 시스템에 상관없이,
이동 / 저장 / 복원을 자유롭게 하기 위해서 바이트 배열 (바이트 스트림)형태로 저장하는 것.
- 객체는 Serialization과 Deserialization을 통해서 System to System 또는 서로 다른 저장영역에 이동 / 저장 / 복원을 자유롭게 수행한다.
Producer Record를 직렬화
- Key, Value를 Serializer를 기반으로 직렬화한다.
- String, byteArray, ByteBuffer...
Producer는 어떤 Topic의 Partition에 Write할 지 결정
- murmur2 알고리즘 기반
- Round-Robin 방식
kafka는 같은 키를 레코드 집합에 전달함으로써 주어진 수의 파티션에 대해 받은 순서대로 메시지를 같은 파티션에 기록하도록 할 것
- 수신된 메시지 순서를 유지하려면 메시지에 적절한 키를 사용하는 것이 중요
- 사용자 지정 파티션을 생산자에게 전달하여 메시지를 작성할 때 사용자 지정 파티션을 제어할 수도 있다.
Record Accumulator에 Write하기 전에 압축
- 처리량 향상, 낮은 지연, 디스크 활용 향상
Record는 Topic의 Partition에 누적
- 네트워크 전송은 매우 무거운 처리
- Producer는 지정된 만큼의 메시지를 저장했다가 한 번에 Broker에게 전달
- 높은 처리량 달성
Record Accumulator
가 담당
RA
가 각 Topic의 Partiton에 대응하는Batch Queue
를 구성하고 메시지들을 Record Batch 형태로 묶어 Queue에 저장
각
Batch Queue
에 저장된 레코드 배치들은 때가 되면 각각 Broker에 전달
- Sender는 Thread 형태로 구성
- Records는 두 가지 조건에 따라 producer에서 전송된다.
- 정의된 배치 크기에 도달
- 정의된 대기 시간에 도달
Default : 1MB
Default : 2147483647
-- 매우 큼Default : 5
Default : 1MB
Default : 1
Default : org.apache.kafka.clients.producer.internal.DefaultPartitioner
UniformStickyPartitioner
Default : false
Default : null
- acks
- 0, 1, -1(all) 중 하나로 선택
뒤로 갈수록 신뢰성이 높다.
- 복제의 정도를 확인하는 것
- acks 옵션에 따라 처리 속도에도 차이가 있다.
Replication Factor
가 1인 경우 변화가 거의 없다.
- 보통 2 이상 설정하므로 acks 별 동작 방식의 이해 필요
Default : 1
- Producer가 전송한 데이터가 Broker들에 정상적으로 들어갔는지 전송 성공 여부를 확인
- ISR (In-Sync-Replica)와 연관이 되어 있다.
- Leader - Follower 파티션 간 복제 시, 시간이 소요
- Leader 파티션에 데이터가 적재된 다음 Follower 파티션이 복제할 때
시간이 소요되기 때문에 Offset 차이가 발생
- Replication Lag
실제 저장까지 되었는지 여부는 확인하지 않는다.
send()를 호출하면 끝
데이터 전송 속도는 가장 빠르다.
데이터 유실을 감당할 수 있는 경우에 사용하면 좋다.
신뢰도가 중간
Producer가 보낸 데이터가 Leader 파티션에 정상적으로 적재되었는지 확인
Follower 파티션까지 데이터 적재 보장을 하지 않는다.
신뢰도가 가장 높음
Producer가 보낸 데이터가 Leader 및 Follower 파티션에 정상적으로 적재되었는지 확인
처리되는 속도 매우 느림
브로커 장애에도 데이터 저장 보장