You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by "J. D." <j1...@yahoo.com> on 2009/06/04 08:44:11 UTC

Back-to-back HTTP User Agent

I need a system with a back-to-back HTTP user agent:

System Reqs:
-----------
1) HTTP Server  accepts HTTP requests from user.
2) An unrelated (w.r.t. HTTP protocol i.e. no proxy semantics) HTTP Client 
issues a request and elicit response from backend server(s) for request in (1).
3) Based on HTTP Client response and result of processing this response, 
a response must be sent back to the user's original HTTP Server Request.

  User <-> NIO Server+NIO Client <-> BackEnd

The HTTP response from backend servers will have response entity data - 
none of the other legs carry significant data.

High Level Design Items:
-----------------------
Based on my current research into HTTPComponent NIO, it seems like I need
following:
1) An NIO Server:
  a) DefaultListeningIOReactor
  b) DefaultServerIOEventDispatch
  c) AsyncNHttpServiceHandler
  d) A custom MyServerHandler - a NHttpRequestHandler implementation 
     is registered in NHttpRequestHandlerResolver. 
     
     i) This will kick off connect to NIO Client using the NIO Client Reactor. 
     ii) NHttpRequestHandler#handle implementation retains HttpResponse and 
       NHttpResponseTrigger into an application construct for future 
       NHttpResponseTrigger#submitResponse when NIO Client receives response.
       HTTPContext of NIO Client retains an id to this application construct 
  e) Default timeout and exception processing.

2) An NIO Client:
  a) DefaultConnectingIOReactor
  b) DefaultClientIOEventDispatch
  c) AsyncNHttpClientHandler
  d) A custom MyClientHandler - a HttpRequestExecutionHandler  implementation
     is registered to AsyncNHttpClientHandler.

     i) handleResponse implementation processes the response and computes the
       response to be sent for NIO Server Response. It retrieves the NIO server
       saved NHttpResponseTrigger and HttpResponse and issues a submitResponse
       for NIO Server Response to the user.
     ii) Failure or timeout for HTTP Client triggers a failure
       response/exception on NIO Server.

Questions:
----------
1) Is this design idea feasible using current HTTP Component NIO implementation?
2) Is it safe to retain NHttpResponseTrigger and HttpResponse for future use.
Note that HttpResponse will be guarded for thread safety. 
3) Are there any constructs in the current HTTP NIO implementation that would
facilitate the synchronization across multiple sessions like the one between NIO
Server Session and NIO Client Session.

- J.D.



      

Re: Back-to-back HTTP User Agent

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Wed, Jun 03, 2009 at 11:44:11PM -0700, J. D. wrote:
> I need a system with a back-to-back HTTP user agent:
> 
> System Reqs:
> -----------
> 1) HTTP Server  accepts HTTP requests from user.
> 2) An unrelated (w.r.t. HTTP protocol i.e. no proxy semantics) HTTP Client 
> issues a request and elicit response from backend server(s) for request in (1).
> 3) Based on HTTP Client response and result of processing this response, 
> a response must be sent back to the user's original HTTP Server Request.
> 
>   User <-> NIO Server+NIO Client <-> BackEnd
> 
> The HTTP response from backend servers will have response entity data - 
> none of the other legs carry significant data.
> 
> High Level Design Items:
> -----------------------
> Based on my current research into HTTPComponent NIO, it seems like I need
> following:
> 1) An NIO Server:
>   a) DefaultListeningIOReactor
>   b) DefaultServerIOEventDispatch
>   c) AsyncNHttpServiceHandler
>   d) A custom MyServerHandler - a NHttpRequestHandler implementation 
>      is registered in NHttpRequestHandlerResolver. 
>      
>      i) This will kick off connect to NIO Client using the NIO Client Reactor. 
>      ii) NHttpRequestHandler#handle implementation retains HttpResponse and 
>        NHttpResponseTrigger into an application construct for future 
>        NHttpResponseTrigger#submitResponse when NIO Client receives response.
>        HTTPContext of NIO Client retains an id to this application construct 
>   e) Default timeout and exception processing.
> 
> 2) An NIO Client:
>   a) DefaultConnectingIOReactor
>   b) DefaultClientIOEventDispatch
>   c) AsyncNHttpClientHandler
>   d) A custom MyClientHandler - a HttpRequestExecutionHandler  implementation
>      is registered to AsyncNHttpClientHandler.
> 
>      i) handleResponse implementation processes the response and computes the
>        response to be sent for NIO Server Response. It retrieves the NIO server
>        saved NHttpResponseTrigger and HttpResponse and issues a submitResponse
>        for NIO Server Response to the user.
>      ii) Failure or timeout for HTTP Client triggers a failure
>        response/exception on NIO Server.
> 
> Questions:
> ----------
> 1) Is this design idea feasible using current HTTP Component NIO implementation?

I think it is a fairly common setup for an HTTP proxy or an HTTP gateway.
Apache Synapse employs a very similar architecture.


> 2) Is it safe to retain NHttpResponseTrigger and HttpResponse for future use.

Yes, it is.

> Note that HttpResponse will be guarded for thread safety. 
> 3) Are there any constructs in the current HTTP NIO implementation that would
> facilitate the synchronization across multiple sessions like the one between NIO
> Server Session and NIO Client Session.
>

Not really much. There are SharedInputBuffer / SharedOutputBuffer classes that
one can use to share content between an I/O dispatch thread of an I/O reactor
and a worker thread. These classes can be used as an adaptor between NIO and
classic (blocking) I/O models.

Hope this helps

Oleg


 
> - J.D.
> 
> 
> 
>       

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@hc.apache.org
For additional commands, e-mail: dev-help@hc.apache.org