항목의 Excel 가져오기 최적화 기록

2731 단어 빛과 먼지
업무 장면: 업체의 백그라운드 발송은 Excel 대량 발송 설정을 지원한다. excel 데이터가 만 개가 넘으면 excel을 업로드하는 데 실패할 수 있다. 주요한 성능 병목은 마이크로서비스 구조에서의 요청 초과이다. 마이크로서비스가 Excel 데이터를 분석하여 주문 마이크로서비스로 전송할 때 데이터가 너무 크고 주문 마이크로서비스 처리 시간이 길어서 요청 초과 실패를 초래한다.
 
솔루션:
  • feign의 시간 초과 설정을 향상시킵니다
    ribbon:
      ReadTimeout: 30000
      ConnectTimeout: 30000  # feign.RetryableException
     
  • Excel을 분석하여 메모리에 넣고 차례대로 주문 마이크로서비스에 전송합니다
    private BatchDeliverGoodsResult BatchSendGoods(List list) {
            int size = list.size();
            int aBatch = size / BATCH_UNIT;
            List resultList = new ArrayList<>();
            for (int start = 0; start < aBatch; start++) {
                BatchDeliverGoodsResult batchResult = platformOrderFeignClient.batchDeliverGoods(list.subList(start * BATCH_UNIT, (start + 1) * BATCH_UNIT));
                resultList.add(batchResult);
            }
            if (aBatch * BATCH_UNIT < size) {
                BatchDeliverGoodsResult batchResult = platformOrderFeignClient.batchDeliverGoods(list.subList(aBatch * BATCH_UNIT, size));
                resultList.add(batchResult);
            }
            BatchDeliverGoodsResult result = new BatchDeliverGoodsResult();
            int failCount = resultList.stream().mapToInt(BatchDeliverGoodsResult::getFailCount).sum();
            int successCount = resultList.stream().mapToInt(BatchDeliverGoodsResult::getSuccessCount).sum();
            int total = resultList.stream().mapToInt(BatchDeliverGoodsResult::getTotal).sum();
            List> failList = new ArrayList<>();
            resultList.forEach(b -> {
                failList.addAll(b.getFailList());
            });
            result.setFailCount(failCount);
            result.setTotal(total);
            result.setSuccessCount(successCount);
            result.setFailList(failList);
            return result;
        }
     
  • @Async 주석을 사용하여 요청 비동기화를 실현하고 업체가 excel을 중복 업로드하지 않도록 합니다.redis에 is:running 키를 추가하여 데이터 해석 작업의 여부를 결정하는 값이 있는지 판단합니다. 해석 작업이 시작될 때 redis에서 이 점포가 지난번에 가져온 결과를 삭제하고 두 번째 주문 마이크로서비스의 반환 결과를 shopId를 키로 하는 redis 메모리에 넣는 동시에 is:running 키를 삭제하고 전단 처리 결과의 성공 여부만 알려줍니다. 전단도 수정 페이지 사용자의 상호작용 논리에 맞추어 결과 조회 단추를 제공해야 합니다.redis 메모리에서 이 가게가 방금 가져온 데이터를 되돌려줍니다. 만약redis가null로 돌아오면 이 가게가 가져오지 않았거나 처리 중입니다

  •  
    요약:
    1. 프런트엔드: 업로드에 성공하면 프런트엔드 고정 프롬프트: 요청이 성공하면 나중에 가져오기 결과를 확인하십시오.(앞부분에서 검색 결과 인터페이스를 주동적으로 호출하지 마세요. 이번 작업을 얼마나 처리해야 할지 모르기 때문에 검색 단추를 눌러주세요)2.백엔드: 가져오기 작업이 시작되면 마지막 가져오기 결과를 지웁니다.3. 백엔드: 쿼리 가져오기 결과 인터페이스 3가지 반환 상황, <1> 데이터 반환 데이터 있음 <2> 데이터 없음, 실행 중인 가져오기 작업, 반환: 가져오기 작업이 실행 중입니다. 잠시 후 쿼리하세요.<3 > 데이터 없음, 실행 중인 가져오기 작업 없음, 반환: 가져오기 작업을 먼저 수행하십시오.

    좋은 웹페이지 즐겨찾기