[undertow-dev] Mostly IO, non-blocking workload best practice

Stuart Douglas sdouglas at redhat.com
Wed Apr 29 00:16:10 EDT 2015


The non blocking API for reading data is actually something we are looking at improving in the next version of Undertow. 

For now you need to use the XNIO request channel. For an example of how to use this look at io.undertow.util.StringReadChannelListener (you can actually just subclass this class). 

Basically the most efficient way to use the API is:

- Get a pooled buffer from the connections buffer pool
- keep calling StreamSinkChannel.read() to read the data
- If read returns 0 register a read listener and then call resumeReads() and return. Your listener will be notified when more data is available. 
- When read returns -1 you are done

Stuart

----- Original Message -----
> From: "Chris Back" <chris.back at gmail.com>
> To: undertow-dev at lists.jboss.org
> Sent: Wednesday, 29 April, 2015 12:08:09 AM
> Subject: [undertow-dev] Mostly IO, non-blocking workload best practice
> 
> I am writing a server that will need to respond to lots of small web
> requests. Most of the requests will come with a small POST payload. Based on
> the contents of the payload, the server will either a) respond immediately,
> or b) forward the request as is to one of a pool of backend servers, waiting
> for a response and forwarding the response back to the client.
> 
> It looks like given the existing undertow code, I have good examples of how
> to forward requests to the backend. What isn't as clear is how to handle the
> getting the POST data. Is there a way of doing that without blocking?
> 
> Ideally, my handler flow would be:
> 
> 1. Non-blocking request handler that makes sure all POST data is in.
> 2. A non-blocking handler that decisions based on content of POST data to
> 3a. Immediately return a response to the client (non-blocking).
> or
> 3b. Dispatch to the worker pool to forward request to backend server and
> await response.
> 
> 90% of my requests will go through path 3a, and I'd like that to be as quick
> as possible. When the server decides a request should go through 3b, only
> then should it go to the blocking worker pool.
> 
> Am I viewing this correctly? What are my options? Based on this thread
> http://lists.jboss.org/pipermail/undertow-dev/2015-January/001082.html
> it seems like an option could be to get the request channel in step 1 above?
> Its not clear to me how that would work.
> 
> Thanks,
> Chris
> 
> _______________________________________________
> undertow-dev mailing list
> undertow-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/undertow-dev


More information about the undertow-dev mailing list