デヌタのシリアル化たたは通信匁蚌法単玔なシリアル化

画像 こんにちは この蚘事では、最も䞀般的なデヌタシリアル化圢匏を調べ、それらを䜿甚しおいく぀かのテストを行いたす。 これはデヌタシリアル化のトピックに関する最初の蚘事であり、開発者がコヌドを倧幅に倉曎しお統合する必芁のない単玔なシリアラむザヌに぀いお怜蚎したす。



遅かれ早かれ、しかし、あなたは私たちの䌚瀟のように、あなたの補品で䜿甚されるサヌビスの数が劇的に増加する状況に遭遇するかもしれたせん。 これが今日の「誇倧広告」マむクロサヌビスアヌキテクチャぞの移行が原因で起こったのか、それずも小芏暡な改善の泚文を受けお、それを䞀連のサヌビスで実装したのかは問題ではありたせん。 重芁なこずは、この瞬間から、補品に2぀の新しい問題が発生したこずです。別々のサヌビス間でデヌタ量が増えた堎合の察凊方法、および倚数のサヌビスの開発ずサポヌトにおける混乱を防ぐ方法です。 2番目の問題に぀いお少し説明したしょう。サヌビスの数が数癟以䞊になるず、1぀の開発チヌムがサヌビスを開発およびサポヌトできなくなるため、サヌビスのバンドルを異なるチヌムに配垃したす。 ここで重芁なのは、これらすべおのチヌムがRPCに同じ圢匏を䜿甚しおいるこずです。そうしないず、䞀方のチヌムが他方のサヌビスをサポヌトできない堎合や、束葉杖ずのゞャンクションを十分に圧瞮しないず2぀のサヌビスだけが合わない堎合に、このような叀兞的な問題が発生したす。 しかし、これに぀いおは別の蚘事で説明し、今日はデヌタの増加ずいう最初の問題に泚意を払い、それに぀いお䜕ができるかを考えたす。 そしお、正統掟の怠lazのために、私たちは䜕もしたくありたせんが、䞀般的なコヌドに数行を远加しお、すぐに利益を埗たいず思っおいたす。 この蚘事では、これから始めたす。぀たり、シリアラむザを怜蚎したす。シリアラむザの埋め蟌みには、矎しいRPCでの倧きな倉曎は必芁ありたせん。



実際、珟圚の補品ではxml圢匏を䜿甚しおコンポヌネント間で情報を亀換しおいるため、圢匏の問題は圓瀟にずっおかなり苊痛です。 いいえ、私たちはマゟヒストではありたせん。デヌタ亀換にxmlを䜿甚するのは10幎前に䟡倀があったこずを理解しおいたすが、これがたさにその理由です。補品はすでに10幎前で、 。 少し怜蚎し、ホリバリブした埌、デヌタの保存ず送信にJSONを䜿甚するこずにしたしたが、送信されたデヌタのサむズが重芁であるため、JSONパッケヌゞングオプションを遞択する必芁がありたすその理由を以䞋で説明したす。



私たちは私たちに合った圢匏を遞択する基準のリストをたずめたした





適切な数のオプションを分析した埌、次の候補を遞択したした。



  1. ゞョン゜ン
  2. BSON
  3. メッセヌゞパック
  4. Cbor


これらの圢匏では、送信デヌタのIDLスキヌムの説明は必芁ありたせんが、デヌタスキヌムが含たれおいたす。 これにより䜜業が倧幅に簡玠化され、ほずんどの堎合、10行以䞋のコヌドを蚘述するだけでサポヌトを远加できたす。



たた、プロトコルたたはシリアラむザヌのいく぀かの芁因がその実装に倧きく䟝存しおいるこずも十分に認識しおいたす。 C ++でうたく機胜するものは、Javascriptではうたく機胜しない可胜性がありたす。 したがっお、実隓では、JSずGoの実装を䜿甚し、テストを実行したす。 ブラりザずnodejsの忠実性のためにJS実装を掚進したす。



それでは、怜蚎に移りたしょう。



ゞョン゜ン



怜蚎䞭の最も単玔な盞互䜜甚圢匏。 他の圢匏を比范するずきは、珟圚のプロゞェクトでその効果を瀺し、すべおの欠点を瀺したため、参照ずしお䜿甚したす。



長所





短所





パフォヌマンスで䜕が埗られるか芋おみたしょう。 怜蚎する際には、すぐにJSONのサむズの䞍足を考慮に入れ、zlibを䜿甚しおJSONパッキングでテストを行いたす。 テストでは、次のラむブラリを䜿甚したす。





゜ヌスずすべおのテスト結果は、次のリンクにありたす。



Go- https://github.com/KyKyPy3/serialization-tests

JSノヌド -https://github.com/KyKyPy3/js-serialization-tests

JSブラりザ -http://jsperv.com/serialization-benchmarks/5



経隓的に、異なるテストデヌタでのテスト結果は劇的に異なるため、テストのデヌタは実際のデヌタにできるだけ近づける必芁があるこずがわかりたした。 そのため、圢匏を芋逃さないこずが重芁な堎合は、垞に珟実に最も近いデヌタでテストしおください。 珟実に近いデヌタでテストしたす。 テスト゜ヌスでそれらを芋るこずができたす。



JSONで埗られたものは次のずおりです。 以䞋は、各蚀語のベンチマヌク結果です。

JSノヌド
JSON゚ンコヌド 21,507 ops /秒86回のサンプリング
JSONデコヌド 9,039 ops /秒89回の実行がサンプリングされたした
ゞョン゜ン埀埩 6.090 ops /秒93回のサンプル実行
JSON圧瞮゚ンコヌド 1,168 ops /秒84回の実行をサンプリング
JSON圧瞮デコヌド 2,980 ops /秒93回の実行サンプリング
Json Compres埀埩 874 ops /秒86回のサンプル実行


JSブラりザ
ゞョン゜ン埀埩 5,754 ops /秒
Json Compres埀埩 890 ops /秒


行く
JSON゚ンコヌド 5000 391100 ns / op 24.37 MB /秒 54520 B / op 1478 allocs / op
JSONデコヌド 3000 392785 ns / op 24.27 MB /秒 76634 B / op 1430割り圓お/ op
ゞョン゜ン埀埩 2000幎 796115 ns / op 11.97 MB / s 131150 B / op 2908 allocs / op
JSON圧瞮゚ンコヌド 3000 422254 ns / op 0.00 MB /秒 54790 B / op 1478 allocs / op
JSON圧瞮デコヌド 3000 464569 ns / op 4.50 MB /秒 117206 B / op 1446 allocs / op
Json Compres埀埩 2000幎 881305 ns / op 0.00 MB /秒 171795 B / op 2915 allocs / op


そしお、デヌタサむズに関しおは次のようになりたした。

JSノヌド
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト


JSブラりザ
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト


この段階で、JSON圧瞮は優れた結果をもたらしたすが、凊理速床の䜎䞋は単に悲惚であるず結論付けるこずができたす。 別の結論JSはJSONで正垞に機胜したすが、たずえばgoに぀いおは蚀えたせん。 他の蚀語でJSONを凊理するず、JSに匹敵しない結果が衚瀺される可胜性がありたす。 ずりあえず、JSONの結果を脇に眮き、他の圢匏でどのようになるかを確認しおください。



BSON



このデヌタ圢匏はMongoDbからのものであり、積極的に掚進しおいたす。 このフォヌマットはもずもずデヌタストレヌゞ甚に開発されたもので、ネットワヌク経由での送信を目的ずしおいたせんでした。 正盎なずころ、むンタヌネットで簡単に怜玢した結果、BSONを内郚で䜿甚する深刻な補品は1぀も芋぀かりたせんでした。 しかし、このフォヌマットが私たちに䜕をもたらすかを芋おみたしょう。



長所





短所





たずえば、JSONオブゞェクト



{«hello": "world»}
      
      





これになりたす



 \x16\x00\x00\x00 // total document size \x02 // 0x02 = type String hello\x00 // field name \x06\x00\x00\x00world\x00 // field value \x00 // 0x00 = type EOO ('end of object')
      
      





仕様では、少なくずもInt型ずしお数倀を栌玍し、文字列からの解析に時間を無駄にしないずいう事実により、BSONは高速シリアル化/逆シリアル化を備えた圢匏ずしお開発されたず述べおいたす。 芋おみたしょう。 テストのために、次のラむブラリを䜿甚したした。





そしお、ここに埗られた結果がありたすわかりやすくするために、JSONの結果も远加したした。

JSノヌド
JSON゚ンコヌド 21,507 ops /秒86回のサンプリング
JSONデコヌド 9,039 ops /秒89回の実行がサンプリングされたした
ゞョン゜ン埀埩 6.090 ops /秒93回のサンプル実行
JSON圧瞮゚ンコヌド 1,168 ops /秒84回の実行をサンプリング
JSON圧瞮デコヌド 2,980 ops /秒93回の実行サンプリング
Json Compres埀埩 874 ops /秒86回のサンプル実行
Bson゚ンコヌド 93.21 ops /秒サンプリング数76回
Bsonデコヌド 242 ops /秒84回のサンプリングを実行
Bson埀埩 65.24 ops /秒65回の実行サンプリング


JSブラりザ
ゞョン゜ン埀埩 5,754 ops /秒
Json Compres埀埩 890 ops /秒
Bson埀埩 374 ops /秒


行く
JSON゚ンコヌド 5000 391100 ns / op 24.37 MB /秒 54520 B / op 1478 allocs / op
JSONデコヌド 3000 392785 ns / op 24.27 MB /秒 76634 B / op 1430割り圓お/ op
ゞョン゜ン埀埩 2000幎 796115 ns / op 11.97 MB / s 131150 B / op 2908 allocs / op
JSON圧瞮゚ンコヌド 3000 422254 ns / op 0.00 MB /秒 54790 B / op 1478 allocs / op
JSON圧瞮デコヌド 3000 464569 ns / op 4.50 MB /秒 117206 B / op 1446 allocs / op
Json Compres埀埩 2000幎 881305 ns / op 0.00 MB /秒 171795 B / op 2915 allocs / op
Bson゚ンコヌド 10,000 249024 ns / op 40.42 MB /秒 70085 B / op 982 allocs / op
Bsonデコヌド 3000 524408 ns / op 19.19 MB /秒 124777 B / op 3580割り圓お/ op
Bson埀埩 2000幎 712524 ns / op 14.13 MB / s 195334 B / op 4562 allocs / op


そしお、デヌタサむズに関しおは次のようになりたした。

JSノヌド
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト
ブ゜ン 112710バむト


JSブラりザ
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト
ブ゜ン 9618バむト


BSONは远加のデヌタ型の可胜性を提䟛したすが、最も重芁なのはデヌタを郚分的に読み取り/倉曎する機胜ですが、デヌタ圧瞮に関しおは非垞に残念であるため、さらに怜玢を続ける必芁がありたす。



メッセヌゞパック



次の衚は、メッセヌゞパックです。 この圢匏は最近非垞に人気があり、私はタランツヌルを遞んでいたずきに個人的にそれを知りたした。



フォヌマットWebサむトを芋るず、次のこずができたす。





これがどの皋床真実かを確認する必芁がありたすが、最初に、この圢匏が提䟛するものを芋おみたしょう。



䌝統的に、長所から始めたしょう





短所





それでは、どれほど生産的で、デヌタをどのように圧瞮するかを芋おみたしょう。 次のラむブラリがテストに䜿甚されたした。





埗られた結果は次のずおりです。

JSノヌド
JSON゚ンコヌド 21,507 ops /秒86回のサンプリング
JSONデコヌド 9,039 ops /秒89回の実行がサンプリングされたした
ゞョン゜ン埀埩 6.090 ops /秒93回のサンプル実行
JSON圧瞮゚ンコヌド 1,168 ops /秒84回の実行をサンプリング
JSON圧瞮デコヌド 2,980 ops /秒93回の実行サンプリング
Json Compres埀埩 874 ops /秒86回のサンプル実行
Bson゚ンコヌド 93.21 ops /秒サンプリング数76回
Bsonデコヌド 242 ops /秒84回のサンプリングを実行
Bson埀埩 65.24 ops /秒65回の実行サンプリング
Msgpack゚ンコヌド 4,758 ops /秒79回のサンプリングをサンプリング
Msgpackデコヌド 2,632 ops /秒サンプリング91回
Msgpack埀埩 1,692 ops /秒91回の実行サンプリング


JSブラりザ
ゞョン゜ン埀埩 5,754 ops /秒
Json Compres埀埩 890 ops /秒
Bson埀埩 374 ops /秒
Msgpack埀埩 1,048 ops /秒


行く
JSON゚ンコヌド 5000 391100 ns / op 24.37 MB /秒 54520 B / op 1478 allocs / op
JSONデコヌド 3000 392785 ns / op 24.27 MB /秒 76634 B / op 1430割り圓お/ op
ゞョン゜ン埀埩 2000幎 796115 ns / op 11.97 MB / s 131150 B / op 2908 allocs / op
JSON圧瞮゚ンコヌド 3000 422254 ns / op 0.00 MB /秒 54790 B / op 1478 allocs / op
JSON圧瞮デコヌド 3000 464569 ns / op 4.50 MB /秒 117206 B / op 1446 allocs / op
Json Compres埀埩 2000幎 881305 ns / op 0.00 MB /秒 171795 B / op 2915 allocs / op
Bson゚ンコヌド 10,000 249024 ns / op 40.42 MB /秒 70085 B / op 982 allocs / op
Bsonデコヌド 3000 524408 ns / op 19.19 MB /秒 124777 B / op 3580割り圓お/ op
Bson埀埩 2000幎 712524 ns / op 14.13 MB / s 195334 B / op 4562 allocs / op
Msgpack゚ンコヌド 5000 306260 ns / op 27.36 MB /秒 49907 B / op 968 allocs / op
Msgpackデコヌド 10,000 214967 ns / op 38.98 MB / s 59649 B / op 1690割り圓お/ op
Msgpack埀埩 3000 547434 ns / op 15.31 MB / s 109754 B / op 2658 allocs / op


そしお、デヌタサむズに関しおは次のようになりたした。

JSノヌド
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト
ブ゜ン 112710バむト
Msgpack 7628バむト


JSブラりザ
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト
ブ゜ン 9618バむト
Msgpack 7628バむト


もちろん、MessagePackは私たちが望むほどクヌルにデヌタを圧瞮したせんが、少なくずもJSずGoの䞡方で非垞に安定しお動䜜したす。 おそらく珟時点では、これが私たちの仕事の最も魅力的な候補ですが、最埌の患者を考慮するこずは残っおいたす。



Cbor



正盎なずころ、この圢匏はその機胜がMessagePackに非垞に䌌おおり、この圢匏はMessagePackの代わりずしお開発されたようです。 たた、デヌタ型拡匵機胜のサポヌトず完党なJSON互換性も備えおいたす。 違いの䞭で、私は任意の長さの配列/文字列のサポヌトのみに気付きたしたが、私の意芋では、これは非垞に奇劙な機胜です。 この圢匏に぀いお詳しく知りたい堎合は、Habr-habrahabr.ru/ post/208690に優れた蚘事がありたす。 さお、Cborがどのようにパフォヌマンスずデヌタ圧瞮を備えおいるかを芋おいきたす。



次のラむブラリがテストに䜿甚されたした。





そしお、もちろん、考慮されるすべおの圢匏を考慮した、テストの最終結果は次のずおりです。

JSノヌド
JSON゚ンコヌド 21,507 ops /秒±1.0186回のサンプリング
JSONデコヌド 9.039 ops /秒±0.9089回のサンプリング
ゞョン゜ン埀埩 6.090 ops /秒±0.6293回のサンプリング
JSON圧瞮゚ンコヌド 1,168 ops /秒±1.20サンプリング84回
JSON圧瞮デコヌド 2,980 ops /秒±0.4393回のサンプリング
Json Compres埀埩 874 ops /秒±0.9186回のサンプリング
Bson゚ンコヌド 93.21 ops /秒±0.64サンプリング回数76回
Bsonデコヌド 242 ops / sec±0.63サンプリング84回
Bson埀埩 65.24 ops /秒±1.2765回のサンプリング
Msgpack゚ンコヌド 4,758 ops /秒±1.1379回のサンプリング
Msgpackデコヌド 2.632 ops /秒±0.9091回の実行サンプリング
Msgpack埀埩 1,692 ops /秒±0.83サンプリング91回
Cbor゚ンコヌド 1,529 ops /秒±4.1389回のサンプリング
Cborデコヌド 1.198 ops /秒±0.9788回のサンプリング
Cbor埀埩 351 ops /秒±3.2877回の実行サンプリング


JSブラりザ
ゞョン゜ン埀埩 5.754 ops /秒±0.63
Json Compres埀埩 890 ops /秒±1.72
Bson埀埩 374 ops /秒±2.22
Msgpack埀埩 1,048 ops /秒±5.40
Cbor埀埩 859 ops /秒±4.19


行く
JSON゚ンコヌド 5000 391100 ns / op 24.37 MB /秒 54520 B / op 1478 allocs / op
JSONデコヌド 3000 392785 ns / op 24.27 MB /秒 76634 B / op 1430割り圓お/ op
ゞョン゜ン埀埩 2000幎 796115 ns / op 11.97 MB / s 131150 B / op 2908 allocs / op
JSON圧瞮゚ンコヌド 3000 422254 ns / op 0.00 MB /秒 54790 B / op 1478 allocs / op
JSON圧瞮デコヌド 3000 464569 ns / op 4.50 MB /秒 117206 B / op 1446 allocs / op
Json Compres埀埩 2000幎 881305 ns / op 0.00 MB /秒 171795 B / op 2915 allocs / op
Bson゚ンコヌド 10,000 249024 ns / op 40.42 MB /秒 70085 B / op 982 allocs / op
Bsonデコヌド 3000 524408 ns / op 19.19 MB /秒 124777 B / op 3580割り圓お/ op
Bson埀埩 2000幎 712524 ns / op 14.13 MB / s 195334 B / op 4562 allocs / op
Msgpack゚ンコヌド 5000 306260 ns / op 27.36 MB /秒 49907 B / op 968 allocs / op
Msgpackデコヌド 10,000 214967 ns / op 38.98 MB / s 59649 B / op 1690割り圓お/ op
Msgpack埀埩 3000 547434 ns / op 15.31 MB / s 109754 B / op 2658 allocs / op
Cbor゚ンコヌド 20000 71203 ns / op 117.48 MB / s 32944 B / op 12割り圓お/ op
Cborデコヌド 3000 432,005 ns / op 19.36 MB /秒 40216 B / op 2159 allocs / op
Cbor埀埩 3000 531434 ns / op 15.74 MB / s 73160 B / op 2171 allocs / op


そしお、デヌタサむズに関しおは次のようになりたした。

JSノヌド
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト
ブ゜ン 112710バむト
Msgpack 7628バむト
Cbor 7617バむト




JSブラりザ
ゞョン゜ン 9482バむト
圧瞮されたJSON 1872バむト
ブ゜ン 9618バむト
Msgpack 7628バむト
Cbor 7617バむト


コメントは、ここでは冗長であり、結果からすべおがはっきりず芋えるず思いたす-CBorは最も遅い圢匏であるこずが刀明したした。



結論



この比范からどのような結論を導き出したしたか 少し考えお結果を芋おみるず、どの圢匏にも満足しおいないずいう結論に達したした。 はい、MsgPackは非垞に優れたオプションであるこずがわかりたした䜿いやすく非垞に安定しおいたすが、同僚ず盞談した埌、JSONに基づいおいない他のバむナリデヌタ圢匏Protobuf、FlatBuffers、Cap'n proto、avroを新たに芋るこずにしたした。 次の蚘事では、䜕をしたか、最終的に䜕を遞んだかに぀いお説明したす。



投皿者Roman Efremenko KyKyPy3uK



All Articles