Thanks Evan and Kenton.

@Evan, I'll definitely check out the plugin.

On Jul 21, 12:30 am, Kenton Varda <ken...@google.com> wrote:
> On Thu, Jul 15, 2010 at 2:22 AM, Jamie McCrindle
> <jamiemccrin...@gmail.com>wrote:
>
> > Hi all,
>
> > I've built a lightweight PB RPC implementation over HTTP which I'd
> > like to pad out with some more functionality but I have a few design
> > questions that I was hoping some of you folk in the group may be able
> > to help with:
>
> > 1. For completeness, it looks like an RPC implementation should
> > provide both RpcChannel and BlockingRpcChannel implementations or is
> > there a default implementation of BlockingRpcChannel around as in:
>
> Right, the RPC system needs to provide these.  An RPC system might choose to
> only provide one or the other, or both (maybe even as a single class),
> depending on the design.  The default implementation you suggested might
> just force the RPC system to create redundant background threads -- if the
> calling thread is going to block anyway, why not use it to handle network
> events in the meantime?

Good plan. I'm currently looking at everything being asynchronous but
for completeness, a BlockingRpcChannel should be implemented.

> > 2. I've been pondering how to inject in Service references. I like the
> > idea that I have a 'local' RPC implementation that could be swapped
> > out for a 'remote' one without having to change the client class. It
> > doesn't seem right to have this code in the client (i.e. recreate the
> > stub for every call):
>
> >        RpcChannel channel = rpc.newChannel("example.com:12345");
> >        RpcController controller = rpc.newController();
> >        Stub testService = TestService.newStub(channel);
> >        testService.test(controller, TestRequest.newBuilder().build(),
> > new RpcCallback<TestResponse>() {
> >            public void run(TestResponse parameter) {
>
> >            }
> >        });
>
> > But rather to inject an implementation of TestService and an
> > RpcController Factory into the client code and just have:
>
> >        RpcController controller = rpc.newController();
> >        testService.test(controller, TestRequest.newBuilder().build(),
> > new RpcCallback<TestResponse>() {
> >            public void run(TestResponse parameter) {
>
> >            }
> >        });
>
> > Because then different RPC implementations can be plugged in
> > (especially local vs. remote).
>
> This is exactly what I do in my own code.

Great stuff.

> > But on a related note, the code above
> > definitely creates a very tight coupling to Protocol Buffers as the
> > RPC mechanism... not that I particularly mind but a lot of other Java
> > 'RPC' type code attempts to abstract out the 'business logic' and the
> > remoting mechanism. Anyone had similar thoughts on how to do this with
> > PB RPC?
>
> You're coupled to protocol buffers, but not to the particular RPC
> implementation.  Protocol buffers is not such a bad thing to couple with --
> it's easy to write code to parse and serialize protobuf objects in any
> format.  Think of your protobuf classes as just dumb data objects that
> happen to have all the usual boilerplate (accessors, builders, etc.)
> automatically generated.

Yeah, I'm becoming comfortable with the idea of coupling to PB, at
least at the edges. There's a lot of mapping across of DTOs, though. A
great example would be PB to Hibernate. That said, I can't complain,
I'm using it to back onto MongoDB at the moment and iterop is pretty
easy as long as I don't use Dates.

> > 3. Regarding extending RpcController. Adding a timeout and a timestamp
> > seem pretty good candidates but the 'EnhancedRpcController' then
> > becomes a pervasive cast as well as a RPC implementation lockin e.g.
> > the code above becomes:
>
> Do you really want to be setting timeouts in your business logic?  In my
> experience, the answer is "no" -- code handling logistics should ideally be
> completely separate from code handling correctness.
>
> Instead, make it the responsibility of the RpcChannel to set such stuff.
>  For example, it could consult a config file, looking up the particular
> method specified by the MethodDescriptor, to find out what options to use.
>  Then the caller doesn't need to know anything about timeouts.

Makes sense. Of course, in this one specific case, the deadline is in
fact part of the 'business logic' :) but that should be only 1 cast
and in the general sense I agree it can be hidden behind the RPC
implementation.

Thanks again for the feedback. I'll probably have more questions once
I'm further in.

-- 
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