2017-01-31 11 views
0

Скажем, у меня есть серия сообщений, содержащих идентификатор, идентифицирующий клиента. Сообщения для разных клиентов могут обрабатываться параллельно. Сообщения для одного и того же клиента могут обрабатываться только по одному.Сообщения маршрутизации Akka с одним запущенным экземпляром на id

С помощью Akka я хотел бы иметь возможность направлять сообщения в пул актеров, но встретить это не более одного одновременного актера на ограничение идентификатора клиента.

Что было бы лучшим способом приблизиться к этому? Не понимаю ли я какие-либо понятия, стоящие за Аккой, или пытаюсь применить традиционные концепции, не соответствующие модели актера?

ответ

0

Я считаю, что это вполне подходит для модели актера. По определению - один актер последовательно обрабатывает свои входящие сообщения, одним простым способом это может быть создание одного участника на одного клиента.

Простой пример, когда вы используете одного участника в качестве маршрутизатора и одного рабочего на существующего клиента.

class Boss extends Actor { 

    override def receive: Receive = jobHandler(Map.empty[ClientId, ActorRef]) 

    def jobHandler(workers: Map[ClientId, ActorRef]): Receive = { 

     case [email protected](id, ...) if workers contains id => 
     workers(id) ! j 

     case [email protected](id, ...) => 
     val worker = context.actorOf(Props[Worker]) 
     worker ! j 
     context.become(jobHandler(workers + (id -> worker))) 
    } 
    } 

    class Worker extends Actor { 
    override def receive: Receive = { 
     case Job(...) => doStuff(...) 
    } 
    } 

Имейте в виду актеров очень легкий, так это имеет место, даже если вам нужно следить за многими из них.

+0

Или, если вы хотите создать кластерную систему, посмотрите на Cluster Sharding http://doc.akka.io/docs/akka/current/scala/cluster-sharding.html#cluster-sharding-scala – johanandren

 Смежные вопросы

  • Нет связанных вопросов^_^