写点什么

性能测试中 Disruptor 框架 ExceptionHandler 使用分享

作者:FunTester
  • 2022 年 3 月 16 日
  • 本文字数:1099 字

    阅读完需:约 4 分钟

在使用Disruptor设计新的性能测试模型的过程中,在使用过程中,偶然发现会有一些异常,然后 QPS 就会不断下降,直到最后 QPS 能力降为零。经过查询相关资料后发现了一个小坑:com.lmax.disruptor.ExceptionHandler


这个接口实现类是处理消费消息的过程中发生的异常,具体的源码位置在com.lmax.disruptor.WorkProcessor#run,有兴趣的可以看看。下面分享一下部分代码:


            catch (final Throwable ex)            {                // handle, mark as processed, unless the exception handler threw an exception                exceptionHandler.handleEventException(ex, nextSequence, event);                processedSequence = true;            }
复制代码


如果大家在使用Disruptor使用默认的方法的话,会使用默认的ExceptionHandler的实现类com.lmax.disruptor.FatalExceptionHandler,它的com.lmax.disruptor.FatalExceptionHandler#handleEventException方法如下:


    @Override    public void handleEventException(final Throwable ex, final long sequence, final Object event)    {        logger.log(Level.SEVERE, "Exception processing: " + sequence + " " + event, ex);
throw new RuntimeException(ex); }
复制代码


最后还是会抛出一个异常,然后造成com.lmax.disruptor.WorkProcessor执行失败,如果消费消息异常比较多的话,基本上消费线程会很快被干掉,最终导致没有消费线程。


回到实际场景,使用消费线程进行并发请求,在之前的实现中都是直接抛出异常,导致 BUG 的出现。修复的方法也很简单,要不使用Disruptor提供的几种com.lmax.disruptor.IgnoreExceptionHandler或者org.apache.logging.log4j.core.async.AsyncLoggerDefaultExceptionHandler之类的,基本都是日志打印。不过还是喜欢自己实现,这样方便一些,所以下面是我的解决方案。


try{    dosomething()catth(e){
}
复制代码


因为随着 QPS 上升,报错的概率还是挺大的,毕竟是日志流量回放,由于流量文件中部分请求直接回放是会失败的。如果打印日志,即使每秒万分之一的概率,每秒错误 QPS 就得 10+的 QPS。不如直接使用专用的日志平台去统计这部分的异常日志。

Have Fun ~ Tester !

发布于: 刚刚阅读数: 2
用户头像

FunTester

关注

公众号:FunTester,750篇原创,欢迎关注 2020.10.20 加入

公众号FunTester,坚持原创文章的测试人,一个有趣的灵魂。

评论

发布
暂无评论
性能测试中Disruptor框架ExceptionHandler使用分享_Disruptor_FunTester_InfoQ写作平台