如何优化这段代码?

业务背景: 我们有一个劳务系统,前端需要调用一个 GET 接口获取某项目下所有工人(目前约 2000 人)的考勤记录,并展示他们的数据是否已经同步到了政务监管平台。 当前代码逻辑(伪代码): public List<UserSyncStatusVO> getSyncStatus(Long proje...
如何优化这段代码?
如何优化这段代码?

业务背景: 我们有一个劳务系统,前端需要调用一个 GET 接口获取某项目下所有工人(目前约 2000 人)的考勤记录,并展示他们的数据是否已经同步到了政务监管平台。
当前代码逻辑(伪代码):

public List<UserSyncStatusVO> getSyncStatus(Long projectId) {
    // 1. 查出该项目下所有的工人 (约2000条)
    List<User> users = userMapper.selectByProjectId(projectId);
    
    List<UserSyncStatusVO> result = new ArrayList<>();
    
    // 2. 遍历处理
    for (User user : users) {
        UserSyncStatusVO vo = new UserSyncStatusVO();
        vo.setUserId(user.getId());
        
        // 痛点A:循环内查考勤表
        List<Record> records = recordMapper.selectByUserId(user.getId());
        
        // 痛点B:循环内调用第三方 HTTP 接口同步数据,外部接口平均耗时 200ms
        String status = thirdPartyHttpService.sync(user.getId(), records);
        vo.setStatus(status);
        
        result.add(vo);
    }
    return result;
}

面临问题: 这个接口一调就超时报错,系统卡死。

请问:

  1. 这段代码存在哪些致命问题?

  2. 如何用 Java 现有的技术重构并优化这段代码?

  3. 如果前端要求点击按钮后必须在 2 秒内看到所有人的状态,怎么设计这套架构?

7 个帖子 - 4 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文