본문 바로가기

project/Delivery4

[Delivery] 여러 명의 Rider가 동시에 동일한 주문 배달을 접수할 때 이슈 Delivery 프로젝트의 배달 주문의 프로세스를 간략히 표현하면 위의 그림과 같습니다. 1. User는 장바구니에 담아 놓은 메뉴로 주문을 요청합니다. 2. Owner는 주문 요청을 승인합니다. 3. Rider는 승인된 주문을 배달 접수를 합니다. 4~5. 다른 Rider가 동일한 주문에 배달을 접수하면 예외를 발생합니다. 언뜻 보기에 문제가 없어 보이지만 그렇지 않았습니다. 여러 명의 Rider가 동시에 동일한 주문에 배달 접수할 때, 모든 Rider가 접수가 되는 문제가 생길 수 있습니다. DB엔 어떤 Rider가 저장될지는 아무도 모릅니다. 마치 멀티스레드 환경에 공유자원을 사용해 문제가 발생하는 이슈와 같습니다. 빨간색 부분은 주문의 상태를 보고 이미 다른 Rider가 배달 접수를 했다면 예외를.. 2022. 1. 7.
[Delivery] Redis에 session 저장하기 Delivery 프로젝트는 대용량 트래픽을 대비해 Scale-out 환경으로 구축했습니다. Scale-out 환경엔 session 로그인 구현 시 아래 그림과 같은 문제가 생길 수 있는데 로그인을 했음에도 세션이 저장되어 있지 않은 서버가 요청을 받는다면 다시 로그인을 해야 하는 문제입니다. 저는 session storage 방식으로 해결했습니다. 세션을 관리하는 Redis 서버를 별도로 두어 어느 애플리케이션 서버에 요청이 들어와도 로그인은 한 번만 하면 됩니다. UserLoginService @Service @AllArgsConstructor public class UserLoginService { private final HttpSession httpSession; private final User.. 2021. 12. 31.
[Delivery] 반복되는 로직을 AOP로 분리하기 Delivery 프로젝트에 주문 관련 로직을 담당하는 OrderService 클래스가 있습니다. OrderService에서 제공하는 대표적인 메서드는 사용자에 따라 아래의 내용처럼 기능을 제공합니다. User (소비자) - 주문 요청 Owner (식당 주인) - 주문 받기 - 주문 거절 Rider (배달원) - 주문 배달 받기 - 주문 배달 완료 각각의 메서드는 Order Entity의 상태 값을 변경시켜줍니다. ORDER_REQUEST, ORDER_APPROVAL, IN_DELIVERY, DELIVERY_COMPLETE, ORDER_CANCEL, ORDER_REFUSED 저는 실시간으로 상태 값을 보여주고 또한 알림의 목적으로 Firestore를 도입하기로 했습니다. 아래 코드는 Firestore에 O.. 2021. 12. 31.
[Delivery] 프로젝트 구조 Delivery 프로젝트는 대용량 서비스를 대비한 구조로 만들어 보려고 노력을 했다. 하지만 웹 개발자를 위한 대규모 서비스를 지탱하는 기술이란 책을 최근에 읽어보면서 Delivery 구조는 부족함이 많았다. 그래도 일단 지금까지 구성한 내용을 설명하고 부족한 것 같은 부분도 써보겠다. ▶Application Server Spring boot + tomcat 환경으로 scale out 방식으로 분산처리가 가능하도록 했다. ▶Nginx 웹서버로 로드밸런싱을 위해 도입했다. 아파치도 고려를 해보았으나 아파치는 요청마다 자식 프로세스를 생성함으로 리소스를 많이 먹는다. Nginx는 싱글 스레드로 event driven 방식으로 저렴한 비용으로 비동기 작업을 수행한다. ▶Jenkins Jenkins로 CI/CD.. 2021. 12. 28.