实现熔断器并验证状态迁移
目标
亲自实现电路断路器,用眼睛确认CLOSED、OPEN、HALF_OPEN之间的转换,通过思考案例感受为什么判断什么是失败最重要。
为什么重要
电路断路器不是修复故障的装置。当故障确定时,它是快速失败以防止呼叫者的连接池枯竭的装置。所以不是性能指标,而是隔离指标。在实际工作中,电路造成的故障主要有两种。第一,将4xx计入失败,甚至阻止正常流量——当库存服务开始给特定商品分配400时,电路会打开,甚至阻止正常商品查询的案例。第二,只允许1次HALF_OPEN测试呼叫,来往于OPEN和HALF_OPEN之间闪烁。这个练习将这两个陷阱分别分配一个步骤,亲自制作并亲自阻止。
阶段
/opt/app/flaky.py将 127.0.0.1:8110 启动。GET /count到目前为止收到的请求数量用JSON给出。/root/cb/breaker.py制作/fast调用3次。/root/cb/state.json在{"state":"CLOSED", ...}使用。/always500呼叫5次,超过失败率临界值。设置为Windows 10,最小呼叫5次,失败率50%。state.json的state去OPEN变成这个。- 在OPEN状态下再呼叫10次。
/root/cb/fastfail.txt在before=<n> after=<n> blocked=10 max_ms=<밀리초>写。before和after必须相同,max_ms必须小于50。 waitDurationInOpenState将设置为3秒,等待3秒以上后呼叫一次。state.json的state去HALF_OPEN变成这个。- 在HALF_OPEN中
/fast成功3次CLOSED回到。permitted_in_half_open价格必须记录为3以上。 - 用新的刹车
/bad呼叫(400)10次。/root/cb/ignore4xx.json的state仍然是CLOSED并且failures必须是0。 - 一次性播放整个剧本
/root/cb/transitions.log在CLOSED->OPEN,OPEN->HALF_OPEN,HALF_OPEN->CLOSED按照这个顺序留下三行。
参考
- 出发点设置:Windows 10,最低呼叫5次,失败率50%,慢呼叫3秒,OPEN等待30秒(练习3秒),HALF_OPEN考试3次
- 各服务限值:结算30–40%,通知60–70%
- 常见的错误1:
minimumNumberOfCalls填写之前判断后,如果1次呼叫失败,电路就会打开。 - 常见的错误2:把保鲜膜
return None放置为——只是电路将故障转换为其他异常而已。
准备下游和呼叫柜台
/opt/app/flaky.py将 127.0.0.1:8110 启动。GET /count到目前为止收到的请求数量用JSON给出。
/opt/app/flaky.py 会告诉你收到的请求数量为 /count。这个值在后续步骤中成为证据。
在CLOSED状态下通过
/root/cb/breaker.py制作/fast调用3次。/root/cb/state.json在{"state":"CLOSED", ...}使用。
必须将状态留存在文件中才能评分。请将状态名称、失败次数、窗口大小用JSON格式写出来。
用失败率临界值创建OPEN
/always500呼叫5次,超过失败率临界值。设置为Windows 10,最小呼叫5次,失败率50%。state.json的state去OPEN变成这个。
在填满最低呼叫次数之前不进行判断。请照样实现Windows 10、最低5、临界50%。
证明在OPEN中没有进入下游
在OPEN状态下再呼叫10次。/root/cb/fastfail.txt在before=<n> after=<n> blocked=10 max_ms=<밀리초>写。before和after必须相同,max_ms必须小于50。
在阻止前后,下游的呼叫计数器必须保持不变。而且响应必须非常快。
等待时间后转为HALF_OPEN
waitDurationInOpenState将设置为3秒,等待3秒以上后呼叫一次。state.json的state去HALF_OPEN变成这个。
记录OPEN进入时间,比较进度。只有自动转移才能不让人干预。
通过考试呼叫成功返回CLOSED
在HALF_OPEN中/fast成功3次CLOSED回到。permitted_in_half_open价格必须记录为3以上。
如果将测试呼叫次数设置为1,就会出现闪烁。请思考为什么必须大于3,然后实现。
不要把4xx定为失败
用新的刹车/bad呼叫(400)10次。/root/cb/ignore4xx.json的state仍然是CLOSED并且failures必须是0。
400是客户端错误,所以不是电路需要介入的事情。请将什么视为失败管理成列表。
综合验证通过经历
一次性播放整个剧本/root/cb/transitions.log在CLOSED->OPEN,OPEN->HALF_OPEN,HALF_OPEN->CLOSED按照这个顺序留下三行。
请将前面的步骤连成一个剧本,将四个状态转换按顺序记录下来。