Hint: There is a TProtocolDecorator implementation for all languages implementing multiplex.


-----Ursprüngliche Nachricht----- From: David Shoemaker
Sent: Monday, April 20, 2015 7:49 PM
To: dev@thrift.apache.org
Subject: Re: method names sent as strings

Ben,

That is a clever idea! I'm a little hesitant to take that approach, because
we'd have to implement it for each language that we use, and the ordinals
would have to be in code for each of these languages. I'll explore how we
might encode that data in the IDL somehow so that each language
implementation is generic.

Thanks,
David


On Mon, Apr 20, 2015 at 6:59 AM, Ben Craig <ben.cr...@ni.com> wrote:

David,
If you method ordinals today, without changing the generator, and without
even changing Apache Thrift source, you can hack it at the protocol level.
 Inherit from your protocol of choice, and then override readMessageBegin
and writeMessageBegin, and you can translate from the code generated
string to your own over-the-wire ordinal / hash value.  Similar tricks may
be possible on the multiplexing front as well.

This has the disadvantage of putting the ordinals in code, as opposed to
putting them in the .thrift file, but it should be less work short term.



From:   Randy Abernethy <randy.aberne...@gmail.com>
To:     "dev@thrift.apache.org" <dev@thrift.apache.org>,
Date:   04/19/2015 06:06 PM
Subject:        Re: method names sent as strings



Hey Dave,



I can’t speak to the original motivations, but one view on the methods
front might be that method ordinals would be a little more prone to
collisions than method names in scenarios where service inheritance is in
place (particularly if the service interfaces are controlled by separate
parties). In contrast, parameters are all defined in a single file and
have
an explicit scope. Perhaps more material, the platform was originally
focused on backend services running in data centers with >1KB MTUs (rather
than 27 bytes). I doubt anyone would use that as an argument against
efficiency today however.



The implementation of method ordinals would require an update to all of
the
language generators (>20), a sizable piece of work. So while method
ordinals are a feature with clear benefits, it would have to overcome some
inertia to become a reality. On the upside, method ordinals could be added
language by language as an option without too much disruption [e.g. thrift
--use_method_ordinals might use the ordinal (“1”) from the IDL rather than
the name (“fetchBookingData“) on the wire and both could be supported on
the processor side]. Internally, the IDL parser could supply ordinals and
names, allowing and the old generators to ignore the ordinals until
support
can be added.



On the service front, multiplexing was only added in 0.9.1 as I recall.
One
of the attractive aspects was the layering nature of the multiplexing
client and processor. Multiplexing does not impact the IDL, compiler or
any
of the existing library code. Also you need not use it. If you want
multiplexing and want shorter service names you could use ordinal strings
today (e.g. service 1 {...}), perhaps defining more descriptive macros for
end users. Adding proper service ordinals to the IDL would require more
significant compiler and lib updates and, given service names are
essentially global, the opportunity for collision is more substantial. I
think service ordinals offer less bang for the buck than method ordinals.
Might make a good follow on project if method ordinals got off the ground.



Nice discussion topic!



Best,

Randy

On Fri, Apr 17, 2015 at 4:59 PM, David Shoemaker <mrs...@gmail.com> wrote:

> Thrift dev,
>
> I was wondering why the decision was made to serialize method names as
> strings. A helpful thrifter on IRC (JensG) pointed me to
> https://thrift.apache.org/static/files/thrift-20070401.pdf, which states
> that hashing method names was considered, but was found to be
problematic.
>
> I can't argue with that, but I do wonder why we can't simply tag each
> method with a ": 1", ": 2", etc. like we do with struct members and
method
> arguments.
>
> I've also been using service multiplexing and noticed that service names
> are sent as strings with each method call as well. It would seem that
> tagging services with integers could be a good feature as well, given
that
> varint encoding would then take the (service name, method name) tuple
down
> to two bytes in many cases.
>
> The reason I ask is that I'm using thrift over BLE (bluetooth low
energy),
> so my MTUs are small enough that a few extra bytes leads to extra
packets,
> which increases latency.
>
> Thanks,
> David
>




Reply via email to