SONJSONではなくBinary‌ ‌coding‌ ‌

同じデヌタをはるかに少ない

。ベむトを

画像


なぜ‌私‌ this‌ ‌ ‌心配する必芁がある‌



デヌタは、オブゞェクト、リスト、配列などのデヌタ構造の圢匏でメモリに栌玍されたす。ただし、ネットワヌクたたはファむルにデヌタを送信する堎合は、それらをbaytovのシヌケンスずしお゚ンコヌドする必芁がありたす。バむトシヌケンスでのメモリ内の衚珟ぱンコヌディングず呌ばれ、逆倉換-dekodirovaniem。最終的にアプリケヌションによっお凊理された、たたはメモリに栌玍されたデヌタダむアグラムが進化し、新しいフィヌルドがstaryeに远加たたは削陀される堎合がありたす。 ‌Used‌ ‌ encoding‌ ‌must‌ ‌have‌ ‌as‌ reverse‌ ‌new‌ ‌code‌ ‌must‌ ‌be‌ ‌capable‌ read‌ ‌data ‌ write‌ old ‌code、‌so ‌and‌ ‌direct‌ ‌叀い‌ ‌code‌ ‌must‌ ‌be‌ ‌capable ‌read‌ ‌data ‌‌wrote‌‌new‌‌code‌ ‌compatibility.‌ ‌

で

、この蚘事では、我々はバむナリ笊号化方法は、スキヌムが倉曎サポヌトずしおコヌディングバむナリもより良いJSON、XMLよりも、ず理由を芋぀けるコヌドする様々なフォヌマットに぀いお説明したす

dannyhを。

タむプ‌フォヌマットコヌディング‌



゚ンコヌド圢匏には2぀のタむプがあり



  • テキスト‌ ‌フォヌマット‌
  • バむナリ‌ ‌フォヌマット‌
‌ ‌

テキスト‌ ‌フォヌマット

テキスト

圢匏はある皋床chelovekochitaemy。䞀般的な圢匏の䟋は、JSON、CSV、XMLです。テキスト圢匏は䜿いやすく理解しやすいですが、いく぀かの問題がありたす。



  • . , XML CSV . JSON , , . . , , 2^53 Twitter, 64- . JSON, API Twitter, ID — JSON- – - , JavaScript- .
  • CSV , .
  • テキスト圢匏は、バむナリ゚ンコヌディングよりも倚くのスペヌスを䜿甚したす。たずえば、理由の1぀は、JSONずXMLがスキヌマレスであるため、フィヌルド名を含める必芁があるこずです。


{
    "userName": "Martin",
    "favoriteNumber": 1337,
    "interests": ["daydreaming", "hacking"]
}


この䟋のJSON゚ンコヌディングは、すべおの空癜が削陀された埌、82バむトを䜿甚したす。



バむナリ゚ンコヌディング



内郚でのみ䜿甚されるデヌタ分析の堎合、無駄のない圢匏たたは高速な圢匏を遞択できたす。JSONはXMLより冗長ではありたせんが、バむナリ圢匏ず比范するず、どちらも䟝然ずしお倚くのスペヌスを䜿甚したす。この蚘事では、3぀の異なるバむナリ゚ンコヌディング圢匏に぀いお説明したす。



  1. スリフト
  2. プロトコルバッファ
  3. アブロ


それらのすべおは、スキヌマを䜿甚しおデヌタの効率的なシリアル化を提䟛し、コヌドを生成するためのツヌルず、さたざたなプログラミング蚀語での䜜業をサポヌトしたす。それらはすべおスキヌマの進化をサポヌトし、埌方互換性ず前方互換性の䞡方を提䟛したす。



スリフトおよびプロトコルバッファヌ



ThriftはFacebookによっお開発され、Protocol BuffersはGoogleによっお開発されたした。どちらの堎合も、デヌタを゚ンコヌドするにはスキヌマが必芁です。Thriftは独自のむンタヌフェヌス定矩蚀語IDLを䜿甚しおスキヌマを定矩したす。



struct Person {
  1: string       userName,
  2: optional i64 favouriteNumber,
  3: list<string> interests
}


プロトコルバッファヌの同等のスキヌム



message Person {
    required string user_name        = 1;
    optional int64  favourite_number = 2;
    repeated string interests        = 3;
}


ご芧のずおり、各フィヌルドにはデヌタ型ずタグ番号1、2、3がありたす。 Thriftには、BinaryProtocolずCompactProtocolの2぀の異なるバむナリ゚ンコヌディング圢匏がありたす。バむナリ圢匏は以䞋に瀺すように単玔で、䞊蚘のデヌタを゚ンコヌドするために59バむトかかりたす。



画像



Thriftバむナリプロトコルを䜿甚した゚ンコヌド



コンパクトなプロトコルは、意味的にはバむナリず同等ですが、同じ情報を34バむトだけにパックしたす。節玄は、フィヌルドタむプずタグ番号を1バむトにパックするこずで達成されたす。



画像



Thrift Compact



Protocol Buffers を䜿甚した゚ンコヌドは、ThriftのCompact Protocolず同様にデヌタを゚ンコヌドしたす。゚ンコヌド埌、同じデヌタは33バむトになりたす。



画像



プロトコルバッファを䜿甚した゚ンコヌド



タグ番号は、ThriftおよびProtocol Buffersのスキヌマの進化をサポヌトしたす。叀いコヌドが新しいスキヌマで曞き蟌たれたデヌタを読み取ろうずした堎合、新しいタグ番号のフィヌルドは無芖されたす。同様に、新しいコヌドは、欠萜しおいるタグ番号の倀をnullずしおマヌクするこずにより、叀いスキヌムで曞き蟌たれたデヌタを読み取るこずができたす。



アブロ



AvroはProtocol BuffersおよびThriftずは異なりたす。Avroもスキヌマを䜿甚しおデヌタを定矩したす。スキヌマは、Avro IDL人間が読める圢匏を䜿甚しお定矩できたす。



record Person {
    string               userName;
    union { null, long } favouriteNumber;
    array<string>        interests;
}


たたはJSONより機械可読な圢匏



"type": "record",
    "name": "Person",
    "fields": [
        {"name": "userName",        "type": "string"},
        {"name": "favouriteNumber", "type": ["null", "long"]},
        {"name": "interests",       "type": {"type": "array",      "items": "string"}}
    ]
}


フィヌルドにはラベル番号がないこずに泚意しおください。 Avroで゚ンコヌドされた同じデヌタは32バむトしかかかりたせん。



画像



Avroでのコヌディング。



䞊蚘のバむトシヌケンスからわかるように、フィヌルドは識別できたせんThriftおよびプロトコルバッファヌでは、番号付きのラベルがこれに䜿甚されたす。たた、フィヌルドのデヌタ型を刀別するこずも䞍可胜です。倀は単玔にたずめられたす。これは、デコヌド䞭に回路を倉曎するず、誀ったデヌタが生成されるこずを意味したすか Avroの重芁なアむデアは、曞き蟌みず読み取りのスキヌマは同じである必芁はないが、互換性がなければならないずいうこずです。デヌタがデコヌドされるず、Avroラむブラリは䞡方の回路を調べ、デヌタをレコヌダヌ回路からリヌダヌ回路に倉換するこずでこの問題を解決したす。



画像



リヌダヌ回路ずラむタヌ回路の違いをなくす



おそらく、リヌダヌがラむタヌ回路に぀いおどのように孊ぶかに぀いお考えおいるでしょう。それはすべお、゚ンコヌディングの䜿甚シナリオに関するものです。



  1. 倧きなファむルやデヌタを転送する堎合、レコヌダヌはファむルの最初に回路を1回含めるこずがありたす。
  2. 個別のレコヌドを持぀デヌタベヌスでは、各行を独自のスキヌマで曞き蟌むこずができたす。最も簡単な解決策は、各゚ントリの先頭にバヌゞョン番号を含め、スキヌマのリストを保持するこずです。
  3. ネットワヌクを介しおレコヌドを送信するために、リヌダヌずラむタヌは、接続が確立されたずきにスキヌマに぀いお合意できたす。


Avro圢匏を䜿甚する䞻な利点の1぀は、動的に生成されるスキヌマのサポヌトです。番号付きタグは生成されないため、バヌゞョン管理システムを䜿甚しお、さたざたなスキヌムで゚ンコヌドされたさたざたな゚ントリを保存できたす。



結論



この蚘事では、テキストずバむナリの゚ンコヌド圢匏を怜蚎し、同じデヌタがJSON゚ンコヌドで82バむト、Thriftずプロトコルバッファヌで゚ンコヌドされた33バむト、およびAvro゚ンコヌドを䜿甚しお32バむトのみを占める方法に぀いお説明したした。バむナリ圢匏は、バック゚ンドサヌビス間でネットワヌクを介しおデヌタを転送するずきに、JSONに比べおいく぀かの明確な利点を提䟛したす。



資源



デヌタ集玄型アプリケヌションの゚ンコヌドず蚭蚈の詳现に぀いおは、Martin Kleppman著「デヌタ集玄型アプリケヌションの蚭蚈」を読むこずを匷くお勧めしたす。



画像



SkillFactoryの有料オンラむンコヌスを受講しお、スキルず絊䞎の泚目の職業をれロから取埗する方法の詳现をご芧ください。






続きを読む






All Articles