Alternative Binary Protocol idea for memcached.
dormando at rydia.net
Fri Feb 22 02:40:05 UTC 2008
This list is the best.
Then there's #memcached on irc.freenode.net
Then there's the wiki linked from danga.com/memcached/
Development and user assistance both happen on this list. It's
relatively low volume. I don't know of any web forums...
joe schmo wrote:
> Does anyone know of a good site to post questions on regarding problems
> with memcahced?
> Date: Thu, 21 Feb 2008 02:42:10 +0000
> From: webb.clint at gmail.com
> To: memcached at lists.danga.com
> Subject: Re: Alternative Binary Protocol idea for memcached.
> Alright, I've started looking at the code.
> Would anyone object if I first started working on abstracting the
> protocol handling routines so that they are handled by callback
> instead of the current if/else setup?
> Then I was going to put all the protocol stuff in prot_ascii.h|c and
> prot_binary.h|c respectively.
> This way we could potentially have hundreds of protocols handled
> without having a lengthy if/else comparison.
> On Wed, Feb 20, 2008 at 10:06 AM, Clint Webb <webb.clint at gmail.com
> <mailto:webb.clint at gmail.com>> wrote:
> I wasn't expecting such a quick reply. Good point about
> allowing multiple protocols. I might pull out some of my old
> code and see how easy it is to drop in.
> I thought I'd give a little background on myself and this
> protocol style. I used to work in the controls and automation
> industry. If you've ever checked your luggage into an airport,
> or sent anything thru USPS, UPS or FedEX, or bought anything
> online from amazon, b&n and other large online stores, or from
> Walmart, kmart, target, etc... then your product has likely had
> some experience with my coding somewhere along the line.
> I developed this protocol for a tiny little side-project for one
> of the above mentioned companies. It was basically a connector
> that took information from a large number of different systems
> and passed it to another. The requirements changed a lot, so I
> developed something that could be fast, but had to be flexible.
> If I added a feature to the server, I didn't want to be forced
> to update all the clients as well. Also, some of the clients
> were tiny little embedded controllers, so it had to be pretty
> simple too.
> This solution was VERY fast, as all the commands are a single
> byte and could be easily mapped to an array of callback
> routines. This protocol also had to run on a real-time system
> also, so we had to ensure that all operations preformed in a
> predictable fashion.
> I seperated the commands by their parameter type. 0-31 had no
> parameter. 32-63 had a single byte parameter. 64-95 had a
> 32-bit parameter. 96-127 had a single-byte paramter which was
> the length of a stream of data to follow (short-string).
> 128-159 had a 32-bit integer that was the length of a stream of
> data to follow. This was our 5 different parameter types. A
> command could only have one parameter.
> This way, the IO handling code could retrieve all the necessary
> data and then pass it off to a callback routine for that command.
> Each socket connection would have a set of buffers set aside for
> the incoming data. In this case we would want a buffer set
> aside to hold the key and value data.
> To speed up processing and ensure that the minimum data set has
> been provided, we used a 32-bit (or was it 64-bit?) word as
> flags. Each operation would set or clear a flag(s). So when
> a GO command is received, it can quickly determine what 'action'
> needs to take place, and which 'parameters' have been provided.
> If we ran out of room having to handle more than 256 commands,
> we would use a command of 0xFF which would expect that the next
> byte would be another command (from a set different to the
> first). I never actually implemented it though. The most
> commands I ever used was about 100 or so.
> I cant imagine that a variable-length structured protocol could
> be much faster than that. Still the emphasis of this protocol
> is not so much on speed, but on flexibility to add functionality
> to the protocol (by adding commands) without breaking existing
> clients (and without having to handle multiple versions of the
> The 'noreply' stuff that I have seen around the list could
> probably benefit from this protocol. I haven't looked close
> enough at the CAS stuff either, but I suspect that would be easy
> to implement too.
> Also, those that want to shave off a few extra bytes in their
> client, have the option of sending a request that only includes
> the bits they want. If you care about expiry leave it out, same
> with flags, tags, cas id's, and anything else. Plus you can
> stream-line some of your requests by not using the CLEAR
> command, and re-using the state.
> Dang, if I had a little more time on my hands right now, I'd be
> really tempted to implement it. I don't actually have a *need*
> for this protocol in memcached, it was purely an intellectual
> itch ever since I saw people complaining about the existing
> protocols being difficult to expand.
> On Feb 20, 2008 4:14 PM, Dustin Sallings <dustin at spy.net
> <mailto:dustin at spy.net>> wrote:
> On Feb 19, 2008, at 22:20, Clint Webb wrote:
> > I know a considerable amount of thought and work has gone
> into the
> > existing flavour of the binary protocol, and I dont expect
> that work
> > to be discarded, I'm really only mentioning this new
> concept now as
> > an alternative for the future if we ever find the current
> > protocol to be too restrictive and inflexible. And
> something to
> > think about, or even use elsewhere.
> The is certainly interesting. The first step of
> doing the binary
> protocol implementation was to create a change that allowed
> protocols to coexist. It would be possible to implement
> this to run
> in parallel with the existing protocols in the 1.3 codebase.
> Intuitively, it doesn't seem as efficient to process
> as what we've
> got now, but I like being proven wrong, so I'd welcome
> another front-
> end protocol. :)
> Of course, I wrote the majority of the current binary
> protocol code
> about six months ago, so I'd really like to at least have
> one in more
> people's hands.
> Dustin Sallings
> "Be excellent to each other"
> "Be excellent to each other"
More information about the memcached