binary protocol notes from the facebook hackathon
Tobias Lütke
tobias.luetke at gmail.com
Tue Jul 10 20:54:05 UTC 2007
Looks great,
I wonder how this binary protocol would fare in the face of protocol
changes such as the recently proposed updates which would allow N tags
to be associated with a cache key. Before finalizing the protocol I
think it would be smart to either implement this facility and design
the binary protocol with this in mind or formalize a future safe
extension mechanism.
On 7/10/07, Brad Fitzpatrick <brad at danga.com> wrote:
> Last night at the Facebook memcached hackathon (a wonderful event, btw!),
> a bunch of us server and client authors got in a room and discussed the
> oft-requested memcached binary protocol in depth for some time.
>
> After a dozen false-starts or backtracks, we finally arrived at something
> the whole room was surprisingly happy with that seemed to solve all our
> prior objections and complications.
>
> This may not be perfect, but we'd like to solicit community feedback:
>
> http://code.sixapart.com/svn/memcached/trunk/server/doc/binary-protocol-plan.jpg
> http://code.sixapart.com/svn/memcached/trunk/server/doc/binary-protocol-plan.txt
>
> The text write-up is included below, for ease of quoting in questions.
>
> I'm sure my notes are missing details, so feel free to point out
> omissions, whether or not you were there last night or not. I'll update
> the text file in svn appropriately, as well as reply to the list.
>
> It was also mutually agreed that:
>
> * the binary protocol would be the one most "core" implemented in
> the server, performance being most important
>
> * the ASCII protocol will live on, unchanged, but will be moved
> into protocol_ascii_compat.c, or similar.
>
> * we're all willing to take a speed-hit on ASCII protocol if we
> have to (may not be needed), if the compat code isn't quite
> as efficient as it is now. code readability/maintainability
> more important. plus our time making binary protocol faster
> more important. ASCII viewed as debugging aid, or for low-CPU
> solution for old clients.
>
> * will most likely add a HTTP protocol as well, implemented in
> protocol_http.c or something. not to be exposed to the world,
> but still a lot of use cases for internal-network-only.
>
> With that, the notes...
>
> ---------
>
> Notes regarding the proposed binary protocol from Facebook's hosted
> memcached hackathon on 2007-07-09:
>
> REQUEST STRUCTURE:
>
> * Magic byte / version
> * Cmd byte
> * Key len byte (if no key, 0)
> * Reserved byte (should be 0)
>
> * 4 byte opaque id. (will be copied back in response; means nothing to server)
>
> * 4 byte body length (network order; not including 12 byte header)
>
> [ cmd-specific fixed-width fields ]
>
> * key, if key length above is non-zero.
>
> [ cmd-specific variable-width field ]
>
>
> RESPONSE STRUCTURE:
>
> * Magic byte / version (different from req's magic byte/version, to distinguish
> that it's a response for, say, protocol analyzers)
> * cmd byte (same as response it goes to)
> * err code byte (0 on success, else errcode. hit bit set if fatal/non-normal error)
> * Reserved byte (should be 0)
>
> * 4 byte opaque id copied back from response
>
> * 4 byte body length (network order; not including 12 byte header)
>
> [cmd-specific body]
>
>
> COMMANDS: (for cmd byte)
>
> get - single key get (no more multi-get; clients should pipeline)
> getq - like get, but quiet. that is, no cache miss, return nothing.
>
> Note: clients should implement multi-get (still important for
> reducing network roundtrips!) as n pipelined requests, the
> first n-1 being getq, the last being a regular
> get. that way you're guaranteed to get a response, and
> you know when the server's done. you can also do the naive
> thing and send n pipelined gets, but then you could potentially
> get back a lot of "NOT_FOUND!" error code packets.
>
> delete
> set/add/replace
>
> cmd-specific fixed-width fields for set/add/replace:
>
> * 4 byte expiration time
> * 4 byte flags
> (the 4 byte length is inferred from the total body length,
> subtracting (keylen + body length))
>
>
>
>
> -- Brad
>
>
--
Tobi
http://shopify.com - modern e-commerce software
http://typo.leetsoft.com - Open source weblog engine
http://blog.leetsoft.com - Technical weblog
More information about the memcached
mailing list