繁体   English   中英

当被调用的方法引发大量异常时处理异常的最佳方法

[英]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://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/concurrent/CircuitBreaker.html

https://spring.io/guides/gs/circuit-breaker/

希望对您有所帮助。 如果您需要更详细的实际示例,请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM