23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요.
이 포스팅에서는 에이닷 서비스 배포 과정에서 활용해본 트래픽 Replay 프로그램에 대해 소개보고자 합니다.
서비스를 개발하다보면 대규모 서비스 개편, 라이브러리 및 framework 버전 업데이트, 데이터 저장소 변경 등 크고 작은 변경작업을 진행하게됩니다.
개발한 소스가 안정적으로 동작하는 것은 확인했지만, 막상 실제 서비스에 배포하는 시점에 오면 망설여지게 됩니다.
대체로 아래와 같은 고민들이 머릿속을 맴돌았습니다.
Canary 배포를 하면 전면 장애는 막을 수 있지만. 일부 서버로 유입된 사용자 요청은 여전히 장애에 노출될 수 있다.
로컬, STG에서 열심히 테스트를 한다 해도, 실제 PRD 환경에서와 같은 다양한 앱 버전, 사용자, 파라미터 조합으로는 테스트해볼 수 없다.
어떻게하면 사용자에게 영향을 미치지 않으면서 실 트래픽를 받으며 서비스 코드를 검증해볼 수 있을까?
실제 프로덕션 환경의 트래픽을 캡춰하여 원격지 서버로 전송한 후 사용자에게 영향을 줄 수 있는 이슈들을 사전에 검증하고 테스트할 수 있는 프로그램입니다.
HTTP 요청 캡처
Gor는 특정 서버로 들어오는 실시간 HTTP 요청을 캡처할 수 있습니다.
트래픽을 원격 서버로 릴레이하거나 로컬에 저장할 수 있습니다.
트래픽 복제
캡처된 HTTP 요청을 여러 서버에 동시에 릴레이하여, 트래픽 분산 또는 여러 환경에서 동시 테스트가 가능합니다.
예를 들어, 프로덕션 트래픽을 캡처하여 스테이징 환경에서 재현할 수 있습니다.
트래픽 재생
과거에 기록된 HTTP 요청 로그를 재생하여, 애플리케이션이 다양한 상황에서 어떻게 반응하는지 확인할 수 있습니다.
로드 테스트와 리그레션 테스트에서 유용합니다.
플러그인
데이터 필터링, 헤더 수정, 데이터 변환 등의 작업을 수행할 수 있는 다양한 플러그인을 지원합니다.
기타
네트워크 인터페이스의 트래픽을 캡춰하여 실행되고 설치 및 사용 방법이 매우 간단함!
gor: 메인 실행 파일.
Input 모듈: HTTP 요청을 캡처하거나 로그 파일에서 읽습니다.
Output 모듈: 요청 데이터를 다른 서버로 전송하거나 로그 파일에 기록합니다.
Middleware: 요청 데이터를 가공하거나 필터링할 수 있는 중간 프로세스.
활용 case | 설명 |
|---|---|
사용자에게 영향이 가지 않는 Canary 배포
| |
기존 서버를 신규 서버군으로 교체 시 실트래픽 기반의 api 검증
| |
트래픽 캡춰 파일로 로컬 서비스 검증 또는 부하테스트
|
실트래픽 캡춰 및 replay 시 유의사항
사용자나 데이터의 상태값을 변경시키지 않는 요청을 replay 해야합니다.
필터기능을 이용해 GET 요청만 캡춰해서 사용할 수 있습니다.
멱등성이 보장되는 POST, PUT 요청이라면 가능합니다. (하지만 PRD 환경에서는 이또한 조심하도록 합니다.)
wget -e https://github.com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_x64.tar.gz
tar -xvzf gor_1.3.3_x64.tar.gz설명 | 예제 |
|---|---|
기본 사용법 | sudo ./gor --input-raw :포트 --output-http 서버정보 |
8080 포트의 트래픽을 캡춰해서 stdout로 출력하기 |
|
8080 포트의 트래픽을 캡춰해서 stdout로 출력하기
|
|
요청 필터링 하기 |
path, header, method 기반으로 필터링
|
요청 Rewrite 하기 | 요청 rewrite A to B (A:B)
파라미터 세팅하기
헤더 세팅하기
|
트래픽을 파일로 저장하기 |
|
저장된 파일에서 트래픽 재생하기 |
|
성능 테스트하기
| `sudo ./gor --input-file 'requests.gor |
대규모 업데이트로 공지사항 읽기 API 내부 로직이 많이 변경되었다.
신규 소스를 1번 서버에 카나리 배포 후 goReplay 를 이용해 기존 서비스 응답(2번 서버)과 비교해보자
1. DPV-APOLLOP-API01 서버에 신규 개발한 소스를 배포
2. DPV-APOLLOP-API01 서버를 health down 시킨다
더이상 요청이 유입되지 않는지 확인
curl -X POST 'http://localhost:8081/health/disable3. DPV-APOLLOP-API02 서버에 gor 설치
wget -e use_proxy=yes -e https_proxy=프록시서버:3128 https://github.com/buger/goreplay/releases/download/1.3.3/gor_1.3.3_x64.tar.gz
tar -xvzf gor_1.3.3_x64.tar.gz4. 2번 서버에서 공지사항 읽기 관련 트래픽을 캡춰 후 stdout으로 출력해보자
실제 트래픽을 다른 서버로 전송하기 전에 내가 테스트하고자 하는 요청만 잘 필터링 되고 있는지 확인
sudo ./gor --input-raw :8080 --output-stdout --http-allow-url ^/customer/notices --http-allow-method GET출력 화면
1 c0c81f907f000001e6951dd6 1733357644803631337 0
GET /customer/notices HTTP/1.1
User-Id: OOOOOOOO
Device-Id: OOOOOOOO
Poc-Id: app.apollo.agent
os: ANDROID
User-Agent: PostmanRuntime/7.42.0
Accept: */*
Host: localhost:8080
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Cookie: SCOUTER=x1qa5dfqu5k8g35. apollo-api 2번 서버의 트래픽 중 '공지사항 읽기' 관련 api의 요청을 1번 서버로 전달해보자
sudo ./gor --input-raw :8080 --output-http 'http://서버주소:8080' -http-allow-url ^/customer/notices --http-allow-method GET6. 오픈 서치에서 apollo-api 1번과 2번 서버의 공지사항 읽기 API 응답을 비교한다.
지금까지 Goreplay를 통해 실서비스 트래픽을 캡춰하여 다양한 케이스로 활용하는 방법에 대해 살펴보았습니다.
간단한 설치과정과 직관적이고 간단한 코드 몇 줄로 바로 실행해 볼 수 있으니 서비스 개발에 적극 활용해보셨으면 좋겠습니다. 감사합니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.