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

问题描述

我结合 ZIO 重试并在长轮询过程中重复: logic.repeat(repeatSchedule).retry(retrySchedule) 其中逻辑是一个可能失败的 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