Dubbo 직렬화 및 다양한 직렬화 성능 비교

Dubbo RPC는 Dubbo 시스템의 핵심적인 고성능, 높은 처리량의 원격 호출 방법입니다.

dubbo RPC는 주로 두 dubbo 시스템 간의 원격 통화에 사용되며, 특히 동시성이 높고 데이터가 적은 인터넷 시나리오에 적합합니다.

또한 직렬화는 원격 호출의 응답 속도, 처리량, 네트워크 대역폭 소비 등에 중요한 역할을 합니다.

  • 특히 Java 언어용: Kryo, FST 등
  • 대부분의 직렬화 방법의 성능은 hessian2보다 훨씬 뛰어납니다(미숙한 dubbo 직렬화도 포함).

    이러한 관점에서 우리는 dubbo가 hessian2를 점진적으로 대체하기 위해 두 가지 효율적인 Java 직렬화 구현인 Kryo와 FST를 도입했습니다.

  • 프로덕션 환경을 위한 애플리케이션에서는 현재로서는 Kryo를 선호하는 것이 좋습니다.

  • Kryo 및 FST 활성화

    Kryo와 FST를 사용하는 것은 매우 간단합니다. 단지 dubbo RPC의 XML 구성에 속성을 추가하기만 하면 됩니다.

    <dubbo:프로토콜 이름="dubbo" 직렬화="kryo"/>
    <dubbo:프로토콜 이름="dubbo" 직렬화="fst"/>

    직렬화할 클래스를 등록합니다.

    Kryo와 FST가 고성능을 최대한 활용하려면 직렬화해야 하는 클래스를 dubbo 시스템에 등록하는 것이 가장 좋습니다. 예를 들어 다음 콜백 인터페이스를 구현할 수 있습니다.

    공용 클래스 SerializationOptimizerImpl은 SerializationOptimizer를 구현합니다. { 
    
        public Collection<Class> getSerializedClasses() { 
            List<Class> 클래스 = new LinkedList<Class>(); 
            class.add(BidRequest.class); 
            class.add(BidResponse.class); 
            class.add(Device.class); 
            class.add(Geo.class); 
            class.add(Impression.class); 
            class.add(SeatBid.class); 
            반환 수업; 
        } 
    }

    그런 다음 XML 구성을 추가합니다.

    <dubbo:protocol name="dubbo" serialization="kryo" Optimizer="com.alibaba.dubbo.demo.SerializationOptimizerImpl"/>

    이러한 클래스를 등록한 후에는 특히 소수의 중첩된 개체의 경우 직렬화 성능이 크게 향상될 수 있습니다.

  • 물론 클래스를 직렬화할 때 Java 컬렉션 클래스와 같은 많은 클래스에 대한 계단식 참조가 있을 수 있습니다. 이러한 상황에 대응하여 우리는 JDK에 공통 클래스를 자동으로 등록했기 때문에 다시 등록할 필요가 없습니다(물론 반복적으로 등록해도 아무런 영향이 없습니다).

  • GregorianCalendar
    InvocationHandler
    BigDecimal
    BigInteger
    Pattern
    BitSet
    URI
    UUID
    HashMap
    ArrayList
    LinkedList
    HashSet
    TreeSet
    Hashtable
    Date
    Calendar
    ConcurrentHashMap
    SimpleDateFormat
    Vector
    BitSet
    StringBuffer
    StringBuilder
    Object
    Object[]
    String[]
    byte[]
    char[]
    int[]
    float[]
    double[]
    

     

Dubbo RPC의 다양한 직렬화에 의해 생성된 바이트 크기 비교

직렬화에 의해 생성된 바이트코드의 크기는 원격 호출의 네트워크 전송 시간과 대역폭 사용량을 결정하는 상대적으로 결정적인 지표입니다.

복잡한 객체에 대한 결과는 다음과 같습니다(숫자가 작을수록 좋습니다).

직렬화 구현 요청 바이트 응답 바이트
크리오 272 90
FST 288 96
더보 직렬화 430 186
헤센 546 329
FastJson 461 218
제이슨 657 409
자바 직렬화 963 630

이미지를 찾을 수 없습니다

Dubbo RPC의 다양한 직렬화 응답 시간 및 처리량 비교

원격 통화 방법 평균 응답 시간 평균 TPS(초당 트랜잭션)
REST: 부두 + JSON 7.806 1280
REST: 부두 + JSON + GZIP 모두 모두
REST: 부두 + XML 모두 모두
REST: 부두 + XML + GZIP 모두 모두
REST: 톰캣 + JSON 2.082 4796
REST: 네티 + JSON 2.182 4576
더보: FST 1.211 8244
더보: 키로 1.182 8444
Dubbo: 더보 직렬화 1.43 6982
더보: hessian2 1.49 6701
더보: fastjson 1,572 6352

이미지를 찾을 수 없습니다

이미지를 찾을 수 없습니다

추천

출처blog.csdn.net/Brady74/article/details/90983288