-
[Kafka] - 4. Producer개발/Kafka 2022. 8. 4. 16:10
Producer
Producer는 Kafka에 Data를 넘겨주는 역할을 한다. ( Message = Data = Record = Event )
1. Header(metadata)
Topic, Partition, timestamp.. etc
2. Body
Key-value
Producer Record - Kafka는 Data를 Byte Array로 저장한다.
- Byte Array로 저장하기 위하여 Produce는 Data를 Serialize하며, Consumer는 Data를 확인 하기 위해 deserialze해야 한다.
- Key-value용 Serializer를 설정하기 위해서 아래 코드와 같이 사용한다고 한다.
Properties props = new Properties(); props.put("bootstrap.servers", "localhost:4242"); props.put("acks", "all"); props.put("retries", 0); props.put("batch.size", 16384); props.put("linger.ms", 1); props.put("buffer.memory", 33554432); props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer"); props.put("value.serializer", "org.apache.kafka.common.serialization.arovSerializer");
Kafka Serialize and Deserialize High-level Architecture with Producer
실제 구현으로는 Record를 생성 후 Send() 함수를 호출하면 되지만, 라이브러리가 동작하는 원리를 나타낸 것
- Data를 Serialize한 다음에 Partitioner(어떤 파티션에 할당할 것인지) 확인 한 후 Compress(압출할 것인지)를 통해 Topic내 Partition에 저장한다.
- Kafka는 Data를 제대로 저장한지 여부를 알려주며 성공한다면 metedata를 return하여 준다. 실패 시에는 retry를 시도한 다음에, 특정 갯수만큼 이후에는 Exception처리한다.
High-level Architecture Partitioner의 역할
Message(data)를 Topic의 어떤 Partition에 보낼지를 선택하여 준다.
Algorithm
- Key가 존재하는 지 여부에 따라 달라진다.
Hash(key)%(number of partition)
Default Partitioner
Key가 없는 경우, 버전에 따라 처리하는 방법이 다르다.
- Kafka 2.4 버전 아래인 경우에는 각 Data에 대해 Round Robin으로 처리하게 된다.
- 이 때 Batch 형태로 Message를 보내게 되면 Message가 덜 처리되었음에도 불구하고 전송하는 문제가 발생한다.
Round-Robin - 이에 따라 2.4 버전 이후에는 Sticky 라는 정책을 펼친다.
- 하나의 Batch가 닫힐 때 까지 Partition에게 Record를 전송 및 Random Partition을 선택하여 처리한다.
- 결국 Data가 1,2,3,4,5,6으로 나누어져 있고 Partition이 6개 있고 하나의 Batch에 3개를 처리한다고 가정해보면
- 한번의 Send에 Partition1은 1,2,3을 받아 처리하고 Partition5는 4,5,6을 받아 처리한다.
- 이렇게 하면 결국 Send는 2번으로 Broker는 2번의 작업만 처리해주면 된다.
Sticky '개발 > Kafka' 카테고리의 다른 글
[Kafka] - 6. Replication (0) 2022.08.04 [Kafka] - 5. Consumer (0) 2022.08.04 [Kafka] - 3. Broker&Zookeeper (0) 2022.08.03 [Kafka] - 2. Topic&Partition&Segment (0) 2022.08.03 [Kafka] - 1. What is Apache Kafka (0) 2022.08.03