Актер использует поток в диспетчере только при обработке сообщения. Поскольку количество сообщений, создаваемых актором для управления запросом, равно одному, очень маловероятно, что шаблон запроса сам по себе вызовет голодание потока. Если вы уже очень близки к истощению потоков, запрос может быть соломинкой, которая сломает спину верблюда.
Смешивание Future
s и актеров может разрушить иллюзию однопоточного потока, если и только если код выполнение в Future
обращается к состоянию актора (что означает, в основном, var
s или изменяемые объекты, определенные вне обработчика receive
).
запрос-ответ и хотя бы один раз (между ними, они покрывают, по крайней мере, большую часть мотивации модели запроса), в целом, ограничивают пропускную способность по сравнению с жестами, действующими не более одного раза. Реализация запрос-ответ или хотя бы один раз без шаблона запроса может в некоторых ситуациях (например, использование replyTo
ActorRef
для конечного получателя) быть меньше накладных расходов, чем запросы конвейера, но, вероятно, не значительно. Запросы в качестве основной точки входа в систему-актор (например, в потоках, обрабатывающих HTTP-запросы или обрабатывающих сообщения из некоторой шины сообщений), как правило, в порядке, но запросы от одного актора к другому - хорошая возможность для оптимизации.
Обратите внимание, что, особенно если ваш актер импортирует context.dispatcher
как неявный ExecutionContext
, преобразования на Future
s в основном идентичны одноразовым актерам.
Ситуации, в которых вы хотите, чтобы произошло несколько вещей (особенно когда вам нужно управлять частичным отказом (Future.sequence.recover
- возможный признак этой ситуации, особенно если recover
становится нетривиальным)) являются потенциальными кандидатами на роль актера саги для организации одного конкретного запроса / ответа.