MessagePack: It's like JSON, but fast and small.

msgpack.org

94 points by davikr 2 days ago


buserror - 2 days ago

I played quite a bit with MessagePack, used it for various things, and I don't like it. My primary gripes are:

+ The Object and Array needs to be entirely and deep parsed. You cannot skip them.

+ Object and Array cannot be streamed when writing. They require a 'count' at the beginning, and since the 'count' size can vary in number of bytes, you can't even "walk back" and update it. It would have been MUCH, MUCH better to have a "begin" and "end" tag --- err pretty much like JSON has, really.

You can alleviate the problems by using extensions, store a byte count to skip etc etc but really, if you start there, might as well use another format altogether.

Also, from my tests, it is not particularly more compact, unless again you spend some time and add a hash table for keys and embed that -- but then again, at that point where it becomes valuable, might as well gzip the JSON!

So in the end it is a lot better in my experience to use some sort of 'extended' JSON format, with the idiocies removed (trailing commas, forcing double-quote for keys etc).

ubutler - 2 days ago

Although MessagePack is definitely not a drop-in replacement for JSON, it is certainly extremely useful.

Unlike JSON, you can’t just open a MessagePack file in Notepad or vim and have it make sense. It’s often not human readable. So using MessagePack to store config files probably isn’t a good idea if you or your users will ever need to read them for debugging purposes.

But as a format for something like IPC or high-performance, low-latency communication in general, MessagePack brings serious improvements over JSON.

I recently had to build an inference server that needed to be able to communicate with an API server with minimal latency.

I started with gRPC and protobuf since it’s what everyone recommends, yet after a lot of benchmarking, I found a way faster method to be serving MessagePack over HTTP with a Litestar Python server (it’s much faster than FastAPI), using msgspec for super fast MessagePack encoding and ormsgpack for super fast decoding.

Not sure how this beat protobuf and gRPC but it did. Perhaps the Python implementation is just slow. It was still faster than JSON over HTTP, however.

mdhb - 2 days ago

CBOR: It’s like JSON but fast and small but also an official IETF standard.

https://cbor.io/

toomim - 2 days ago

MessagePack saves a little bit of space and CPU ... but not a lot:

https://media.licdn.com/dms/image/v2/D5612AQF-nFt1cYZhKg/art...

Source: https://www.linkedin.com/pulse/json-vs-messagepack-battle-da...

janalsncm - 2 days ago

In my experience protobuf was smaller than MessagePack. I even tried compressing both with zstd and protobuf was still smaller. On the other hand protobuf is a lot less flexible.

jedisct1 - an hour ago

ZigPack is a pretty good MessagePack implementation written in Zig: https://github.com/thislight/zigpak

fshafique - 2 days ago

Does it solve the problem of repeating set of keys in an object array, eg. when representing a table?

I don't think using a dictionary of key values is the way to go here. I think there should be a dedicated "table" type, where the column keys are only defined once, and not repeated for every single row.

karteum - 2 days ago

I discovered JSON Binpack recently, which works either schemaless (like msgpack) or - supposedly more efficiently - with a schema. I haven't tried the codebase yet but it looks interesting.

https://jsonbinpack.sourcemeta.com/

sd9 - 2 days ago

It drops the most useful aspect of JSON, which is that you can open it in a text editor.

It's like JSON in that it's a serialisation format.

vdqtp3 - 2 days ago

Ignorant question - is the relatively small size benefit worth another standard that's fairly opaque to troubleshooting and loses readability?

Is there a direct comparison of why someone should choose this over alternatives? 27 bytes down to 18 bytes (for their example) just doesn't seem like enough of a benefit. This clearly isn't targeted to me in either case, but for someone without much knowledge of the space, it seems like a solution in search of a problem.

slurpyb - 2 days ago

Shouts to msgspec - i havent had a project without it in awhile.

xcircle - a day ago

In our C++ project, we use the nlohmann library for handling JSON data. When sending JSON over MQTT, we leverage a built-in function of nlohmann to serialize our JSON objects into the MessagePack format. You can simply call jsonObj.to_msgpack(). Similarly, the data can be decoded back easily.

dallbee - 2 days ago

A trick I often use to get the most out of messagepack is using array encoding of structs. Most msgp libraries have support for this.

This gives you a key benefit of protobuf, without needing external schema files: you don't have to pay the space of the keys of your data.

This is simply not something you can do with JSON, and depending on your data can yield substantial space savings.

mattbillenstein - 2 days ago

I've built a few systems using msgpack-rpc - serves really well as a transport format in my experience!

eeasss - 2 days ago

Serialziation vulnerabilities anyone

h_tbob - 2 days ago

I like how it makes binary easy. I wish there was a simple way to do binary in JSON.

agieocean - 2 days ago

Made an open image format with this for constrained networks and it works great