If you're interested I have added explanatory comments to the socket-level
protocol definition for Captain Proto (formerly pbcap):

http://code.google.com/p/capnproto/source/browse/proto/capnproto.proto

I still have no conventions for HTTP transport.

On Thu, Dec 10, 2009 at 3:33 PM, Kenton Varda <ken...@google.com> wrote:

> On Thu, Dec 10, 2009 at 3:02 PM, Mikhail Opletayev <opleta...@gmail.com>wrote:
>
>> Will there be a way to directly connect to the service or a client
>> must go thru the discovery service each time a connection is open?
>>
>
> Why build this into the protocol when the discovery service is just as
> good?  Note that the protocol supports sending a request to the returned
> service before actually waiting for it to be returned.  In other words, a
> conversation might look like:
>
> client:  "Open service Foo."
> client:  "When request 1 is complete, call method Bar() on the result."
> server:  "Foo opened successfully.  Here is a reference."
> server:  "Bar completed.  Here is the response."
>
> By keeping service naming out of the low-level protocol, we keep it nice
> and simple, which makes it easier to write a high-quality implementation.
>
> I also intend to provide a standard "discovery service" interface, but it
> will be a layer that sits on top of the raw protocol implementation, rather
> than being built into it.  Applications will be able to use the raw protocol
> without using the standard discovery service if desired.
>
>
>> > What do you mean?  The global "Stream" message exists only to define the
>> > protocol.  It is not actually used at runtime -- individual messages are
>> > read from the stream one at a time.
>>
>> From pbcap.proto it looked to me as all requests and responses must be
>> wrapped inside a Stream message. I guess I'll need to take a look at
>> the implementation before I ask more questions, I only had time to
>> take a quick peak earlier today.
>>
>
> Maybe what you don't like is the fact that the app-specific request message
> is embedded as "bytes" in pbcap.CallRequest?  Currently this requires a
> reduntant copy of all those bytes.  However, I was thinking of adding an
> optimization to the protobuf implementation to avoid this -- we could add a
> way to construct a new ByteString that is a substring of some other
> ByteString in constant time (with no copies).  Then, parsing "bytes" fields
> -- when the original input is a ByteString -- would not require a copy,
> making things efficient.
>
>
>>
>> P.S. I hope my questions don't derail this thread too much as the
>> original question was about HTTP RPC.
>>
>> On Dec 10, 4:42 pm, Kenton Varda <ken...@google.com> wrote:
>> > On Thu, Dec 10, 2009 at 2:37 PM, Mikhail Opletayev <opleta...@gmail.com
>> >wrote:
>> >
>> > > Interesting. Essentially a discovery service for protobuf RPC.
>> >
>> > > I am not quite sure what you mean by "pointers to other services". Is
>> > > it going to reference them by name or a more complex structure
>> > > containing full endpoint information?
>> >
>> > Currently it references them by an ID number that is tied to the
>> particular
>> > connection.  So, each time a new service object is returned on the
>> > connection, a new ID number is assigned to it.
>> >
>> > > Also, is it going to be an extension to pbcap or something completely
>> > > new?
>> >
>> > Not an extension -- this *is* pbcap.  It supports this already.
>> >
>> > (Note that I'm planning to change the name to "Captain Proto", aka
>> > capnproto, to avoid the confusion with pcap.)
>> >
>> > > The reason I am asking is because some patterns in pbcap (such as
>> > > wrapping up everything into a global Stream message) are rather
>> > > questionable and not without consequences.
>> >
>> > What do you mean?  The global "Stream" message exists only to define the
>> > protocol.  It is not actually used at runtime -- individual messages are
>> > read from the stream one at a time.
>> >
>> >
>> >
>> > > Regards,
>> >
>> > > On Dec 10, 4:22 pm, Kenton Varda <ken...@google.com> wrote:
>> > > > On Thu, Dec 10, 2009 at 8:13 AM, Mikhail Opletayev <
>> opleta...@gmail.com
>> > > >wrote:
>> >
>> > > > > It's great news that you working on a standard way to communicate
>> > > > > between Protocol Buffers implementations!
>> >
>> > > > > > You don't need to send the service name at all.  The server
>> should
>> > > > > already
>> > > > > > know what kind of service it is exporting.
>> >
>> > > > > I think its handy to export several services from the same end
>> point,
>> > > > > especially if you are running RPC over something else than HTTP.
>> If
>> > > > > you were to run Protocol Buffers RPC over plain sockets you'd
>> probably
>> > > > > want to publish a bunch of services on the same port.
>> >
>> > > > This is exactly my point.  If you use the service type name to
>> identify
>> > > the
>> > > > service, then you can only export one service of each type.
>>  Instead,
>> > > some
>> > > > other name -- having nothing to do with the type name -- should be
>> used
>> > > to
>> > > > identify the service.
>> >
>> > > > Actually, the implementation I'm working on doesn't even identify
>> > > services
>> > > > by names.  Instead, when you first connect on a port, you connect to
>> the
>> > > > "default service" for that port.  However, the default service can
>> send
>> > > back
>> > > > pointers to other services in RPC responses.  So, the default
>> service may
>> > > > have a method which looks up other services by name, but this is up
>> to
>> > > the
>> > > > application.
>> >
>> > > > > In Dataflow implementation we use one field (method) but we
>> require
>> > > > > the method name to be in "serviceName.methodName" format.
>> >
>> > > > > For the same reason we decided against using HTTP headers to
>> transfer
>> > > > > the RPC metadata as it binds you to the transport protocol. That's
>> why
>> > > > > send content length and header length as the first 2 values in the
>> > > > > coded stream, then the header message, then the actual data
>> message:
>> >
>> > > > >http://www.dataflow-software.com/docs/pbuf-rpc.html
>> >
>> > > > > On Dec 10, 3:15 am, Kenton Varda <ken...@google.com> wrote:
>> > > > > > 2009/12/10 Romain François <francoisrom...@free.fr>
>> >
>> > > > > > > On 12/09/2009 09:12 PM, Kenton Varda wrote:
>> >
>> > > > > > >> Coincidentally, last weekend I started working on an open
>> source
>> > > > > > >> protobuf-based RPC system.  Currently I am defining a
>> socket-level
>> > > > > > >> protocol, but I also intend to support an HTTP-level protocol
>> with
>> > > > > > >> optional JSON encoding to allow calls from Javascript.  I
>> stuck
>> > > some
>> > > > > > >> totally undocumented code here:
>> >
>> > > > > > > Thanks. My intention of having it over http is that it can
>> > > communicate
>> > > > > with
>> > > > > > > other languages. I'd be good if we can synchronize our
>> protocols.
>> >
>> > > > > > > I need to make some changes based on what you said on another
>> > > thread,
>> > > > > and
>> > > > > > > then I'll make my java basic server code available.
>> >
>> > > > > > >  http://pbcap.googlecode.com
>> >
>> > > > > > >> But some coworkers pointed out that the name is confusingly
>> > > similar to
>> > > > > > >> "pcap", so I'm planning to change it.
>> >
>> > > > > > >> Currently this is not an official Google project; I'm working
>> on
>> > > it in
>> > > > > > >> my spare time.
>> >
>> > > > > > >> 2009/12/9 Romain François <francoisrom...@free.fr
>> > > > > > >> <mailto:francoisrom...@free.fr>>
>> >
>> > > > > > >>    A request looks like this :
>> >
>> > > > > > >>    -----------------------------------------------------
>> > > > > > >>    POST /{service full name}/{method name} HTTP/1.0
>> >
>> > > > > > >> I would recommend against putting the service type name in
>> the
>> > > URL.
>> > > > > > >>  This makes it impossible to export two services of the same
>> type.
>> > > > > > >>  Instead, you should allow the application to register
>> services
>> > > under
>> > > > > > >> any name it chooses.
>> >
>> > > > > > > Fair enough. Maybe adding some protobuf specific headers :
>> >
>> > > > > > > ProtobufService: {service full name}
>> >
>> > > > > > You don't need to send the service name at all.  The server
>> should
>> > > > > already
>> > > > > > know what kind of service it is exporting.
>> >
>> > > > > > > ProtobufMethod: {method full name}
>> >
>> > > > > > You do need the method name, though.  Inventing new HTTP headers
>> > > isn't
>> > > > > > usually a good idea as they may confuse proxies and such.
>> >
>> > > > > > > or encode it as parameters of the url as you said.
>> >
>> > > > > > >  I'd also suggest making the method name be part of the query,
>> > > like:
>> >
>> > > > > > >>   POST /someservice?method={method name}
>> >
>> > > > > > >> This may be a matter of taste, but I feel like a service
>> object
>> > > should
>> > > > > > >> be a single HTTP "resource", rather than have each method be
>> a
>> > > > > separate
>> > > > > > >> resource.
>> >
>> > > > > > >>    Connection: close
>> >
>> > > > > > >> Why not allow pipelining?
>> >
>> > > > > > > this was simpler to do a one shot service call, but indeed why
>> not.
>> >
>> > > > > > >     Content-Length: {length of the serialized message}
>> >
>> > > > > > >>    {raw bytes of the serialized message}
>> > > > > > >>    -----------------------------------------------------
>> >
>> > > > > > >>    And a successful response looks like this:
>> >
>> > > > > > >>    -----------------------------------------------------
>> > > > > > >>    HTTP/1.1 200 OK
>> > > > > > >>    Content-length: {length of the serialized response}
>> >
>> > > > > > >>    {raw bytes of the serialized response}
>> > > > > > >>    -----------------------------------------------------
>> >
>> > > > > > >>    Since this is very early in this, I wondered if others
>> would
>> > > have
>> > > > > views
>> > > > > > >>    on this.
>> >
>> > > > > > >>    http is quite verbose for sending protobuf message around,
>> but
>> > > it
>> > > > > is
>> > > > > > >>    likely to be implemented for a lot of languages.
>> >
>> > > > > > >>    Regards,
>> >
>> > > > > > >>    Romain
>> >
>> > > > > > > --
>> > > > > > > Romain Francois
>> > > > > > > Professional R Enthusiast
>> > > > > > > +33(0) 6 28 91 30 30
>> > > > > > >http://romainfrancois.blog.free.fr
>> > > > > > > |-http://tr.im/Gq7i:ohloh
>> > > > > > > |-http://tr.im/FtUu:newpackage : highlight
>> > > > > > > `-http://tr.im/EAD5:LondonRslides
>> >
>> > > > > --
>> >
>> > > > > You received this message because you are subscribed to the Google
>> > > Groups
>> > > > > "Protocol Buffers" group.
>> > > > > To post to this group, send email to proto...@googlegroups.com.
>> > > > > To unsubscribe from this group, send email to
>> > > > > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.com>
>> <protobuf%2bunsubscr...@googlegroups.com<protobuf%252bunsubscr...@googlegroups.com>
>> >
>> > > <protobuf%2bunsubscr...@googlegroups.com<protobuf%252bunsubscr...@googlegroups.com>
>> <protobuf%252bunsubscr...@googlegroups.com<protobuf%25252bunsubscr...@googlegroups.com>
>> >
>> >
>> > > > > .
>> > > > > For more options, visit this group at
>> > > > >http://groups.google.com/group/protobuf?hl=en.
>> >
>> > > --
>> > > Mikhail Opletayev
>> > >http://dataflow-software.com
>> >
>> > > --
>> >
>> > > You received this message because you are subscribed to the Google
>> Groups
>> > > "Protocol Buffers" group.
>> > > To post to this group, send email to proto...@googlegroups.com.
>> > > To unsubscribe from this group, send email to
>> > > protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.com>
>> <protobuf%2bunsubscr...@googlegroups.com<protobuf%252bunsubscr...@googlegroups.com>
>> >
>> > > .
>> > > For more options, visit this group at
>> > >http://groups.google.com/group/protobuf?hl=en.
>>
>> --
>>
>> You received this message because you are subscribed to the Google Groups
>> "Protocol Buffers" group.
>> To post to this group, send email to proto...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> protobuf+unsubscr...@googlegroups.com<protobuf%2bunsubscr...@googlegroups.com>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/protobuf?hl=en.
>>
>>
>>
>

--

You received this message because you are subscribed to the Google Groups 
"Protocol Buffers" group.
To post to this group, send email to proto...@googlegroups.com.
To unsubscribe from this group, send email to 
protobuf+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/protobuf?hl=en.


Reply via email to