주문 요청이 들어오면, 상품 서비스에서 요청을 받게 된다. 그러면 상품 서비스는 상품 재고를 검사하고 해당 상품이 현재 구매 가능한 시각인지 검사 그리고 재고를 감소시키는 작업을 수행한다. 시간 효율성을 위해 상품 재고를 Redis에 Cache하여 사용하려 한다. 트러블 슈팅현재 상품 재고를 레디스에 캐싱하여 관리한다. 또한 동시성 제어를 위해 Redisson Lock을 사용한다.주문 요청이 들어오면 상품 서비스에서 로직은 다음과 같다.레디스에서 상품 재고 조회재고가 부족하다면 재고 부족 예외 발생레디스에 상품 재고 정보가 없다면 데이터베이스에서 조회 후 캐싱데이터베이스로부터 상품 조회구매 가능한 시간인지 검사구매가 불가능한 시간이라면 예외 발생레디스 상품 재고 감소데이터베이스 상품 재고 감소 기존 코드..
전체 글
·기타
쇼핑몰과 같이 실시간으로 상품의 재고가 계속 변하는 환경에서는 재고 관리가 매우 중요하다.실시간으로 변경되는 정보를 정확하고 신속하게 데이터베이스에 반영해야 한다. 이때, saveAndFlush() 메서드를 사용하여 즉각적으로 데이터베이스에 반영하는 방식이 더티체킹 방식보다 더 적합할 수 있다.@Transactionalpublic void decrease(Long id, Long quantity) { // Stock 조회 // 재고 감소시킨 뒤 // 갱신된 값을 저장 Stock stock = stockRepository.findById(id).orElseThrow(); stock.decrease(quantity); stockRepository.saveAndFlush(sto..
·기타
Redis 소개Redis는 Remote Dictionary Server의 약자로, 고성능의 key-value 저장소이다. 오픈 소스로 개발되었으며, 네트워크를 통해 접근할 수 있는 인메모리 데이터 구조 저장소로, 다양한 데이터 구조를 지원한다. 예를 들어 문자열(String), 해시(Hash), 리스트(List), 집합(Set), 정렬된 집합(Sorted Set) 등의 데이터 타입을 지원하여, 이를 활용해 매우 빠른 읽기와 쓰기 속도를 제공한다.Redis의 특징빠른 성능: 데이터를 메모리에 저장하므로, 디스크 기반의 데이터베이스에 비해 훨씬 빠른 읽기/쓰기 속도를 제공한다.지속성 옵션: Redis는 데이터를 디스크에 저장할 수 있는 옵션을 제공한다.메모리의 내용이 시스템 장애로 인해 손실되더라도 데이터를..
·기타
프로젝트 구성루트 폴더(miri-miri-msa)core-moduleuser-service-modulegoods-service-moduleorder-service-module 그리고 루트 폴더의 settings.gradle 파일과 build.gradle 파일을 다음과 같이 설정한다.setggins.gradle (root 프로젝트)rootProject.name = 'miri-miri-msa'include 'core-module'include 'user-service-module'include 'goods-service-module'include 'order-service-module' build.gradle (root 프로젝트)plugins { id 'java'..
채팅 기능 기본 설정 설명에 앞서, 시스템에서 채팅 기능이 어떻게 동작하는지 로직을 우선 설명하도록 한다. 웹소켓 생명주기 관리🥸우리 시스템의 대략적인 웹소켓 연결 과정은 다음과 같다. 웹소켓 연결 초기화사용자가 로그인을 완료하면, "ISLOGIN" 쿠키 값을 확인하여 로그인 상태(True)일 경우에 한 번만 웹소켓 연결을 요청한다.웹소켓 연결 유지 관리웹소켓 연결이 성공적으로 이루어지면, 서버는 사용자의 ID를 웹소켓 세션에 저장한다.리액트 클라이언트는 웹소켓을 통한 모든 통신 과정을 진행하기 전에 웹소켓 연결 상태를 확인한다. 연결이 끊어진 경우, 자동 재연결 시도와 함께 필요한 토픽 구독을 재요청한다.토픽 구독 및 메시지 처리사용자는 서버로부터 자신의 ID를 받고, 이를 사용하여 알림 및 채팅방 ..
WebSocket, Stomp, Kafka, MongoDB, MySQL, Redis를 사용하여 채팅 기능을 구현하였다.이번에는 시간 타입 변경(String -> LocalDateTime)에 의한 성능 개선 경험 그리고 Kafka를 사용한 성능 개선 경험에 대해 작성해보려 한다. 성능 테스트 구성테스트에 앞서 WebSocket 테스트를 위해서는, JMeter에 WebSocket 플러그인을 설치해야 한다. Thread Group 구성웹소켓 연결 시작(WebSocket Open Connection)웹소켓 연결 요청(SEND CONNECT)채팅방 구독 요청(SEND SUBSCRIBE)메시지 전송(SEND CHAT)응답 대기(READ CHAT)웹소켓 연결 해제(DISCONNECT)※ 이때, 채팅방 구독 해제와 웹..
이전 글에서는 채팅 기능에 WebSocket, Kafka, MongoDB를 사용하는 이유에 대해 작성해보았다.이번에는 채팅 기능에서 사용되는 도메인 설계에 대해 작성해보려 한다. 도메인 설계채팅 기능에 사용되는 도메인과 저장되는 저장소 목록은 다음과 같다.채팅방(ChatRoom): RDBMS채팅 메시지(ChatMessage, Message): MongoDB채팅 알림(ChatNotification, Notification): RDBMS채팅방 입장 상태 (ChatRoomParticipant): REDIS 채팅방(ChatRoom)채팅방은 사용자들이 서로 메시지를 주고받을 수 있는 공간으로, 관계형 데이터베이스(RDBMS)에 저장된다. 채팅방 정보는 사용자 정보와 긴밀히 연결되어 있어, 조회 시 사용자 정보를 ..