Bi-directional communication over a single transport has nothing to do
with the IDL.
It is a new endpoint concept that allows either end to be a client and a server
at the same time.  Using two transports is not firewall friendly and
typically not usable
by most folks because of that.

Async Messaging and pub/sub are message bus style mechanisms, so wouldn't it be
better to implement a message bus transport?  I did some work enabling RabbitMQ
and it was about 75% complete.  See
https://github.com/jeking3/thrift/tree/rabbitmq

Thrift does not have a concept of [in, out, inout] parameters.  All
parameters are [in],
and if data is to be returned then it is in the value returned.  I
don't see that changing.

On Thu, May 16, 2019 at 12:35 AM John Dougrez-Lewis
<jle...@lightblue.com> wrote:
>
> Sorry that last section did appear formatted very well. Here it is again:
>
> ===============================
>
> 1)
>
> A<=>B
>
>   [async] returntype functionName (arg1, arg2)
>
> ====>
>
> A=>B
>
>   Handletype functionName (arg1, arg2)
>
> B=>A
>
>   void functionName (Handletype, returntype)
>
> ===============================
>
> 2)
>
> A<=>B
>
>   [async] returntype functionName (arg1, arg2, [out] arg3
>
> ====>
>
> A=>B
>
>   Handletype functionName (arg1, arg2)
>
> B=>A
>
>   void functionName (Handletype, returntype, arg3)
>
> ===============================
>
> 3)
>
> A<=>B
>
>   [async] returntype functionName (arg1, arg2, [inout] arg3)
>
> ====>
>
> A=>B
>
>   Handletype functionName (arg1, arg2, arg3in)
>
> B=>A
>
>   void functionName (Handletype, returntype, arg3out)
>
>
>
>
> -----Original Message-----
> From: John Dougrez-Lewis [mailto:jle...@lightblue.com]
> Sent: 16 May 2019 05:29
> To: James E. King III
> Cc: dev@thrift.apache.org
> Subject: RE: THRIFT-66 - Bidirectional communication
>
> Yes, my suggestion is for an enhancement to Thrift to make it bidirectional, 
> as follows:
>
>
> 1) use 2 connections, A => B, and B => A using what is already in place.
>
> 2) write, by hand, a new, supporting choreography code to establish this 
> double connection, in the first instance for a single language
>
> 3) extend the IDL support this - adding attributes [asyc] method/interface, 
> [pub/sub] method/interface, [in/out/inout] parameter
>
> 4) extend the IDL generation to implement this:
>
>       i) pre-processing the extended IDL with a new pre-processor to generate 
> the representations of the service definitions for both sides in terms of the 
> current IDL
>
>       ii) generate the language dependent code required to hook up at of the 
> two ends.
>
> 5) implement across multiple languages
>
>
> That gets you to the point where Thrift supports and generates bidirectional, 
> async & pub/sub based on IDL
>
> Then, optionally:
>
> 6) Having achieved a working implementation defined by an extended IDL, 
> consider re-implementing in terms of a single bidirectional transport rather 
> than 2 existing unidirectional independent transports.
>
>
> The extended IDL defining a single async/pubsub A<=>B interface is used to 
> generate 2 interfaces: an outgoing A=>B and an async response return channel 
> B=>A, e.g.:
>
>
> A<=>B
>   [async] returntype functionName (arg1, arg2) => A=>B
>   Handletype functionName (arg1, arg2)
> B=>A
>   void functionName (Handletype, returntype)
>
> A<=>B
>   [async] returntype functionName (arg1, arg2, [out] arg3) => A=>B
>   Handletype functionName (arg1, arg2)
> B=>A
>   void functionName (Handletype, returntype, arg3)
>
>
> A<=>B
>   [async] returntype functionName (arg1, arg2, [inout] arg3) => A=>B
>   Handletype functionName (arg1, arg2, arg3in) B=>A
>   void functionName (Handletype, returntype, arg3out)
>
>
>
> -----Original Message-----
> From: James E. King III [mailto:jk...@apache.org]
> Sent: 15 May 2019 19:02
> To: jle...@lightblue.com
> Cc: James E. King III; dev@thrift.apache.org
> Subject: Re: THRIFT-66 - Bidirectional communication
>
> Re: Visio - There are no "endpoint" implementations that allow for 
> bi-directional communication over a single transport connection today.
> Is that the Visio you were referring to?  The only implementation of that 
> concept is buried in the THRIFT-66 attachments, and only for C#, and it was 
> done on a codebase about 8 years past...
>
> With today's thrift code if you want either end to be a client (make
> requests) or a server (reply to requests) you would need to separately 
> instantiate a client or server on each end and have them connect to 
> each-other, i.e.
>
> A ---> B (A sends requests to a thrift server on B, B replies, on a 
> transport) A <--- B (B sends requests to a thrift server on A, A replies, on 
> a transport separate from the last one)
>
> It sounds like what you'd like to get to is:
>
> A <--> B (A and B can function as a client or as a server over the same 
> transport)
>
> Thrift cannot do the latter today, so I would recommend the former, using one 
> transport for each direction.
>
> Given they will both be on the same system, if your languages support it, 
> unix domain sockets are quite fast.
> Otherwise if you want a shared memory solution you need to write your own 
> transport for that.
>
> - Jim
>
> On Wed, May 15, 2019 at 1:12 PM John Dougrez-Lewis <jle...@lightblue.com> 
> wrote:
> >
> > Hi Jim,
> >
> > The "oneway" route looks a bit fragile in the face of failures in the 
> > subsequent server-side processing which then cannot be signalled back to 
> > the client.
> >
> > The 2-way connection would be the way forward for me, particularly since it 
> > would work with across multiple languages.
> >
> > My primary use case would be a simple language bridge mechanism for a 
> > library to allow processes coded in one language to call, with potentially 
> > asynchronously returns, and pub/sub, to another process hosting a library 
> > coded in another language running (in the first instance) on the same box, 
> > communicating via IPC, preferably fast shared memory, but failing that 
> > sockets would do.
> >
> > You put a Visio diagram up back in 2010. Is the underlying source code for 
> > that available now ?
> >
> > Rather than hand-rolling the 2-way connection setup/teardown and supporting 
> > code, for each and every language each time, it would be nice if Framework 
> > code for that could be generated automatically from an enhanced and 
> > extended version of the IDL.
> >
> > Regards,
> >
> > John
> >
> > -----Original Message-----
> > From: James E. King III [mailto:jk...@apache.org]
> > Sent: 15 May 2019 12:05
> > To: dev@thrift.apache.org; jle...@lightblue.com
> > Subject: Re: THRIFT-66 - Bidirectional communication
> >
> > Hello!
> >
> > Thrift is still a dedicated client/server model environment where clients 
> > can request and servers reply.  The easiest way to make it 2-way today is 
> > to open a connection both ways.  If you don't have firewalls in the way 
> > then you can do this effectively.  The more difficult and more correct way 
> > to do it would be to rewrite the transport layer to use endpoints in which 
> > each side can be a client and/or server for any number of services (using 
> > TMultiplexedProtocol on top of another protocol, like TBinaryProtocol).  
> > This design allows one end to be a "listener", one end to be an "initiator" 
> > (starts the connection), and after they connect they are equal peers with 
> > the ability to request or reply of each-other.
> >
> > You can approximate asynchronous behavior by exclusively using "oneway" 
> > requests in your design.  I'd suggest avoiding use of oneway requests with 
> > THttpProtocol varieties however as today there are some issues, since Http 
> > transport requires a response to be sent, and "oneway" dictates there is no 
> > reply, and most languages do not handle it well right now (there are open 
> > backlog issues for this).
> >
> > For a matrix of supported languages, protocols, transports, and server 
> > types, see the file LANGUAGES.md at the root of the github repository.
> >
> > Another idea I was toying with a while ago was to add a message bus 
> > transport to Thrift which would allow for things like reliable delivery and 
> > broadcast semantics but that also does not exist today.
> >
> > - Jim
> >
> > On Wed, May 15, 2019 at 1:05 AM John Dougrez-Lewis <jle...@lightblue.com> 
> > wrote:
> > >
> > > Hi,
> > >
> > >
> > >
> > > I was looking for a mechanism to be able to provide
> > > language-agnostic API support to a hobby project I've been working on for 
> > > some time.
> > >
> > >
> > >
> > > By following a trail of papers, books and references, I eventually
> > > came across Apache Thrift and have found and started going through
> > > Randy Abernethy's new book.
> > >
> > >
> > >
> > >
> > >
> > > Essentially what I was looking for was support for asynchronous
> > > calls, and by extension, pub/sub and two way communication across
> > > and between multiple languages over some channel, preferably IPC but in 
> > > the worst case sockets.
> > >
> > >
> > >
> > >
> > >
> > > Having read the book, I can see that there is support for basic
> > > synchronous RPC between a client and a server over a significant
> > > number of languages and for just a very few languages, such as java,
> > > some element of support for asynchronous callbacks, and otherwise
> > > one-way methods that do not provide indication of subsequent failure.
> > >
> > >
> > >
> > > It appeared to me one way of extending bi-directional asynchronous
> > > support would be to have the client to set itself up as a server for
> > > the server at the other end to connect to, and then it would just be
> > > a question of choreographing the setting up of a pair of RPC channels.
> > >
> > >
> > >
> > > An asynchronous call could be implemented by providing a synchronous
> > > method that simply immediately returns a handle to the caller, and
> > > the server would then continue to process the call request on a
> > > background threadpool thread on the server, and the async result
> > > would then be signalled by a call from the server back to the client
> > > on the 2nd channel with the handle providing a context to lookup the 
> > > result.
> > >
> > >
> > >
> > > Pub/sub would just then be multiple calls from the server back to
> > > the client.
> > >
> > >
> > >
> > > The whole thing could sit on top of the existing unidirectional RPC
> > > implementation and provide full asynchronous calls & pub/sub across
> > > *ALL* supported languages at probably very little additional effort,
> > > with no changes to the existing code.
> > >
> > >
> > >
> > > You could then have a framework that extended the existing IDL to
> > > include decoration with attributes for async & pub/sub methods & in/out 
> > > parameters.
> > >
> > >
> > >
> > > This extended IDL could then be pre-processed to generate
> > > client-server and server-client service definitions in the existing
> > > base IDL language, together with generating supporting glue code to
> > > compile to provide the support for hooking up the channels between each 
> > > side.
> > >
> > >
> > >
> > > I note that THRIFT-66 was raised 10 years ago, but it looks like the
> > > C# code was never made available for release by Dell.
> > >
> > >
> > >
> > > I have some questions:
> > >
> > >
> > >
> > > 1)      What is the current state of plans for this supporting this sort 
> > > of
> > > functionality? What issues have been encountered ?
> > >
> > >
> > >
> > > 2)      Is there a document/spreadsheet somewhere showing a matrix of what
> > > Transports and Protocols are supported for each language?
> > >
> > >
> > >
> > >
> > >
> > > Regards,
> > >
> > >
> > >
> > > John
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> >
>

Reply via email to