문제
물류 매칭쪽에서 아래와 같은 구조로 개발 진행시에 4번 로직에서 라이더 정보 요청시에 문제가 발생 할수 있다가 판단되었습니다. 물류 서비스와 마찬가지로 동일한 instance가 여러 개 생성된 상태에서 동시에 여러 요청시 동일한 Rider매칭될거라 생각됩니다.
해결
Redis를 사용하게 되면 레디스의 빠른 응답성과 싱글스레드 와 이벤트 루프 기반의 방식으로 인하여 위같은 문제를 해결할수 있을거라고 판단하였습니다. 아무리 여러 요청이 들어와도 한번에 하나의 요청을 처리한다면 동시처리시에 문제가 발생할 여지가 없기때문입니다.
- 배송기사 출근 등록과 함께 Redis List에 지역 코드 및 배솔 날짜 별로 저장
- 물류 서비스에서 라이더 정보 요청시에 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 |