您当前位置:资讯中心 >开发 >浏览文章

【故障现场】多线程性能优化最大的坑,99%人都不自知

来源:不详 日期:2024/1/22 9:16:47 阅读量:(0)

1. 问题&分析

当我们在处理慢接口问题时,经常会使用多线程技术,将能够并行处理的任务拆分到不同的线程中处理,等任务处理完成后,再收集各线程的处理结果,进行后续的处理。整体思路如下图所示:

图片图片

这样可以将并行部分的总耗时从 sum 降为 max,从而大幅降低接口的响应时间。

1.1. 案例

订单详情页耗时严重,p99 将近3秒,已经验证影响用户体验,本次迭代小艾专门对该接口进行优化。迭代刚上线,该接口的响应时间大幅降低,p99 降低到 800 毫秒以内,大家纷纷向小艾发来祝贺。但好景不长,随着流量的增加,接口响应时间也在逐渐变长,p99 超过 5 秒,最后系统抛出大量的 RejectedExecutionException 异常,这个接口不可用。最终,QA伙伴火速进行回滚操作,系统恢复正常。

系统恢复后,小艾仔细查看系统监控,CPU使用率并不高,内存也处于正常水位,接口性能居然比优化前还差,真心不知道哪里出了问题。

优化前代码:

public RestResult<OrderDetailVO> getOrderDetail(@PathVariable Long orderId){
        Stopwatch stopwatch = Stopwatch.createStarted();
        OrderService.Order order = this.orderService.getById(orderId);
        if (order == null){
            return RestResult.success(null);
        }
        OrderDetailVO orderDetail = new OrderDetailVO();
        orderDetail.setUser(userService.getById(order.getUserId()));
        orderDetail.setAddress(addressService.getById(order.getUserAddressId()));
        orderDetail.setCoupon(couponService.getById(order.getCouponId()));
        orderDetail.setProduct(productService.getById(order.getProductId()));
        log.info("串行 Cost {} ms", stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
        return RestResult.success(orderDetail);
}
关键字:
声明:我公司网站部分信息和资讯来自于网络,若涉及版权相关问题请致电(63937922)或在线提交留言告知,我们会第一时间屏蔽删除。
有价值
0% (0)
无价值
0% (10)

分享转发:

发表评论请先登录后发表评论。愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。