Каков хороший способ заставить актера попробовать что-то снова при неудаче, но с растущими интервалами времени между попытками? Скажем, я хочу, чтобы актер попытался снова через 15 секунд, затем 30 секунд, затем каждую минуту в течение ограниченного количества раз.
Вот что я придумал:
- метод актера, который выполняет фактическую работу, имеет необязательный
RetryInfo
, который, если присутствует, содержит номер повторимся, мы в настоящее время находимся в - при сбое, актер отправит себе новый
ScheduleRetryMessage
сretryCount + 1
, а затем выбросит исключение RuntimeException - другой актер контролирует действующего актера, используя
new OneForOneStrategy(-1, Duration.Inf()
, возвращаяResume
в качестве своей Директивы. Актер не имеет состояния, поэтомуResume
должно быть ОК - при приеме
ScheduleRetryMessage
, актер будет- if
retryCount < MAX_RETRIES
: используйте планировщик Akka, чтобы запланировать отправкуRetryMessage
после желаемой задержки - else: наконец-то сдаться, отправить сообщение другому игроку для сообщения об ошибках
- if
Это хорошее решение или есть лучший подход?