Я прочитал некоторые сообщения о том, как и почему akka не гарантирует доставку сообщений. документация, этот обсуждение, а другие обсуждения по группе делают объясните это хорошо.
Я новичок в akka и хочу знать подходящий дизайн для случая. Например, у меня есть 3 разных актера на разных машинах. Один отвечает за поваренные книги, а другой за историю и за последние годы за технологические книги.
У меня есть главный актер на другой машине. Предположим, есть запрос к основному актеру для поиска, если у нас есть доступная книга. Главный актер отправляет запросы трем отдаленным актерам и ожидает результата. Поэтому я делаю это:
val scatter = system.actorOf(
Props[SearchActor].withRouter(ScatterGatherFirstCompletedRouter(
routees=someRoutees, within = 10 seconds)), "router")
implicit val timeout = Timeout(10 seconds)
val futureResult = scatter ? Text("Concurrency in Practice")
// What should I do here?.
//val result = Await.result(futureResult, timeout.duration) line(a)
Короче говоря, я отправил запросы всем 3 удаленным игрокам и ожидаю результата за 10 секунд.
Каким должен быть действие?
- Скажем, я не получаю результат за 10 секунд, должен ли я отправить новый запрос всем им снова?
- Что делать, если время
within
преждевременно. Но я не знаю заранее, сколько времени может потребоваться. - Что делать, если время
within
было достаточно, но сообщение было сброшено.
Если я не получаю ответ в within
и снова отправлю запрос. Что-то вроде этого, оно остается асинхронным:
futureResult onComplete{
case Success(i) => println("Result "+i)
case Failure(e) => //send again
}
Но при слишком многих запросах не будет слишком много потоков на вызове и громоздких? Если я раскомментирую line(a)
, он станет синхронным, и под нагрузкой может произойти плохо.
Скажем, я не получаю ответ за 10 секунд. Если время within
было преждевременным, то снова происходит тяжелое бесполезное вычисление. Если messsage упал, тогда 10
секунды полезного времени потрачены впустую. В случае, скажем, я знал, что сообщение доставлено, я, вероятно, буду ждать более продолжительной продолжительности, не скептически.
Как люди решают такие проблемы? ACK
? Но тогда я должен сохранить состояние в акторе всех запросов. Это должно быть обычным делом, и я ищу правильный дизайн.