Le 5/31/12 8:55 PM, Julien Vermillard a écrit :
Hi,
In mina 2 the event loops are composed of Acceptor/Connector (for
accepting/connecting TCP sessions) and IoProcessor for handling
session read and write events. For each service you need at least one
Acceptor/connector and one IoProcessor, so at least two threads. For a
simple TCP base asynchronous proxy it sould be doable with one thread.
Yep. Same for UDP.

The IoProcessor for TCP and for UDP are totally differents, the TCP
one select TCP client sockets the UDP one handle read write event
passed by the Acceptor because you have only one socket in a UDP
server.

Ayway this logic make the code uber complicated, what I propose :

Two technical event loop construction :
A SelectorProcessor, his work is to select SelectableChannel for IO
event (read, write, accept) and push events to listeners (e.g.
TcpServer for accept events, UdpServer for read events on new
sessions)
A EventProcessor, his work is to process read/write events coming from
SelectorProcessor using session chains with one thread event.

I like the idea to have an EventProcessor instead of the IoProcessors. The semantic is way better.

So we can wired SelectorProcessor and EventProcessor like we want,
from just one SelectorProcessor for a one thread logic for quick
server, to multiple SelectorProcessor pushing event to multiple
EventProcessors.

I think it'll make the code really simpler, testable with mock and
more modulable.
Yes, absolutely.

Now, there is still one tricky thing we have to deal with : at some point, we may want to separate the SelectorProcessor to process some specific OP events, instead of having one single SelectorProcessor to manage all the events. In MINA 2, we had one thread dealing with OP_ACCEPT only, and N IoProcessors dealing with the other OP events. We would like to be able to keep this logic, but in a simpler way : at some point, it doesn't matter how many SelectorProcessors we will use, but one of them will handle the OP_ACCEPT events, and may spread the SelectableChannels on the other SelectorProcessors.

We may need to conduct some performance tests here, to know how costly it is to process hundred of thousands of SelectableChannel on one single selector vs spreading those SelectableChannel across many selectors.

One of the reasons it might be necessary to have more than one selector on TCP is the JDK select spinning bug : in some cases, the select() method just become crazy, eating 100% CPU, and the only way to get out is to delete the selector, create a new one, and register all the SelectableChannel on the newly created selector... An expensive operation !


--
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com

Reply via email to