[ https://issues.apache.org/jira/browse/THRIFT-66?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12882173#action_12882173 ]
James E. King, III commented on THRIFT-66: ------------------------------------------ I took a completely different approach to solving this... there is an unused byte in the VERSION_1 Thrift message header which I designated for a "Channel". I rewrote the C# runtime and added two-way communication, SSL Support, and multiple services on a single connection which is binary compatible with older clients (they can only communication on channel zero, in one direction, just like a legacy client would..) When an endpoint initializes it can install protocol handlers on whatever channel it wants. Each side of the connection is able to implement a protocol handler, and each side is able to make a client to query the other side. Each side is also able to process multiple requests in parallel on a single connection. It is still going through testing, and I would like to refactor the shutdown logic so that it does not rely on socket exceptions before I post it though, unless folks would like to get the ball rolling on two-way communication across all Thrift languages and use this as a template to work from.. > Allow multiplexing multiple services over a single TCP connection > ----------------------------------------------------------------- > > Key: THRIFT-66 > URL: https://issues.apache.org/jira/browse/THRIFT-66 > Project: Thrift > Issue Type: New Feature > Components: Library (C#), Library (C++), Library (Cocoa), Library > (Erlang), Library (Java), Library (Perl), Library (Python), Library (Ruby) > Reporter: Johan Stuyts > Priority: Trivial > Attachments: CalculatorImpl.java, MultiplexTestClientMain.java, > MultiplexTestServerMain.java, SharedImpl.java, > ThriftMultiplexInvocationHandler.java, TMultiplexServer.java, > TMultiplexServer.py, TSimpleMultiplexServer.java > > > The current {{TServer}} implementations expose a single service on a port. If > an application has many services many ports have to be opened. This is > cumbersome because: > - you have to document which service is available on which port, and > remembering the port numbers is difficult > - to prevent the overhead of connection setup on each call, a client has to > maintain to many connections: at least one to each port > - it requires opening many ports on a firewall if one is between the client > and the server. > By multiplexing multiple services on a single port the problems above are > resolved: > - instead of a port number a symbolic name can be assigned to a service > - a client can maintain a small pool of connections to a single port > - only one port has to be opened on the firewall > The attached Java implementation simply wraps a normal {{CALL}} message with > a (new) {{SERVICE_SELECTION}} message. It is not necessary to modify or wrap > the response. No changes are needed to the generated classes. Only a new type > of server is introduced, and an invocation handler for a dynamic proxy around > the {{Client}} classes of services is provided for the client side. The > implementation does not handle communication errors (invalid data, timeouts, > etc.) yet. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.