[英]Best way to handle exceptions when the invoked method throws a lot of exception
我尝试像这样处理rpc异常
try {
rpcService.invokeRemoteMethod(foo)
} catch (Exception e) {
logger.error("invokeRemoteMethod failed, foo = {} ", foo);
throw CustomException(e);
}
当rpcService不可用时(例如超时),此代码段会将大量的堆栈跟踪日志写入文件,这可能会消耗大量的内存和内存,因此我猜是否可以设置一些阈值,例如何时相同的异常错误每分钟一次,我打印整个异常堆栈,每分钟10次,我只打印异常消息,超过100次,我什么也不记录。
在我看来,断路器是控制日志记录的适当模式(如果等待时间较长,也可以防止DOS运行)。 如果连续有5个以上的异常(可以针对每个服务进行配置),则可以打开电路,以便在远程服务关闭时应用程序不会调用并记录错误。
根据您的项目,您可以使用开源断路器,也可以使用AOP编写简单的断路器,也可以使用断路器包装RPC类。
理解的最小例子是
public abstract class CircuitBreaker
{
private Circuit circuit;
public CircuitBreaker(){
circuit = new Circuit();
}
public void execute()
{
if(circuit.isOpen()) {
throw CircuitOpenException();
}
invokeService();
}
protected void recordFailure(){
circuit.recordFailure();
}
protected abstract <T extends Object> T invokeService();
}
public class RPCServiceExecutor extends CircuitBreaker
{
protected Result invokeService() {
try {
Result result = rpcService.invokeRemoteMethod(foo);
return new Result();
} catch (Exception e) {
this.recordFailure();
logger.error("invokeRemoteMethod failed, foo = {} ", foo);
throw CustomException(e);
}
}
}
当circuit isOpen时不记录异常,当Circuit闭合时,总是记录异常。
有关更多详细信息和示例,您可以参考
https://martinfowler.com/bliki/CircuitBreaker.html
https://spring.io/guides/gs/circuit-breaker/
希望对您有所帮助。 如果您需要更详细的实际示例,请告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.