Kryo Serializer 공부/BE, DB

Date 2022. 12. 27. 16:14

Kryo is a fast and efficient binary object graph serialization framework for Java. The goals of the project are high speed, low size, and an easy to use API. The project is useful any time objects need to be persisted, whether to a file, database, or over the network.

Background

Redis 와의 입출력이 많은 어플리케이션의 경우 serilaize / deserialize cost를 고민해볼 필요가 있음
현재 개발중인 어플리케이션에서는 network bandwidth 확보를 위해 bytecode로 serialize 후 GZip을 적용해 압축까지 해서 저장함
async profiler로 JVM 리소스 할당량 떠보면 CPU I/O , Heap allocation 모두 상위 차지 하고 있음.

Kryo?

  • Java 객체를 효율적으로 + 빠르게 serialize 하는 라이브러리

장점

  • backward compatibility 같이 호환성에 대해서도 고려해주는 Serializer도 있음
  • 굉장히 빠름

단점

  • serialize를 하는 kryo 객체가 thread safe 하지 못함 (Kryo is not thread safe. Each thread should have its own Kryo, Input, and Output instances.)
  • kryo 객체 생성 비용도 비쌈 (constructing and configuring a Kryo instance is relatively expensive)
    (MVC 같은 멀티 쓰레드 환경에서는 kryo 객체 pool을 만들어서 써야함. ( Kryo에서 제공하는 기능 중 하나 ))
  • Serializer Configuration이 불편함 => compile time에 어떤 객체를 serilaizer에 등록할지 설정 필요

초간단 Benchmark

  • Target class : 가장 common하게 사용하는 객체 선정 ( 대략 30개의 field? )

  • Serializer

    • kryo VersionFieldSerializer
    • Spring JdkSerializationRedisSerializer ( Redis serializer 기본 )
  • 총 80만번 Serialize 수행

memory alloc

  • JdkSerializer 3GB
  • Kryo 800MB

cpu sample

  • JdkSerializer 9,540
  • Kryo 5,278

소요 시간

  • kryo 1366ms
  • jdk 2429ms
fun serializeTest() {  
    val dto = UserDto.fromUser(user)  
    val jdkSerializer = JdkSerializationRedisSerializer()  

    val kryo = Kryo()  
    val kryoSerializer = VersionFieldSerializer<UserDto>(kryo, UserDto::class.java)  

    val stratTime = System.currentTimeMillis()  
    (1..800000).forEach {  
        //val buffer = Output(1024, -1)  
        //kryoSerializer.write(kryo, buffer, dto)        
        val t = jdkSerializer.serialize(dto)  
    }  

    val endTime = System.currentTimeMillis()  

    println("time: ${endTime - stratTime}")
}

결론

쓸만한데, Serializer 튜닝하기가 좀 귀찮아보임 & 그렇지만 redis I/O가 많은 어플리케이션에서는 충분히 고려해볼만한 옵션인듯

Recent Posts

Popular posts

Recent Comments

Tag List

파이썬 JWT 클라우드 인증 DNS API 도커 테라폼 JavaScript GCP 리눅스 AWS 백준 DB 알고리즘 네임스페이스 k8s IAC 운영체제 네트워크 ORM 인가 TypeScript 컨테이너
Total : Today : Yesterday :
Blog powered by Tistory, Designed by hanarotg