Dubbo シリアル化とさまざまなシリアル化パフォーマンスの比較

dubbo RPC は、dubbo システムの中核となる高性能、高スループットのリモート呼び出しメソッドです。

dubbo RPC は主に 2 つの dubbo システム間のリモート呼び出しに使用され、特に同時実行性が高くデータ量が少ないインターネット シナリオに適しています。

シリアル化は、リモート呼び出しの応答速度、スループット、ネットワーク帯域幅の消費にも重要な役割を果たします。

  • 特に Java 言語の場合: Kryo、FST など。
  • これらのシリアル化メソッドのほとんどのパフォーマンスは、hessian2 よりも大幅に優れています (未熟な dubbo シリアル化も含めて)。

    これを考慮して、dubbo が hessian2 を徐々に置き換えるために、2 つの効率的な Java シリアル化実装、Kryo と FST を導入します。

  • 本番指向のアプリケーションでは、現時点では Kryo を推奨します。

  • Kryo と FST を有効にする

    Kryo と FST の使用は非常に簡単で、dubbo RPC の XML 設定に属性を追加するだけです。

    <dubbo:プロトコル名="dubbo" シリアライゼーション="kryo"/>
    <dubbo:プロトコル名="dubbo" シリアライゼーション="fst"/>

    シリアル化されたクラスを登録する

    Kryo と FST を高いパフォーマンスで完全に実行するには、dubbo システムでシリアル化する必要があるクラスを登録するのが最善です。たとえば、次のコールバック インターフェイスを実装できます。

    public class SerializationOptimizerImplimplements SerializationOptimizer { 
    
        public Collection<Class> getSerializableClasses() { 
            List<Class> クラス = new LinkedList<Class>(); 
            クラス.add(BidRequest.class); 
            クラス.add(BidResponse.class); 
            クラス.add(デバイス.クラス); 
            クラス.add(Geo.class); 
            class.add(Impression.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
ファストJson 461 218
ジソン 657 409
Java シリアル化 963 630

画像が見つかりません

Dubbo RPC でのさまざまなシリアル化応答時間とスループットの比較

リモート呼び出し方法 平均応答時間 平均 TPS (1 秒あたりのトランザクション数)
REST: Jetty + JSON 7.806 1280
REST: Jetty + JSON + GZIP 全て 全て
REST: Jetty + XML 全て 全て
REST: Jetty + XML + GZIP 全て 全て
REST: Tomcat + JSON 2.082 4796
REST: Netty + JSON 2.182 4576
ダボ: FST 1.211 8244
ダボ:カイロ 1.182 8444
ダボ: ダボの連載 1.43 6982
ダボ: hessian2 1.49 6701
ダボ: fastjson 1.572 6352

画像が見つかりません

画像が見つかりません

おすすめ

転載: blog.csdn.net/Brady74/article/details/90983288