Akka Framework предназначен для решения подобных проблем и является именно тем, что вы ищете.
Посмотрите это document - есть много настраиваемых диспетчера (на основе событий, на основе потоков, с балансировкой нагрузки, кражей работ и т. Д.), Которые управляют почтовыми ящиками участников и позволяют им работать в конъюнкции. Вы также можете найти интересную эту запись в блоге .
Например. этот код создает экземпляр Work Stealing Dispatcher на основе фиксированного пула потоков, который выполняет балансировку нагрузки между субъектами, которых он контролирует:
val workStealingDispatcher = Dispatchers.newExecutorBasedEventDrivenWorkStealingDispatcher("pooled-dispatcher")
workStealingDispatcher
.withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity
.setCorePoolSize(16)
.buildThreadPool
Актер, использующий диспетчера:
class MyActor extends Actor {
messageDispatcher = workStealingDispatcher
def receive = {
case _ =>
}
}
Теперь, если вы запустите 2+ экземпляра субъекта, диспетчер уравновесит нагрузку между почтовыми ящиками (очередями) субъектов (субъект, у которого слишком много сообщений в почтовом ящике, "пожертвует" часть субъектам, у которых ничего нет делать).