Bosh sahifa Wiki MessagePack

MessagePack

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:

  • nil;
  • boolean;
  • integer;
  • float;
  • string;
  • binary;
  • array;
  • map;
  • extension type.

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:

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:

  • binary;
  • compact;
  • raw byte type;
  • integer width;
  • tez parsing.

JSON:

  • inson o‘qiydi;
  • browser va tool support keng;
  • debugging oson;
  • text transportga mos.

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:

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