在 ZIO 循环中组合重试和重复时重置指数计划

Reset exponential Schedule when combining retry and repeat in a ZIO loop

我在长轮询过程中结合了 ZIO 重试和重复: logic.repeat(repeatSchedule).retry(retrySchedule) 其中 logic 是一个可能会失败的 ZIO。

由于retrySchedule可以指数退避,它可以根据错误无限增长,但是,我想在逻辑成功时将其重置为初始值(将无限重复)

我正在关注 ZIO Scheduling doc 中关于 Schedule 组合的部分,但我错过了一个“递归”组合,其中可能有如下内容:

Schedule.exponential(baseDelay)
.whileOutput(_ < UpdaterManagerSettings.maxDelay)
.andThen([SOMETHING TO POINT RECURSIVELY AT THE SAME])

我认为这样的事情可能对你有用:

val logic = ZIO(???)

// First, create an effect that uses exponential backoff to retry logic.
// This effect will complete as soon as logic succeeds,
// or maximum number of retries is exceeded.
val retrySchedule = Schedule.exponential(baseDelay) && Schedule.recurs(maxRetries)
val retriedLogic = logic.retry(retrySchedule)

// Then, repeat the whole retriedLogic infinitely.
val repeatSchedule = Schedule.spaced(1.second)
val wholeProcedure = retriedLogic.repeat(repeatSchedule)

只要逻辑失败,就会使用指数退避重试。但是一旦成功,它就会以固定的时间间隔重复。如果再次失败,指数退避从 baseDelay.

再次开始

在此处查看 运行 示例:https://scastie.scala-lang.org/yZpBO34NRgK6BgYYIzk5Iw