成就系统实现(四)-测试和总结

完成架构设计之后,就开始进入了开发阶段,后续经过联调测试的调整,大概花了两个礼拜的时间,完成了开发和自测,代码已在github开源:https://github.com/caisl/achievement-system.git


单元测试:

@Test
    public void finishWelcomeAchievementTest() throws Exception {
        OrderEvent orderEvent = new OrderEvent(entityId, customerRegisterIds, AchievementConstant.EventSource
                .FROM_H5, AchievementEnum.EventTypeEnum.ORDER_EVENT.getType());
        orderEvent.setAction(AchievementEnum.OrderActionEnum.SUBMIT.getCode());
        orderEvent.setOrderType(AchievementConstant.OrderType.ORDER_SHOP);
        eventClient.publish(orderEvent);
        Thread.sleep(5000);
    }

自测过程中对于代码进行debug,然后发现怎么都断点进不到事件处理类,为了解决这个问题,还是想了很久,最后发现,是因为单元测试的主线程提前关闭,而消费者线程是异步开启,从队列里面取事件进行消费,加了个Thread.sleep(5000)保证主线程一直处理运行的状态,就可以进入断点了。

上线后观察:

发布上线之后,过一段时间就出现了队列里面的事件消费阻塞问题,即消费者线程读取到某个序号的事件之后,就不再从队列里面取下一个事件了。同时伴随服务器的load升高,一开始没有定位到具体原因,服务器重启之后就恢复正常,然后过一段时间又阻塞,经过xxx定位如下,发现异常处理这块有问题,捕捉到异常之后,又重新抛了出去,导致消费者线程阻塞了,由于ringBuffer环形读取消费,其它的消费者线程也一并开始卡死。

具体定位的过程可以看这篇文章:记一次线上服务器load高问题定位和解决

对于外部引入的框架,一定要谨慎小心,必须了解其中的原理和源码实现,才能放心投入到项目中使用,发现问题可以及时定位原因


你可能感兴趣的:(项目记录)