The JActor project implements actors in Java that can process 1 Billion messages per second.
Project pages can be found here:
http://sourceforge.net/p/jactor/home/Home/ and
https://github.com/laforge49/JActor
API: http://jactor.sourceforge.net/
Be sure to follow the project blog: https://sourceforge.net/p/jactor/blog/
This project is a reimplementation of a portion of the AsyncFP Scala project:
https://github.com/laforge49/Asynchronous-Functional-Programming/wiki
Message passing between actors uses 2-way messages (request / response). There are several
reasons for this:
o With 2-way messaging, sending a request is very similar to a method call with a callback.
Most requests are processed synchronously, which is why JActor is so much faster than other
actor implementations.
o Mailboxes are used mostly when passing messages between threads and are first-class objects.
As first-class objects, mailboxes can be used by more than one actor. Passing messages between
actors with a common mailbox is always done synchronously and is very fast.
o Flow control is implicit to 2-way messaging. Systems with good flow control are generally
well-behaved when operating with a full load.
o Two-way messaging is so much faster than 1-way messaging that it is practical to use 2-way
messages when 1-way messages are needed.
Exception Handling
The extensive use of callbacks complicates control flow, which is only made worse with some
callbacks being executed asynchronously. Exception trapping then can be quite error prone. So
exception handling is supported. A default exception handler is also provided which passes any
uncaught exceptions that occurred while processing a request back to the actor which sent the
request, recursively.
Bi-Modal Iterator
Loops with 2-way messages can be problematic, as iterations typically must wait for the response
from the previous iteration. A bi-modal iterator is provided to cover this. Each iteration takes
5 nanoseconds for synchronous responses and 8 nanoseconds when a response is asynchronous.
State Machine
State machines are often used with actors and can add considerable clarity to the code. JActor
includes classes for composing and executing state machines that are compatible with 2-way
messages.
Message Passing Benchmarks
When actors share the same mailbox, 1,095,890,410 messages are passed per second. Otherwise the
rate drops to 71,095,312 per second.
Asynchronous message passing is also supported, making it easy to use all the available hardware
threads for good vertical scalability. Messages sent to an actor with an asynchronous mailbox are
passed asynchronously at a rate of 42,149,631 per second.
Tests were done on an Intel Core i5 CPU M 540 @ 2.53GHz, which has 4 hardware threads. The times
reported were best run in 5. Only standard switch settings were used--there was NO compiler
optimization.