java 容错_隔离熔断容错 - ServiceComb Java Chassis 开发指南

隔离熔断容错

bizkeeper 模块集成了 Hystrix , 提供隔离、熔断和容错等服务故障保护能力。 Java

Chassis 对 Hystrix 进行了封装, 只需要进行简单的配置即可启用这些功能。

在项目中引入如下 Handler 模块,

org.apache.servicecomb

handler-bizkeeper

并且增加 Handler 配置:

servicecomb:

handler:

chain:

Consumer:

default: bizkeeper-consumer

Provider:

default: bizkeeper-provider

注意事项:

在实际微服务运维实践中,发现 Hystrix 存在如下一些问题, 开发者可以结合实际业务情况,谨慎的使用这个模块。 Java Chassis 的

负载均衡 也提供了实例隔离和错误重试能力, 加上内置的线程池隔离, 能够

实现大部分 Hystrix 核心治理能力。

调用栈很深,在某些异常情况下,可能屏蔽底层异常,导致问题原因分析困难。

超时机制、重试机制和线程池隔离机制和 Java Chassis 的一些内部机制的协作存在一些不友好的情况,需要特别注意合理的开启超时和重试。 默认情况下是禁用的。Java Chassis 只能使用信号量隔离机制。

Hystrix 的引入对性能影响很大, 会有 20% 以上的框架性能损失。

Hystrix 项目目前已经停止维护。

概念阐述

服务故障保护指服务请求异常时,微服务所采用的异常处理策略, 根据处理机制和效果把它分解为三个技术概念:“隔离”、“熔断”、“容错”:

“隔离”是一种异常检测机制,常用的检测方法是请求超时、流量过大等。一般的设置参数包括超时时间、同时并发请求个数等。

“熔断”是一种异常反应机制,“熔断”依赖于“隔离”。熔断通常基于错误率来实现。一般的设置参数包括统计请求的个数、错误率等。

“容错”是一种异常处理机制,“容错”依赖于“熔断”。熔断以后,会调用“容错”的方法。一般的设置参数包括调用容错方法的次数等。

当前 ServiceComb 提供两种容错方式,分别为返回 null 值和抛出异常。

注意 : 在不同的上下文,“隔离”、“熔断”、“容错”、“降级” 等概念可能存在不一样的含义,发现这里的定义和其他地方存在不一样的

的时候不用感到意外, 但是不用担心, 当服务出现故障的时候, 需要一定的措施进行应对, 对于措施和应对方式的理解胜于对于名词的理解。

配置说明

配置项支持对所有接口生效,或者对某个微服务的某个具体方法生效。

配置项生效范围按照类型(type):配置项能够针对Provider, Consumer进行配置

按照范围(scope):配置项能够针对 MicroService 进行配置, 也可以针对 schemaId 和 operationId 进行配置

本章节如果没有特殊说明,所有的配置项都支持按照下面的格式进行配置:

servicecomb.[namespace].[type].[scope].[property name]

type 指 Provider 或者 Consumser。 scope 指配置项生效范围, 针对特定的微服务的配置,需要增加 MicroServiceName, 针对接口配置的,需要指定接口名称,接口名

称由 schemaId 和 operationId 组成。

下面是一些配置示例:

servicecomb.isolation.Consumer.timeout.enabled

servicecomb.isolation.Consumer.DemoService.timeout.enabled

servicecomb.isolation.Consumer.DemoService.hello.sayHello.timeout.enabled

servicecomb.isolation.Provider.timeout.enabled

servicecomb.isolation.Provider.DemoService.timeout.enabled

servicecomb.isolation.Provider.DemoService.hello.sayHello.timeout.enabled

配置项列表

配置项

默认值

取值范围

是否必选

含义

注意

servicecomb.isolation.[type].[scope].timeout.enabled

FALSE

-

是否启用超时检测

servicecomb.isolation.[type].[scope].timeoutInMilliseconds

30000

-

超时时间阈值

servicecomb.isolation.[type].[scope].maxConcurrentRequests

10

-

最大并发数阈值

servicecomb.circuitBreaker.[type].[scope].enabled

TRUE

-

是否启用熔断措施

servicecomb.circuitBreaker.[type].[scope].forceOpen

FALSE

-

不管失败次数,都进行熔断

servicecomb.circuitBreaker.[type].[scope].forceClosed

FALSE

-

任何时候都不熔断

当与forceOpen同时配置时,forceOpen优先。

servicecomb.circuitBreaker.[type].[scope].sleepWindowInMilliseconds

15000

-

熔断后,多长时间恢复

恢复后,会重新计算失败情况。注意:如果恢复后的调用立即失败,那么会立即重新进入熔断。

servicecomb.circuitBreaker.[type].[scope].requestVolumeThreshold

20

-

10s内请求数需要大于等于这个参数值,才开始计算错误率和判断是否进行熔断。

servicecomb.circuitBreaker.[type].[scope].errorThresholdPercentage

50

-

错误率阈值,达到阈值则触发熔断

由于10秒还会被划分为10个1秒的统计周期,经过1s中后才会开始计算错误率,因此从调用开始至少经过1s,才会发生熔断。

servicecomb.fallback.[type].[scope].enabled

TRUE

-

是否启用出错后的故障处理措施

servicecomb.fallback.[type].[scope].maxConcurrentRequests

10

-

并发调用容错处理措施(servicecomb.fallbackpolicy.policy)的请求数,超过这个值则不再调用处理措施,直接返回异常

servicecomb.fallbackpolicy.[type].[scope].policy

throwException

returnNull | throwexception

出错后的处理策略

小心:谨慎使用 servicecomb.isolation.timeout.enabled=true 。因为系统处理链都是异步执行,中间处理链的返回,会导致

后面处理链的逻辑处理效果丢失。尽可能将 servicecomb.isolation.timeout.enabled 保持默认值false,并且正确设置网络层超时时

间 servicecomb.request.timeout=30000 。

示例代码

servicecomb:

handler:

chain:

Consumer:

default: bizkeeper-consumer

isolation:

Consumer:

timeout:

enabled: true

timeoutInMilliseconds: 30000

circuitBreaker:

Consumer:

enabled: true

sleepWindowInMilliseconds: 15000

requestVolumeThreshold: 20

fallback:

Consumer:

enabled: true

fallbackpolicy:

Consumer:

policy: throwException

说明:

降级策略需要启用服务治理能力,对应的服务提供者的handler是bizkeeper-provider,服务消费者的handler是bizkeeper-consumer。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释这段代码static void chassis_control_loop(chassis_move_t *chassis_move_control_loop) { fp32 max_vector = 0.0f, vector_rate = 0.0f; fp32 temp = 0.0f; fp32 wheel_speed[4] = {0.0f, 0.0f, 0.0f, 0.0f}; uint8_t i = 0; float position_error, speed_error; float position_output, speed_output; float current_position, current_speed; float target_position, target_speed; chassis_move_control_loop->vx_set=vx_set; chassis_move_control_loop->vy_set=vy_set; chassis_move_control_loop->wz_set=angle_set; chassis_vector_to_mecanum_wheel_speed(chassis_move_control_loop->vx_set, chassis_move_control_loop->vy_set, chassis_move_control_loop->wz_set, wheel_speed); if (chassis_move_control_loop->chassis_mode == CHASSIS_VECTOR_RAW) { for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(wheel_speed[i]); } } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set = wheel_speed[i]; temp = fabs(chassis_move_control_loop->motor_chassis[i].speed_set); if (max_vector < temp) { max_vector = temp; } } if (max_vector > MAX_WHEEL_SPEED) { vector_rate = MAX_WHEEL_SPEED / max_vector; for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set *= vector_rate; } } for (i = 0; i < 4; i++) { PID_Calc(&chassis_move_control_loop->motor_speed_pid[i], chassis_move_control_loop->motor_chassis[i].speed, chassis_move_control_loop->motor_chassis[i].speed_set); } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(chassis_move_control_loop->motor_speed_pid[i].out); } }
03-26

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值