[infinispan-dev] Threadpools in a large cluster
Bela Ban
bban at redhat.com
Thu Feb 7 05:43:43 EST 2013
On 2/7/13 11:09 AM, Dan Berindei wrote:
>
>
> A few changes I have in mind (need to think about it more):
>
> - I want to leave the existing RequestHandler interface in place, so
> current implementation continue to work
> - There will be a new AsyncRequestHandler interface (possibly
> extending
> RequestHandler, so an implementation can decide to implement
> both). The
> RequestCorrelator needs to have either request_handler or
> async_request_handler set. If the former is set, the logic is
> unchanged.
> If the latter is set I'll invoke the async dispatching code
>
> - AsyncRequestHandler will look similar to the following:
> void handle(Message request, Handback hb, boolean requires_response)
> throws Throwable;
> - Handback is an interface, and its impl contains header information
> (e.g. request ID)
> - Handback has a sendReply(Object reply, boolean is_exception) method
> which sends a response (or exception) back to the caller
>
>
> +1 for a new interface. TBH I hadn't read the RequestCorrelator code,
> so I had assumed it was already asynchronous, and only RpcDispatcher
> was synchronous.
Nope, unfortunately not.
>
> I'm not so sure about the Handback name, how about calling it Response
> instead?
It *is* actually called Response (can you read my mind?) :-)
>
> - When requires_response is false, the AsyncRequestHandler doesn't
> need to invoke sendReply()
>
>
> I think this should be the other way around: when requires_response is
> true, the AsyncRequestHandler *can* invoke sendReply(), but is not
> required to (the call will just time out on the caller node); when
> requires_response is false, invoking sendReply() should throw an
> exception.
The way I actually implemented it this morning is to omit the boolean
parameter altogether:
void handle(Message request, Response response) throws Exception;
Response is null for async requests.
>
>
> - Message batching
> - The above interfaces need to take message batching into account,
> e.g.
> the ability to handle multiple requests concurrently (if they
> don't need
> to be executed sequentially)
>
>
> You mean handle() is still going to be called once for each request,
> but second handle() call won't necessarily wait for the first
> message's sendReply() call?
Yes. I was thinking of adding a second method to the interface, which
has a message batch as parameter. However, we'd also have to pass in an
array of Response objects and it looked a bit clumsy.
>
> Is this going to apply only to OOB messages, or to regular messages as
> well? I think I'd prefer it if it only applied to OOB messages,
> otherwise we'd have to implement our own ordering for regular/async
> commands.
No, I think it'll apply to all messages. A simple implementation could
dispatch OOB messages to the thread pool, as they don't need to be
ordered. Regular messages could be added to a queue where they are
processed sequentially by a *single* thread. Pedro does implement
ordering based on transactions (see his prev email), and I think there
are some other good use cases for regular messages. I think one thing
that could be done for regular messages is to implement something like
SCOPE (remember ?) for async RPCs: updates to different web sessions
could be processed concurrently, only updates to the *same* session
would have to be ordered.
This API is not in stone, we can always change it. Once I'm done with
this and have batching II implemented, plus some other JIRAs, I'll ping
you guys and we should have a meeting discussing
- Async invocation API
- Message batching (also in conjunction with the above)
- Message bundling and OOB / DONT_BUNDLE; bundling of OOB messages
--
Bela Ban, JGroups lead (http://www.jgroups.org)
More information about the infinispan-dev
mailing list