카프카(Kafka) clients의 직렬화(serialization)와 역직렬화(deserialization) 실습

카프카(Kafka) 클라이언트(producer와 consumer)의 serialization(직렬화)와 deserialization(역직렬화)에 대해 알아보겠습니다.

  • 지난 번 내용 (click)에서 이어집니다.
  • producer 코드에서 토픽을 test-serde로 변경합니다. serialize(직렬화)에 사용하는 StringSerializerIntegerSerializer도 확인합니다.  
프로듀서 직렬화(serialization)
* 카프카 브로커는 데이터를 byte array(바이트 배열)로 저장합니다. 쉽게 말해 01001001101011와 같은 이진 데이터(binary data)로 저장합니다. 프로듀서에서 "Hello"와 같은 String 데이터를 직렬화(serialize)하여 01011010101로 변환한 뒤 브로커에 보냅니다. 컨수머는 byte array를 역직렬화합니다.

* 카프카 레코드(메세지)는 Key(키) Value( 값) Pair(쌍)로 되어있습니다. 그래서 key와 value를 둘 다 직렬화합니다.
  • 저번에 추가한 카프카 jar 파일 안에 직렬화/역직렬화와 관련된 클래스를 확인합니다.
카프카 클라이언트 직렬화/역직렬화 클래스

*kafka-clients jar안에 있습니다. producer와 consumer는 카프카 클라이언트입니다.
  • producer를 runnable jar로 export합니다.
  • PowerShell을 열어서 export한 jar 파일을 실행합니다. java -jar .\test-serde.jar
* test-serde토픽을 생성하지도 않았는데 프로듀서가 브로커로 데이터를 보낼 수 있는 이유는 카프카가 디폴트로 producer나 consumer가 없는 토픽을 찾으면 자동으로 토픽을 만듭니다. (auto.create.topics.enable) 하지만 오타로 원치 않는 토픽이 생겨나기 때문에 false로 설정하는 게 좋습니다.

  • test-serde 토픽에서 데이터를 consume 합니다. .\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test-serde --from-beginning

* 이상하게 0부터 9999까지의 숫자가 보이지 않습니다. 이유는 역직렬화를 할 때 value deserializer를 정해주지 않아서입니다.  value(값)을 IntegerSerializer로 직렬화했기 때문에 브로커에서 데이터를 받을 때 IntegerDeserializer로 역직렬화해야 합니다.
  • 컨트롤 + c로 나와서 .\kafka-console-consumer.bat 를 실행해 --value-deserializer옵션을 확인합니다.
kafka-console-consoumer.bat을 실행하고 value-deserialzer 옵션 확인
  • deserializer를 추가해서 재실행하고 결과를 확인합니다. (지난 번 consumer 코드에 사용했던 value deserializer를 사용하면 됩니다.)  .\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test-serde --from-beginning --value-deserializer org.apache.kafka.common.serialization.IntegerDeserializer 

Comments