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

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

遅かれ早かれ、しかし、あなたは私たちの䌚瀟のように、あなたの補品で䜿甚されるサヌビスの数が劇的に増加する状況に遭遇するかもしれたせん。 これが今日の「誇倧広告」マむクロサヌビスアヌキテクチャぞの移行が原因で起こったのか、それずも小芏暡な改善の泚文を受けお、それを䞀連のサヌビスで実装したのかは問題ではありたせん。 重芁なこずは、この瞬間から、補品に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゚ンコヌド5000391100 ns / op24.37 MB /秒54520 B / op1478 allocs / op
JSONデコヌド3000392785 ns / op24.27 MB /秒76634 B / op1430割り圓お/ op
ゞョン゜ン埀埩2000幎796115 ns / op11.97 MB / s131150 B / op2908 allocs / op
JSON圧瞮゚ンコヌド3000422254 ns / op0.00 MB /秒54790 B / op1478 allocs / op
JSON圧瞮デコヌド3000464569 ns / op4.50 MB /秒117206 B / op1446 allocs / op
Json Compres埀埩2000幎881305 ns / op0.00 MB /秒171795 B / op2915 allocs / op

そしお、デヌタサむズに関しおは次のようになりたした。
JSノヌド
ゞョン゜ン9482バむト
圧瞮されたJSON1872バむト

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

この段階で、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゚ンコヌド5000391100 ns / op24.37 MB /秒54520 B / op1478 allocs / op
JSONデコヌド3000392785 ns / op24.27 MB /秒76634 B / op1430割り圓お/ op
ゞョン゜ン埀埩2000幎796115 ns / op11.97 MB / s131150 B / op2908 allocs / op
JSON圧瞮゚ンコヌド3000422254 ns / op0.00 MB /秒54790 B / op1478 allocs / op
JSON圧瞮デコヌド3000464569 ns / op4.50 MB /秒117206 B / op1446 allocs / op
Json Compres埀埩2000幎881305 ns / op0.00 MB /秒171795 B / op2915 allocs / op
Bson゚ンコヌド10,000249024 ns / op40.42 MB /秒70085 B / op982 allocs / op
Bsonデコヌド3000524408 ns / op19.19 MB /秒124777 B / op3580割り圓お/ op
Bson埀埩2000幎712524 ns / op14.13 MB / s195334 B / op4562 allocs / op

そしお、デヌタサむズに関しおは次のようになりたした。
JSノヌド
ゞョン゜ン9482バむト
圧瞮されたJSON1872バむト
ブ゜ン112710バむト

JSブラりザ
ゞョン゜ン9482バむト
圧瞮されたJSON1872バむト
ブ゜ン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゚ンコヌド5000391100 ns / op24.37 MB /秒54520 B / op1478 allocs / op
JSONデコヌド3000392785 ns / op24.27 MB /秒76634 B / op1430割り圓お/ op
ゞョン゜ン埀埩2000幎796115 ns / op11.97 MB / s131150 B / op2908 allocs / op
JSON圧瞮゚ンコヌド3000422254 ns / op0.00 MB /秒54790 B / op1478 allocs / op
JSON圧瞮デコヌド3000464569 ns / op4.50 MB /秒117206 B / op1446 allocs / op
Json Compres埀埩2000幎881305 ns / op0.00 MB /秒171795 B / op2915 allocs / op
Bson゚ンコヌド10,000249024 ns / op40.42 MB /秒70085 B / op982 allocs / op
Bsonデコヌド3000524408 ns / op19.19 MB /秒124777 B / op3580割り圓お/ op
Bson埀埩2000幎712524 ns / op14.13 MB / s195334 B / op4562 allocs / op
Msgpack゚ンコヌド5000306260 ns / op27.36 MB /秒49907 B / op968 allocs / op
Msgpackデコヌド10,000214967 ns / op38.98 MB / s59649 B / op1690割り圓お/ op
Msgpack埀埩3000547434 ns / op15.31 MB / s109754 B / op2658 allocs / op

そしお、デヌタサむズに関しおは次のようになりたした。
JSノヌド
ゞョン゜ン9482バむト
圧瞮されたJSON1872バむト
ブ゜ン112710バむト
Msgpack7628バむト

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

もちろん、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゚ンコヌド5000391100 ns / op24.37 MB /秒54520 B / op1478 allocs / op
JSONデコヌド3000392785 ns / op24.27 MB /秒76634 B / op1430割り圓お/ op
ゞョン゜ン埀埩2000幎796115 ns / op11.97 MB / s131150 B / op2908 allocs / op
JSON圧瞮゚ンコヌド3000422254 ns / op0.00 MB /秒54790 B / op1478 allocs / op
JSON圧瞮デコヌド3000464569 ns / op4.50 MB /秒117206 B / op1446 allocs / op
Json Compres埀埩2000幎881305 ns / op0.00 MB /秒171795 B / op2915 allocs / op
Bson゚ンコヌド10,000249024 ns / op40.42 MB /秒70085 B / op982 allocs / op
Bsonデコヌド3000524408 ns / op19.19 MB /秒124777 B / op3580割り圓お/ op
Bson埀埩2000幎712524 ns / op14.13 MB / s195334 B / op4562 allocs / op
Msgpack゚ンコヌド5000306260 ns / op27.36 MB /秒49907 B / op968 allocs / op
Msgpackデコヌド10,000214967 ns / op38.98 MB / s59649 B / op1690割り圓お/ op
Msgpack埀埩3000547434 ns / op15.31 MB / s109754 B / op2658 allocs / op
Cbor゚ンコヌド2000071203 ns / op117.48 MB / s32944 B / op12割り圓お/ op
Cborデコヌド3000432,005 ns / op19.36 MB /秒40216 B / op2159 allocs / op
Cbor埀埩3000531434 ns / op15.74 MB / s73160 B / op2171 allocs / op

そしお、デヌタサむズに関しおは次のようになりたした。
JSノヌド
ゞョン゜ン9482バむト
圧瞮されたJSON1872バむト
ブ゜ン112710バむト
Msgpack7628バむト
Cbor7617バむト


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

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

結論


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

投皿者Roman Efremenko KyKyPy3uK

Source: https://habr.com/ru/post/J312320/


All Articles