I'm assuming that the goals of an optimized transport for Avro RPC are
something like the following:

 * Framing should be efficient, easy to implement.
 * Streaming of large values, both as part of a request and as a response is
very important.
 * Being able to have multiple concurrent requests in flight, while also
being able to have ordering guarantees where desired is necessary.
 * It should be easy to implement this in Java, C, Python, Ruby, etc.
 * Security is or will be important. This security can include authorization
as well as privacy concerns.

I'd like to see something based largely upon RFC 3080, with some
simplifications and extensions:

    http://www.faqs.org/rfcs/rfc3080.html

What does this get us?

 * This system has mechanisms in place for streaming both a single large
message and breaking a single reply up into multiple answers, allowing for
pretty flexible streaming.  (You can even mix these by having an answer that
gets chunked itself.)
 * Concurrency is achieved by having multiple channels. Each channel
executes messages in order, so you have a good mechanism for sending
multiple things at once as well as maintaining ordering guarantees as
necessary.
 * Reporting errors is very clear as it is a separate response type.
 * It has already been specified pretty clearly and we'd just be evolving
that to something that more closely matches our needs.
 * It specifies sufficient data that you could implement this over
transports other than TCP, such as UDP.

Changes, rough list:

 * Use Avro-encoding for most things, so the encoding of a message would
become an Avro struct.
 * Lose profiles in the sense that they're used in that specification since
we're just exchanging Avro RPCs.
 * Do length prefixing rather than in the header, so that it is very
amenable to binary I/O at high volumes.
 * No XML stuff, just existing things like the Avro handshake, wrapped up in
messages.
 * For now, don't worry about things like flow control as expressed in RFC
3081, mapping of 3080 to TCP.
 * Think about adding something for true one-way messages, but an empty
reply frame is probably sufficient, since that still allows reporting errors
if needed (or desired).
 * May well need some extensions for a more flexible security model.
 * Use Avro RPC stuff to encode the channel management commands on channel 0
rather than XML.

RFC 3117 (http://www.faqs.org/rfcs/rfc3117.html) goes into some of the
philosophy and thinking behind the design of RFC 3080.  Both are short and
easy reading.

 - Bruce

Reply via email to