분류 전체보기 23

웹소켓/stomp에서 jmeter 성능 테스트

Jmeter 설치 및 사용법1. Jmeter 설치 및 terminal 실행####실리콘 맥#https://jmeter.apache.org/download_jmeter.cgi 사이트에서 Binaries의 압축파일을 다운받아 압축을 해제#이후 해당 폴더안에 bin 폴더에서 jmeter.sh 를 실행cd ~/Downloads/apache-jmeter-5.6.3 ./bin/jmeter.sh 2. Jmeter plugins-manager 설치 - websocket, stomp 테스트용해당 사이트에서 https://jmeter-plugins.org/install/Install/ 에서 plugins-manager.jar 파일 다운jmeter 다운받은 압축 푼 폴더의 lib/ext 폴더로 해당 파일 이동jmeter 재..

팀프로젝트 2025.04.16

WebSocket을 이용한 양방향 통신으로 채팅 구현

WebSocket 이란?클라이언트와 서버 간의 단일 TCP 연결을 통해 양방향 실시간 통신이 가능하게 하는 통신 프로토콜.클라이언트 또는 서버 중 하나가 연결을 중단하기 전까지 통신이 지속됨 기술 채택 이유 → 실시간 처리를 요구하는 시스템에서 WebSocket을 이용하여 해결 가능일반적으로 서버 통신은 HTTP를 통해 이뤄짐 → 서버로 요청이 와야지만 응답을 줄 수 있음채팅 또는 금융 데이터, 주식 가격 등 실시간 변동성이 있는 데이터를 클라이언트가 확인하기 위해서 계속 HTTP 요청을 보내고 받아야함 → 동일한 요청을 매번 보내는 게 매우 비효율적임 WebSocketHTTP방식1번 연결 이후 연결 중단 전까지 자유롭게 메시지 전송 방식, 양방향 통신클라이언트 요청을 보내야 응답하는 방식, 단방향 통신..

팀프로젝트 2025.04.08

RabbitMQ to Service 시퀀스 설계

주문이 생성되면 배송, 배송 경로 기록이 동시에 생성된다.이때, rabbitMQ 비동기 처리를 해주는데 각각의 message는 최대한 필요한 컬럼만 담아서 전달한다.허브 이동 정보는 feign client 이용하여 배송 경로 기록 생성에 필요한 정보를 요청 받는다.최소 기능 개발(MVP)을 목표로 허브간 이동정보는 P2P 구현 완료되면 Hub to Hub Relay로 리팩토링 예정이다.1. P2P 경우, 배송 경로기록의 허브 순번은 1개로 고정되기 때문에 단순하게 출발 허브ID, 도착 허브ID만 일치여부를 확인하여 이동거리와 소요시간을 추출하면 된다.2. Hub to Hub Relay 경우, 허브간 이동정보에서 중간 허브에 해당하는 List 경유지 목록을 전달받아 배송 경로기록을 경유지 수 만큼 생성하는..

팀프로젝트 2025.03.14

DDD Aggregate 관점에서 비즈니스 시나리오

배송과 배송 경로 기록은 하나의 Aggregate로 묶어서 설계배송(Shipping)더보기배송 생성 주문(Order)을 생성할 때, Shipping와 ShippingHistory가 동시 생성배송 상태 변경(예: status) 배송 경로 기록의 현재상태 변경에 따라 일부 필드(배송 상태)만 수정 가능.배송 담당자 배정(예: company_shipping_manager_id) 배송 경로 기록의 “목적지 허브 도착(HUB_ARV)” 상태일 때만 Shipping 업체 배송 담당자ID 배정(배송 담당자 배정 로직 사용)하여 수정 가능.배송 주문정보 수정(예: request_details)주문 메시지에서 전달받은 “요청 사항(request_details)”을 배송의 현재상태(status)가 “허브 대기중(HUB_W..

팀프로젝트 2025.03.13

MSA와 DDD 적용하여 프로젝트 구성하기 위한 이해 필요

먼저, 각 서비스와 모듈을 명확하게 분리하는 이유는?1. 모듈화 및 분리의 원칙비즈니스 도메인 분리하여 다른 서비스 간의 의존성을 최소화2. 응집도 및 결합도높은 응집도 : 각 서비스의 코드는 해당 도메인과 관련된 기능으로 응집되어 있고, 코드의 가독성 및 유지보수성이 향상됨낮은 결합도 : 서비스 간의 의존성을 줄임으로써 변경이 필요할 때 다른 서비스에 미치는 영향을 최소화함3. 독립적인 배포각 서비스를 독립적으로 배포할 수 있음. 서비스의 개별적인 확장성 및 배포 주기를 가능하게 하고, 전체 시스템의 안정성을 높임.4. 스케일링각 서비스를 비즈니스 요구에 따라 개별적으로 스케일링 할 수 있음. 해당 서비스만 스케일 아웃하여 성능을 최적화할 수 있음.5. 기술 스택의 유연성각 서비스별 다른 기술 스택을 ..

팀프로젝트 2025.03.12

[대규모 AI 시스템 프로젝트] 요구사항 파악 및 초기 세팅

프로젝트 주제는 "물류 관리 및 배송 시스템을 위한 MSA 기반 플랫폼 개발" 입니다. MSA 설계를 하기 위해 서비스를 분리하기로 하였습니다.이때, 어떤 기준으로 분리할 것인가 고민에 휩싸이는데 DDD 특강을 토대로 애그리거트 루트를 파악하고, 독립적으로 확장/축소가 가능한 컨텍스트로 분리하여 ERD 설계를 진행하였습다. 마이크로 서비스 간 통신 방식은 동기식 호출 구조로 이뤄지는데요. 트래픽이 증가하게 되면 서비스 증설과 함께 병목지점이 생기는 문제도 해결해야 할 사항입니다.객체/마이크로 서비스 간 의존성 순환 문제분산된 서비스의 데이터 일관성을 위한 트랜잭션 처리분산된 서비스의 로그 중앙화 환경 구성 문제기본적인 요구사항은 정해져 있지만, 그 밖의 요구사항은 팀 자체에서 세부적인 내용들을 결정하고 ..

팀프로젝트 2025.03.11

mono repo를 MSA 프로젝트 적용하기 위한 기초 지식

mono repo란, 각각의 모듈이 사용하고 있는 레포지토리를 한번에 모아서 관리 및 사용하는 방식이다. 아직 직접적으로 어떻게 프로젝트에 적용해야 할지 감이 잡히지 않아 구글링 및 튜터님의 참고 자료를 바탕으로 학습하고 있다. 1. 모노 레포 구축을 위한 Tool 이 존재한다.일반적으로 yarn workspace를 활용하여 모노 레포 환경을 구축하는 것 같다.프로젝트 루트 폴더에서 package.json를 최상단에 위치시키고, 모노레포 전체의 dependency와 workspace의 정보를 작성하는 것이고, 하위 디렉토리의 package.json은 해당 프로젝트의 dependency를 독립적으로 관리할 수 있게 한다.참고(모노레포 tool): https://velog.io/@sik02/Yarn-Berr..

공부 2025.03.10

대규모 스트림 처리 및 rabbitMQ 실습

TPS는 초당 처리되는 트랜잭션의 수를 나타내는 지표이다. 로그를 모니터링 할 수 있어야 한다. → 로그를 한번에 시각화 할 수 있 모니터링 가능한 도구 찾아보기!모니터를 통해 이 시스템의 요청이 어느 정도로 일어나고 어떤 시간에 피크인지 확인하고 그 피크가 어느정도인지 알 수 있습니다. 시간별로 데이터를 나누면 그래프가 생성할 수 있습니다.(몇분 간격) DB IO 시간이 많이 소요됨. 그러므로 캐시를 사용하는데 캐시 정책도 필요하다.Ex) DB의 데이터 변경이 있으면 캐시도 purge 또는 update를 해줘야한다. redis 캐시를 사용할 때, 어떤걸 주의해야 할까?redis가 connection time out으로 시스템이 다운되었는 그 원인을 모를 경우, time out 시간을 설정해주는게 좋다...

공부 2025.03.07

Docker 실행 및 실습

윈도우 cmd 에서 아래 코드를 복붙할 경우, 실행되지 않는 문제가 발생합니다. \(역슬래쉬) 뒤에 공백이 있는 것도 아니고 개행되는 명령어를 복붙하면 안되서\ 없이 바로 -p, -e 옵션을 작성해주니 제대로 docker 실행됨을 확인 할 수 있었습니다.docker run -d --name postgres-sample \ -p 5433:5432 \ -e POSTGRES_USER=admin1 \ -e POSTGRES_PASSWORD=admin2 \ -e PGDATA=/var/lib/postgresql/data/pgdata \ -v ${로컬_바인딩_폴더}:/var/lib/postgresql/data:z \ postgres docker 컨테이너 내부 접속 및 해당 파일 확인 윈도우 cmd에서,파일 목록 ls..

공부 2025.03.06

Http Session과 Session Clustering 개념

개발자 도구(F12) - Application - Storage > Cookies 에서 JSESSIONID는 Spring boot 내장되어 있는 tomcat 서버가 만드는 키로, 세션을 tomcat에서 관리합니다. tomcat에서 관리하는 htttp session으로,  쿠키의 유무에 따라서 http session의 데이터가 있느냐 없느냐를 Spring boot가 판단합니다. 쿠키의 값을 바탕으로 tomcat이 세션을 조회하고, (Dispatcher Servlet에 넘겨) 조회된 session을 @GetMapping으로 보내줍니다.(Dispatcher Servlet의 GetMapping 인자로 넘겨준다.) 사용자의 요청 양이 증가할 경우, 해결 방안은1. Scale-Up : 8GB → 16GB →  32..

공부 2025.02.28