在ZIO循环中组合重试和重复时重置指数调度



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

由于retrySchedule可以是指数后退,它可以在出现错误时无限增长,然而,我想在逻辑成功后将其重置为初始值(将无限重复(

我正在关注ZIO Scheduling文档中关于CCD_ 3组成的部分,但我错过了一个";递归的";组合,其中类似以下内容是可能的:

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

相关内容

  • 没有找到相关文章

最新更新