Как работает модель актера (в Akka), когда вам нужно выполнять операции ввода-вывода (т.е. операцию базы данных)?
Я понимаю, что операция блокировки вызовет исключение (и по существу разрушит все concurrency из-за обусловленной природой Netty, которую использует Akka). Следовательно, мне пришлось бы использовать Future
или что-то подобное - однако я не понимаю модель concurrency.
- Может ли 1 актер обрабатывать несколько сообщений одновременно?
- Если актер делает блокирующий вызов в
Future
(т.е.future.get()
), это блокирует только текущее исполнение актера; или он предотвратит выполнение для всех участников до завершения блокирующего вызова? - Если он блокирует все выполнение, как использовать будущую помощь concurrency (т.е. не будет вызывать блокировку вызовов в будущем, все еще это означает создание актера и выполнение блокирующего вызова)?
- Каков наилучший способ работы с многоэтапным процессом (т.е. чтение из базы данных, вызов блокирующего веб-сервиса, чтение из базы данных, запись в базу данных), где каждый шаг зависит от последнего?
Основной контекст таков:
- Я использую сервер Websocket, который будет поддерживать тысячи сеансов.
- Каждый сеанс имеет некоторое состояние (например, данные аутентификации и т.д.);
- Клиент Javascript отправит на сервер сообщение JSON-RPC, которое передаст его соответствующему игроку сеанса, который выполнит его и вернет результат.
- Выполнение вызова RPC будет включать некоторые операции ввода-вывода и блокировки вызовов.
- Будет много одновременных запросов (каждый пользователь будет делать значительное количество запросов по соединению WebSocket, и будет много пользователей).
Есть ли лучший способ достичь этого?