当前位置: 首页 > news >正文

[java] 简单的熔断器scala语言案例

failureRateInterval时间内如果addEx(错误)达到 maxFailuresPerInterval 次数,则fused方法返回true,表示触发熔断,进入冷却期coolingInterval,冷却期内fused方法返回true,冷却期过后进入下一个错误统计周期。

scala语言完成

import scala.collection.mutable
case class Excp(ts: Long, throwable: Throwable)trait ExceptionStrategy {
}case class FailureRateExit(maxFailuresPerInterval: Int, failureRateInterval: Int, coolingInterval: Int) extends ExceptionStrategy {val LOG: Logger = org.slf4j.LoggerFactory.getLogger(this.getClass)private val exceptionQueue: mutable.Queue[Excp] = mutable.Queue.empty// exceptionQueue += Excp(0L, new RuntimeException())private var lastFuseTs: Long = 0Ldef fused(): Boolean = {val curr = System.currentTimeMillis()if ((curr - lastFuseTs) / 1000 <= coolingInterval) {LOG.info(s"fusing cooling, fist error ts:${exceptionQueue.head.ts}, last error ts:${exceptionQueue.last.ts}")exceptionQueue.clear()return true}cleanup(curr)val trigger = exceptionQueue.size >= maxFailuresPerInterval && exceptionQueue.head.ts - exceptionQueue.last.ts <= failureRateIntervalif (trigger) {lastFuseTs = currLOG.info(s"fusing triggered, fist error ts:${exceptionQueue.head.ts}, last error ts:${exceptionQueue.last.ts}, total errors:${exceptionQueue.size}")}trigger}def addEx(ex: Exception): Unit = {val curr = System.currentTimeMillis()exceptionQueue += Excp(curr, ex)cleanup(curr)}private def cleanup(curr: Long = System.currentTimeMillis()): Unit = {exceptionQueue.dequeueAll(e => (curr - e.ts) / 1000 >= failureRateInterval)exceptionQueue.dequeueAll(e => exceptionQueue.size > maxFailuresPerInterval * 2 && e != exceptionQueue.last && e != exceptionQueue.head)}
}

测试代码:

import org.scalatest.funsuite.AnyFunSuite
import scala.util.Randomclass StrategyTest extends AnyFunSuite {test("fail-rate") {val f = FailureRateExit(3, 10, 15)while (true) {f.addEx(new RuntimeException())println(f.fused())Thread.sleep(Random.nextInt(8 * 1000))}}
}

测试结果:

false
false
false
false
13:52:03.519 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:30 --- fusing triggered, fist error ts:1734414718275, last error ts:1734414723512, total errors:3
true
13:52:10.202 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414722743, last error ts:1734414730202
true
13:52:18.120 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414738120, last error ts:1734414738120
true
false
false
false
false
false
false
13:52:55.780 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:30 --- fusing triggered, fist error ts:1734414768116, last error ts:1734414775780, total errors:3
true
13:53:00.976 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414775249, last error ts:1734414780976
true
13:53:03.931 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414783931, last error ts:1734414783931
true
13:53:07.628 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414787628, last error ts:1734414787628
true
false
false
false
13:53:28.360 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:30 --- fusing triggered, fist error ts:1734414800129, last error ts:1734414808359, total errors:3
true
13:53:35.734 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414808359, last error ts:1734414815734
true
13:53:42.517 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414822514, last error ts:1734414822514
true
false
false
13:53:49.223 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:30 --- fusing triggered, fist error ts:1734414824804, last error ts:1734414829223, total errors:3
true
13:53:50.351 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414824804, last error ts:1734414830351
true
13:53:57.470 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414837470, last error ts:1734414837470
true
13:54:04.618 [ScalaTest-run-running-StrategyTest] [INFO ] FailureRateExit:22 --- fusing cooling, fist error ts:1734414844618, last error ts:1734414844618
true
false
false

使用方式伪代码:

  private val strategy: FailureRateExit = FailureRateExit(failureRateInterval, maxFailuresPerInterval, failCoolingInterval)try {if(!strategy.fused){// 执行正常逻辑}else{// 忽略}} catch {case ex: Exception =>// 添加异常到熔断器strategy.addEx(ex)}
http://www.lryc.cn/news/505658.html

相关文章:

  • 【java】序列化的种类和使用场景
  • Qt5与Qt6中的高DPI缩放属性解析
  • Mac使用总结
  • 【日期规则】EXCEl 自定义日期匹配规则,学习基础知识,自由匹配场景
  • 苹果电脑可以安装windows操作系统吗?Mac OS X/OS X/macOS傻傻分不清?macOS系统的Java支持?什么是macOS的五大API法王?
  • 芋道SpringBoot配置Maven、创建SpringBoot项目、创建Web接口、读取配置信息
  • 物理机内网穿透
  • Vue 3: 通过图片链接获取图片颜色,间接设置背景颜色
  • opencv-python的简单练习
  • 如何使用生成式AI实现跨领域内容生成
  • 【Linux】socket编程1
  • Linux文件属性 --- 七种文件类型---文件.目录、软硬链接、字符设备文件
  • Tree-of-Counterfactual Prompting for Zero-Shot Stance Detection
  • NextJs 路由管理
  • hive 小文件分析
  • 【JavaWeb后端学习笔记】WebSocket通信
  • 搭建springmvc项目
  • Springboot3.x配置类(Configuration)和单元测试
  • java后端环境配置
  • 手眼标定工具操作文档
  • WebGIS城市停水及影响范围可视化实践
  • 无管理员权限 LCU auth-token、port 获取(全网首发 go)
  • 【数字花园】数字花园(个人网站、博客)搭建经历教程
  • python模拟练习第一期
  • Xcode
  • RabbitMQ安装延迟消息插件(mq报错)
  • es 3期 第15节-词项查询与跨度查询实战运用
  • iOS Delegate模式
  • java-使用druid sqlparser将SQL DDL脚本转化为自定义的java对象
  • React状态管理常见面试题目(一)