serialization प्रदर्शन इकाई सीरियलाइजेशन: बीएसओएन बनाम संदेशपैक(बनाम जेएसओएन)




deserialization bson (3)

हाल ही में मुझे संदेशपैक मिला है, जो Google के प्रोटोकॉल बफर और JSON के लिए एक वैकल्पिक बाइनरी सीरियलाइजेशन प्रारूप है जो दोनों को बेहतर प्रदर्शन करता है।

इसके अलावा BSON सीरियलाइजेशन प्रारूप भी है जो डेटा स्टोर करने के लिए मोंगोडीबी द्वारा उपयोग किया जाता है।

क्या कोई बीएसओएन बनाम संदेशपैक के अंतर और लाभों को विस्तारित कर सकता है?

केवल प्रदर्शन बाइनरी क्रमबद्धता प्रारूपों की सूची को पूरा करने के लिए: Gobs भी हैं जो Google के प्रोटोकॉल बफर के उत्तराधिकारी बनने जा रहे हैं । हालांकि सभी अन्य उल्लिखित प्रारूपों के विपरीत वे भाषा-अज्ञेयवादी नहीं हैं और गो के अंतर्निर्मित प्रतिबिंब पर भरोसा करते हैं, कम से कम अन्य भाषा के लिए गोब्स पुस्तकालय भी हैं।


// कृपया ध्यान दें कि मैं MessagePack के लेखक हूं। यह जवाब पक्षपातपूर्ण हो सकता है।

प्रारूप डिजाइन

  1. JSON के साथ संगतता

    इसके नाम के बावजूद, जेएसओएन के साथ बीएसओएन की संगतता संदेशपैक की तुलना में बहुत अच्छी नहीं है।

    बीएसओएन में "ऑब्जेक्टआईडी", "मिनी की", "यूयूआईडी" या "एमडी 5" जैसे विशेष प्रकार हैं (मुझे लगता है कि इन प्रकारों को मोंगोडीबी द्वारा आवश्यक है)। ये प्रकार JSON के साथ संगत नहीं हैं। इसका मतलब है कि जब आप बीएसओएन से जेएसओएन में वस्तुओं को परिवर्तित करते हैं तो कुछ प्रकार की जानकारी खो जाती है। एकल सेवा में JSON और BSON दोनों का उपयोग करना हानिकारक हो सकता है।

    MessagePack को पारदर्शी रूप से JSON से / परिवर्तित करने के लिए डिज़ाइन किया गया है।

  2. संदेशपैक बीएसओएन से छोटा है

    संदेशपैक का प्रारूप बीएसओएन की तुलना में कम वर्बोज़ है। नतीजतन, संदेशपैक बीएसओएन से छोटी वस्तुओं को क्रमबद्ध कर सकता है।

    उदाहरण के लिए, एक साधारण मानचित्र {"ए": 1, "बी": 2} को संदेशपैक के साथ 7 बाइट्स में क्रमबद्ध किया गया है, जबकि बीएसओएन 1 9 बाइट्स का उपयोग करता है।

  3. बीएसओएन जगह-जगह अद्यतन करने का समर्थन करता है

    बीएसओएन के साथ, आप पूरे ऑब्जेक्ट को फिर से क्रमबद्ध किए बिना संग्रहित ऑब्जेक्ट का हिस्सा संशोधित कर सकते हैं। आइए मान लें कि एक नक्शा {"ए": 1, "बी": 2} एक फाइल में संग्रहीत है और आप 1 से 2000 के "ए" के मान को अपडेट करना चाहते हैं।

    MessagePack के साथ, 1 केवल 1 बाइट का उपयोग करता है लेकिन 2000 3 बाइट्स का उपयोग करता है। तो "बी" को 2 बाइट से पीछे ले जाना चाहिए, जबकि "बी" संशोधित नहीं किया गया है।

    बीएसओएन के साथ, 1 और 2000 दोनों 5 बाइट्स का उपयोग करते हैं। इस क्रियाशक्ति के कारण, आपको "बी" को स्थानांतरित करने की आवश्यकता नहीं है।

  4. संदेशपैक में आरपीसी है

    संदेशपैक, प्रोटोकॉल बफर, थ्रिफ्ट और एवरो समर्थन आरपीसी। लेकिन बीएसओएन नहीं करता है।

इन मतभेदों का अर्थ है कि संदेशपैक मूल रूप से नेटवर्क संचार के लिए डिज़ाइन किया गया है जबकि बीएसओएन स्टोरेज के लिए डिज़ाइन किया गया है।

कार्यान्वयन और एपीआई डिजाइन

  1. संदेशपैक में टाइप-चेकिंग एपीआई (जावा, सी ++ और डी) है

    MessagePack स्थिर-टाइपिंग का समर्थन करता है।

    JSON या BSON के साथ उपयोग किए जाने वाले डायनामिक-टाइपिंग रूबी, पायथन या जावास्क्रिप्ट जैसी गतिशील भाषाओं के लिए उपयोगी हैं। लेकिन स्थिर भाषाओं के लिए परेशानी है। आपको उबाऊ प्रकार-जांच कोड लिखना होगा।

    संदेशपैक टाइप-चेकिंग एपीआई प्रदान करता है। यह गतिशील रूप से टाइप की गई वस्तुओं को स्थैतिक रूप से टाइप की गई वस्तुओं में परिवर्तित करता है। यहां एक साधारण उदाहरण है (सी ++):

    #include <msgpack.hpp>
    
    class myclass {
    private:
        std::string str;
        std::vector<int> vec;
    public:
        // This macro enables this class to be serialized/deserialized
        MSGPACK_DEFINE(str, vec);
    };
    
    int main(void) {
        // serialize
        myclass m1 = ...;
    
        msgpack::sbuffer buffer;
        msgpack::pack(&buffer, m1);
    
        // deserialize
        msgpack::unpacked result;
        msgpack::unpack(&result, buffer.data(), buffer.size());
    
        // you get dynamically-typed object
        msgpack::object obj = result.get();
    
        // convert it to statically-typed object
        myclass m2 = obj.as<myclass>();
    }
    
  2. संदेशपैक में आईडीएल है

    यह टाइप-चेकिंग एपीआई से संबंधित है, संदेशपैक आईडीएल का समर्थन करता है। (विनिर्देशन से उपलब्ध है: http://wiki.msgpack.org/display/MSGPACK/Design+of+IDL )

    प्रोटोकॉल बफर और थ्रिफ्ट को आईडीएल की आवश्यकता होती है (डायनामिक-टाइपिंग का समर्थन न करें) और अधिक परिपक्व आईडीएल कार्यान्वयन प्रदान करें।

  3. संदेशपैक में एपीआई स्ट्रीमिंग है (रूबी, पायथन, जावा, सी ++, ...)

    संदेशपैक स्ट्रीमिंग deserializers का समर्थन करता है। यह सुविधा नेटवर्क संचार के लिए उपयोगी है। यहां एक उदाहरण है (रूबी):

    require 'msgpack'
    
    # write objects to stdout
    $stdout.write [1,2,3].to_msgpack
    $stdout.write [1,2,3].to_msgpack
    
    # read objects from stdin using streaming deserializer
    unpacker = MessagePack::Unpacker.new($stdin)
    # use iterator
    unpacker.each {|obj|
      p obj
    }
    

मुझे पता है कि इस सवाल पर इस बिंदु पर थोड़ा सा दिनांक है ... मुझे लगता है कि यह उल्लेख करना बहुत महत्वपूर्ण है कि यह आपके क्लाइंट / सर्वर पर्यावरण की तरह दिखता है।

यदि आप निरीक्षण के बिना कई बार बाइट्स गुजर रहे हैं, जैसे संदेश कतार प्रणाली या डिस्क पर स्ट्रीमिंग लॉग प्रविष्टियों के साथ, तो आप कॉम्पैक्ट आकार पर जोर देने के लिए बाइनरी एन्कोडिंग को अच्छी तरह से पसंद कर सकते हैं। अन्यथा यह विभिन्न वातावरण के साथ मामले के मामले में एक मामला है।

कुछ वातावरण में बहुत तेज़ क्रमिकरण और despialization हो सकता है / msgstr "संदेश / प्रोटोबफ के लिए, दूसरों को इतना नहीं। आम तौर पर, अधिक निम्न स्तर की भाषा / पर्यावरण बेहतर बाइनरी क्रमबद्धता काम करेगा। उच्च स्तर की भाषाओं में (node.js, .Net, JVM) आप अक्सर देखेंगे कि JSON serialization वास्तव में तेज़ है। तब सवाल यह हो जाता है कि आपका नेटवर्क ओवरहेड आपकी मेमोरी / सीपीयू से कम या ज्यादा बाधित है?

Msgpack बनाम बीएसओ बनाम प्रोटोकॉल बफर के संबंध में ... msgpack समूह के कम से कम बाइट्स है, प्रोटोकॉल बफर इसके बारे में हैं। बीएसओएन दूसरे दो की तुलना में अधिक व्यापक देशी प्रकारों को परिभाषित करता है, और यह आपके ऑब्जेक्ट मोड के लिए बेहतर मिलान हो सकता है, लेकिन इससे यह अधिक वर्बोज़ बन जाता है। प्रोटोकॉल बफर को स्ट्रीम करने के लिए डिज़ाइन किए जाने का लाभ होता है ... जो इसे बाइनरी ट्रांसफर / स्टोरेज प्रारूप के लिए एक अधिक प्राकृतिक प्रारूप बनाता है।

व्यक्तिगत रूप से, मैं पारदर्शिता की तरफ झुकता हूं कि JSON सीधे ऑफ़र करता है, जब तक हल्का ट्रैफ़िक की स्पष्ट आवश्यकता न हो। Gzipped डेटा के साथ HTTP पर, नेटवर्क ओवरहेड में अंतर स्वरूपों के बीच एक समस्या से भी कम है।


त्वरित परीक्षण से पता चलता है कि जेएसओएन बाइनरी मेसेजपैक की तुलना में तेजी से deserialized है। परीक्षणों में Article.json 550kb minified JSON है, Article.mpack इसका 420kb एमपी-संस्करण है। पाठ्यक्रम का कार्यान्वयन मुद्दा हो सकता है।

MessagePack:

//test_mp.js
var msg = require('msgpack');
var fs = require('fs');

var article = fs.readFileSync('Article.mpack');

for (var i = 0; i < 10000; i++) {
    msg.unpack(article);    
}

JSON:

// test_json.js
var msg = require('msgpack');
var fs = require('fs');

var article = fs.readFileSync('Article.json', 'utf-8');

for (var i = 0; i < 10000; i++) {
    JSON.parse(article);
}

तो समय हैं:

Anarki:Downloads oleksii$ time node test_mp.js 

real    2m45.042s
user    2m44.662s
sys     0m2.034s

Anarki:Downloads oleksii$ time node test_json.js 

real    2m15.497s
user    2m15.458s
sys     0m0.824s

तो अंतरिक्ष बचाया गया है, लेकिन तेजी से? नहीं।

परीक्षण संस्करण:

Anarki:Downloads oleksii$ node --version
v0.8.12
Anarki:Downloads oleksii$ npm list msgpack
/Users/oleksii
└── [email protected]  




messagepack