Doug,

Thank you for your reply. I read codes and found that provided idea seems good.
But I guess that I/Os on f2 and f3 don't proceed while proceeding I/O on f1. As 
a result, it might not utilize maximum network bandwidth of the servers thus 
latency will increase.
I mean, I/Os seem not to run in parallel. Here is the picture:

provided idea will become like:
request 1 --send-->               --receive-->     // Sending and receiving 
won't proceed in parallel.
request 2         --send-->                  --receive-->
request 3                 --send-->                     --receive-->
server 1          ---doit-->
server 2                  ---doit-->
server 3                          ---doit-->

ideal sequence is:
request 1 --send-->        --receive-->                    // Because the 
network bandwidth of client is
request 2 -----send----->        ----receive--->          // limited, 
paralleled sending and receiving take
request 3 -------send-------->        ----receive---->   // longer time 
compared with non-paralleled one.
server 1          ---doit-->
server 2                ---doit-->                   |             |
server 3                     ---doit-->              +-------------+
          |                                    |    latency increases
          +------------------------------------+
                     I/O in parallel

This becomes problem only when data is large, and there are many active clients 
than servers. I found that asynchronous calls of Thrift has similar design.
I'll try to test how much performance changes in actuality using another system.

Thanks,
Sadayuki

--
Sadayuki Furuhashi
[email protected]
http://msgpack.sourceforge.net/
http://kumofs.sourceforge.net/

On 2010/06/15, at 11:51, Doug Cutting wrote:

> Sadayuki,
> 
> Avro does not currently support such an API, but it might not be difficult to 
> add one and it would be very useful to have.
> 
> The Transciever API might to be extended with a method like:
> 
> Future<List<ByteBuffer>> transceiveFuture(List<ByteBuffer>);
> 
> and the Requestor API might add a method like:
> 
> Future<Object> requestFuture(...)
> 
> If you are interested in pursuing this, please file an issue in Jira.
> 
> Thanks,
> 
> Doug
> 
> On 06/13/2010 09:35 PM, FURUHASHI Sadayuki wrote:
>> Hi,
>> 
>> I'm working on distributed systems and looking for flexible RPC system, then 
>> I found Protocol Buffers, Thrift and Avro.
>> I'd like to compare and test these recently proposed systems.
>> 
>> Our system requires clients to communicate with other multiple servers in 
>> parallel.
>> Here is the picture:
>> 
>>                 +---->  Server 1  \
>>                 |
>>     Client<----+---->  Server 2  -- Servers proceed requirests in parallel,
>>                 |                   then the Client gathers the results.
>>                 +---->  Server 3  /
>> 
>> The codes will be like following:
>> 
>>     Client c1 = new Client("server1:1010");
>>     Client c2 = new Client("server2:1010");
>>     Client c3 = new Client("server3:1010");
>> 
>>     // sends queries to each servers.
>>     Future<ResultChunk>  f1 = c1.DoIt(query1, data1);  // Since the data is 
>> rather large,
>>     Future<ResultChunk>  f2 = c2.DoIt(query2, data2);  // asynchronous 
>> (parallel) sending
>>     Future<ResultChunk>  f3 = c3.DoIt(query3, data3);  // and receiving are 
>> wished.
>> 
>>     // gatehrs results.
>>     ResultChunk result1 = f1.get();
>>     ResultChunk result2 = f2.get();
>>     ResultChunk result3 = f3.get();
>> 
>>     // merges the results into one object.
>>     Result result = new Result.merge(result1, result2, result3);
>> 
>> My question is that Avro supports these feature? Or is there plan to 
>> implement it?
>> I couldn't find them on the source code. Design of RPC is still in under 
>> construction?
>> 
>> Thanks for any pointers,
>> Sadayuki
>> 
>> --
>> Sadayuki Furuhashi
>> [email protected]

Reply via email to