让演员在失败时再次尝试某些事情的好方法是什么,但重试之间的时间间隔越来越长?假设我希望演员在 15 秒后重试,然后是 30 秒,然后每分钟重试几次。
这是我想出的:
- 执行实际工作的actor的方法有一个可选
RetryInfo
参数,如果存在,它包含我们当前的重试次数 - 失败时,actor 将向自己发送一个新
ScheduleRetryMessage
的 withretryCount + 1
,然后抛出一个 RuntimeException - 另一个演员监督工人演员,使用
new OneForOneStrategy(-1, Duration.Inf()
返回Resume
作为其指令。演员没有状态,所以Resume
应该没问题 - 收到后
ScheduleRetryMessage
,演员将- if
retryCount < MAX_RETRIES
:使用 Akka 的调度程序来安排RetryMessage
在所需延迟后发送 - else: 最终放弃,发送消息给另一个actor进行错误报告
- if
这是一个好的解决方案还是有更好的方法?