woong29
woong..
woong29
전체 방문자
오늘
어제
  • 전체 (8)
    • 사이드프로젝트 (7)
      • chan (7)
    • JAVA (0)
    • AWS (0)
    • Devops (0)

블로그 메뉴

    공지사항

    인기 글

    태그

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    woong29

    woong..

    사이드프로젝트/chan

    [service] 라이더 할당시 동시에 할당되는 문제 해결

    2022. 9. 2. 12:56

    문제

    물류 매칭쪽에서 아래와 같은 구조로 개발 진행시에 4번 로직에서 라이더 정보 요청시에 문제가 발생 할수 있다가 판단되었습니다. 물류 서비스와 마찬가지로 동일한 instance가 여러 개 생성된 상태에서 동시에 여러 요청시 동일한 Rider매칭될거라 생각됩니다.


    해결

    Redis를 사용하게 되면 레디스의 빠른 응답성과 싱글스레드 와 이벤트 루프 기반의 방식으로 인하여 위같은 문제를 해결할수 있을거라고 판단하였습니다. 아무리 여러 요청이 들어와도 한번에 하나의 요청을 처리한다면 동시처리시에 문제가 발생할 여지가 없기때문입니다.

    1. 배송기사 출근 등록과 함께 Redis List에 지역 코드 및 배솔 날짜 별로 저장
    2. 물류 서비스에서 라이더 정보 요청시에 Redis List에서 라이더 정보 순차적으로 반환

    @Transactional
        public WorkRequest registerDelivery(WorkRequestRegisterDto dto) throws JsonProcessingException {
    
            Rider rider = this.riderRepository.findById(dto.getRiderId());
    
            if (rider == null) {
                throw new RiderFindFailException("라이더 정보를 찾을 수 없습니다.");
            }
    
            WorkRequest workRequest = new WorkRequest();
            workRequest.setCenterCode(dto.getCenterCode());
            workRequest.setPM(dto.isPm());
            workRequest.setCount(dto.getCount());
            workRequest.setDate(dto.getDate());
            workRequest.setWorkRequestStatusEnum(WorkRequestStatusEnum.SUBMIT);
    
            rider.addWorkRequest(workRequest);
    
            this.workRequestRepository.save(workRequest);
    
            //대기 리스트에 등록
            riderWaitingListDao.pushRider(dto.getCenterCode(), dto.getDate(), dto.isPm(), rider);
    
            return workRequest;
        }
        
        
        //riderWaitingListDao.java
        
        public boolean pushRider(String centerCode, LocalDate date, boolean isPM, Rider rider) throws JsonProcessingException {
    
            //대기 리스트에 등록
            String key = makeKey(centerCode, date, isPM);
            RiderDto riderDto = new RiderDto(rider);
            String riderValue = objectMapper.writeValueAsString(riderDto);
    
            return  this.redisTemplate.opsForList().rightPush(key, riderValue) != null ? true : false;
        }

     

    '사이드프로젝트 > chan' 카테고리의 다른 글

    CDK 사용중 테스트 및 AWS 환경에서 properties 문제  (0) 2022.09.16
    [infra] MSA구성에 따른 인증 / 인가 로직 구현  (0) 2022.09.02
    [service]여러 서비스 사용에 따른 Integration Test  (0) 2022.09.02
    [service] 물류서비스 매칭 진행시 동시성 문제 해결  (0) 2022.09.02
    [Infra] AWS CDK(Type Script)를 이용하여 인프라 구성하기  (0) 2022.09.02
      '사이드프로젝트/chan' 카테고리의 다른 글
      • [infra] MSA구성에 따른 인증 / 인가 로직 구현
      • [service]여러 서비스 사용에 따른 Integration Test
      • [service] 물류서비스 매칭 진행시 동시성 문제 해결
      • [Infra] AWS CDK(Type Script)를 이용하여 인프라 구성하기
      woong29
      woong29
      ...

      티스토리툴바