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 |