MessagePack — JSONga o‘xshash data modelini compact binary ko‘rinishda serialize qiladigan format. U object, array, string, binary, boolean, null va sonlarni kichik type markerlari bilan kodlaydi. MessagePack network, cache, queue, game va service communicationda ishlatilishi mumkin.
Formatning maqsadi JSONning soddaligini saqlab, payload hajmi va parse tezligini yaxshilashdir.
Data model
MessagePack quyidagi asosiy turlarni qo‘llaydi:
Map JSON objectga, array esa JSON arrayga yaqin.
Binary format
Har qiymat oldida uning type’i va ayrim hollarda uzunligini bildiruvchi prefix mavjud.
Kichik son va qisqa stringlar compact fix formatlarda yoziladi.
Katta qiymatlar uchun uzunroq header ishlatiladi.
Parser prefix orqali keyingi byte’larni qanday o‘qishni biladi.
Map
Map key-value juftliklaridan tashkil topadi:
{
"name": "Farrukh",
"active": true
}
Key faqat string bo‘lishi shart emas, lekin JSONga mos foydalanishda string key keng tarqalgan.
Turli language mappinglari non-string key’ni boshqacha qo‘llashi mumkin.
Array
Array elementlar tartibini saqlaydi.
Misol:
[10, 20, 30]
Elementlar boshqa array yoki map bo‘lishi mumkin.
Juda katta array stream yoki chunkga bo‘linishi ehtimoli bor.
Integer
MessagePack signed va unsigned integerlarning bir nechta o‘lchamini qo‘llaydi.
Kichik musbat sonlar bitta byte ichida kodlanishi mumkin.
Client language integer diapazonini to‘liq qo‘llamasligi mumkin.
JavaScript katta integer uchun BigInt yoki maxsus wrapper talab qilishi ehtimoli bor.
String
String odatda UTF-8 byte’lar bilan saqlanadi.
Header string byte uzunligini ko‘rsatadi.
Character soni va byte soni bir xil bo‘lmasligi mumkin.
Parser invalid UTF-8ga qanday munosabatda bo‘lishi libraryga bog‘liq.
Binary
Raw byte uchun alohida binary type mavjud.
JSONda binary ko‘pincha Base64ga aylantiriladi.
MessagePack binary’ni to‘g‘ridan-to‘g‘ri saqlagani uchun hajm va parsing afzalligi beradi.
Extension type
Extension format application yoki standard extension uchun type code va payload beradi.
U orqali:
- timestamp;
- UUID;
- decimal;
- application-specific type
ifodalanishi mumkin.
Extension code’lar ikki tomon o‘rtasida kelishilgan bo‘lishi kerak.
Timestamp
MessagePack ecosystemida timestamp uchun standard extension mavjud.
U soniya va nanosekund aniqligiga oid formatlardan foydalanishi mumkin.
Language driver timestampni o‘z date/time type’iga map qiladi.
Timezone semantikasi application contractida belgilanadi.
Self-describing xususiyat
MessagePack har qiymat type’ini payload ichida saqlaydi.
Oldindan schema bo‘lmasa ham parser documentni tiklay oladi.
Biroq fieldlarning business ma’nosi, required qiymat va compatibility uchun schema baribir foydali.
Hajm
Qisqa key va kichik sonlarda MessagePack JSONdan ancha ixcham bo‘lishi mumkin.
Lekin map ichida key nomlari har message’da takrorlanadi.
Protobuf kabi field numberli format ba’zi typed message’larda yanada kichik bo‘lishi mumkin.
Tezlik
Binary parser text tokenization va son parse qilishning ayrim xarajatlarini kamaytiradi.
Real tezlik:
- library;
- language;
- allocation;
- object mapping;
- payload shape;
- compression
ga bog‘liq.
Benchmark productionga o‘xshash data bilan bajariladi.
Schema evolyutsiyasi
Map key nomlariga tayanilsa yangi optional field qo‘shish oson.
Eski client noma’lum keyni e’tiborsiz qoldirishi mumkin.
Field olib tashlash yoki type o‘zgartirish breaking change bo‘lishi mumkin.
Array positional contract ishlatilsa element tartibi qat’iyroq.
Streaming
MessagePack qiymatlari ketma-ket streamga yozilishi mumkin.
Ammo message boundary transport orqali yoki parserning value length qoidalari bilan aniqlanadi.
TCP’da bir read bitta to‘liq message qaytarishini kafolatlamaydi.
Incremental decoder ishlatiladi.
RPC va queue
MessagePack RPC request va response payloadi sifatida ishlatilishi mumkin.
Queue’da event body compact bo‘ladi.
Message envelope ichida:
kabi fieldlar saqlanadi.
MessagePack va JSON
MessagePack:
JSON:
Public API uchun JSON, ichki high-throughput kanal uchun MessagePack tanlanishi mumkin.
MessagePack va Protobuf
MessagePack schema talab qilmaydi va dynamic mapga mos.
Protobuf .proto schema, generated type va field numberga tayanadi.
Protobuf contract, compatibility va compact typed message uchun kuchli.
MessagePack moslashuvchan data exchange uchun sodda.
Security
Untrusted MessagePack decoder:
- maksimal depth;
- array/map element soni;
- string va binary hajmi;
- extension type;
- total payload;
- duplicate key
ni cheklaydi.
Custom extension avtomatik arbitrary object constructor chaqirmasligi kerak.
Deterministik kodlash
Bir xil logical map turli key tartibida encode qilinishi mumkin. Oddiy decode uchun bu muammo emas, ammo byte-level hash, digital signature yoki cache key uchun deterministik representation talab qilinadi. Encoder key tartibi, numeric type va extension formatini bir xil tanlashi kerak. Aks holda ma’nosi teng obyektlar boshqa hash beradi.
Versiya maydoni
Schema majburiy bo‘lmasa ham message envelope ichida version saqlash foydali. Consumer eski va yangi payloadni ajratadi, migration yoki fallback ishlatadi. Type’ni taxmin qilish uchun fieldlar mavjudligiga tayanish noaniq bo‘lishi mumkin.
Bog‘liq tushunchalar
MessagePack, Binary serialization, JSON, Map, Array, Extension type, Timestamp, Protobuf, BSON, Data exchange