Как работает ввод-вывод в Akka?

Как работает модель актора (в Akka), когда вам нужно выполнить ввод-вывод (т.е. операцию с базой данных)?

Насколько я понимаю, операция блокировки вызовет исключение (и по существу разрушит весь параллелизм из-за равномерной природы Netty, которую использует Akka). Следовательно, мне придется использовать Future или что-то подобное - однако я не понимаю модель параллелизма.

  1. Может ли один субъект обрабатывать несколько сообщений одновременно?
  2. Если субъект делает блокирующий вызов в будущем (т.е. будущем. get () ) блокирует ли это выполнение только текущего актора, или предотвратит ли это выполнение для всех акторов до тех пор, пока блокирующий вызов не завершится?
  3. Если он блокирует все выполнение, как использовать будущий вспомогательный параллелизм (т.е. не будет вызывать блокирующие вызовы в будущем, все равно будет означать создание актора и выполнение блока ng call)?
  4. Как лучше всего справиться с многоэтапным процессом (т.е. читать из базы данных; вызвать блокирующий веб-сервис; читать из базы данных; запись в базу данных), где каждый шаг зависит от последнего?

Основной контекст таков:

  • Я использую сервер Websocket, который будет поддерживать тысячи сеансов.
  • Каждый сеанс имеет определенное состояние (например, сведения об аутентификации и т. Д.);
  • Клиент Javascript отправит сообщение JSON-RPC на сервер, который передаст его соответствующему субъекту сеанса, который выполнит его и вернет результат.
  • Выполнение вызова RPC будет включать в себя некоторые операции ввода-вывода и блокирующие вызовы.
  • Будет большое количество одновременных запросов (каждый пользователь будет делать значительное количество запросов через соединение WebSocket, и там будет много пользователей).

Есть ли лучший способ добиться этого?

28
задан AhmetB - Google 30 June 2011 в 06:42
поделиться