데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      트래픽 Replay 활용기 (feat. 에이닷 서비스 배포)

      haru.kim 25.03.17
      1,546 5 1
      DEVOTEE 요약
      대규모 서비스 개편이나 업데이트 시 안정적인 배포를 위해 고민할 때, 트래픽 Replay 프로그램을 통해 실 트래픽을 캡처하고 테스트하며 사용자에게 영향을 주지 않는 검증이 가능합니다. Gor를 사용하면 프로그램의 주요 기능인 HTTP 요청 캡처와 트래픽 복제, 재생 등을 통해 Canary 배포 및 서버 교체 시도 등에 안전성을 높일 수 있습니다. 사용법은 간단하며, 다양한 플러그인을 지원하므로 서비스 개발 시 적극적으로 활용해볼 수 있습니다.

      안녕하세요.

      이 포스팅에서는 에이닷 서비스 배포 과정에서 활용해본 트래픽 Replay 프로그램에 대해 소개보고자 합니다.

      고민의 시작

      서비스를 개발하다보면 대규모 서비스 개편, 라이브러리 및 framework 버전 업데이트, 데이터 저장소 변경 등 크고 작은 변경작업을 진행하게됩니다.

      개발한 소스가 안정적으로 동작하는 것은 확인했지만, 막상 실제 서비스에 배포하는 시점에 오면 망설여지게 됩니다.

      대체로 아래와 같은 고민들이 머릿속을 맴돌았습니다.

      • Canary 배포를 하면 전면 장애는 막을 수 있지만. 일부 서버로 유입된 사용자 요청은 여전히 장애에 노출될 수 있다.

      • 로컬, STG에서 열심히 테스트를 한다 해도, 실제 PRD 환경에서와 같은 다양한 앱 버전, 사용자, 파라미터 조합으로는 테스트해볼 수 없다.

      • 어떻게하면 사용자에게 영향을 미치지 않으면서 실 트래픽를 받으며 서비스 코드를 검증해볼 수 있을까?

      트래픽 Replay 소개

      replay flow

      개요

      실제 프로덕션 환경의 트래픽을 캡춰하여 원격지 서버로 전송한 후 사용자에게 영향을 줄 수 있는 이슈들을 사전에 검증하고 테스트할 수 있는 프로그램입니다.

      주요기능

      1. HTTP 요청 캡처

        • Gor는 특정 서버로 들어오는 실시간 HTTP 요청을 캡처할 수 있습니다.

        • 트래픽을 원격 서버로 릴레이하거나 로컬에 저장할 수 있습니다.

      2. 트래픽 복제

        • 캡처된 HTTP 요청을 여러 서버에 동시에 릴레이하여, 트래픽 분산 또는 여러 환경에서 동시 테스트가 가능합니다.

        • 예를 들어, 프로덕션 트래픽을 캡처하여 스테이징 환경에서 재현할 수 있습니다.

      3. 트래픽 재생

        • 과거에 기록된 HTTP 요청 로그를 재생하여, 애플리케이션이 다양한 상황에서 어떻게 반응하는지 확인할 수 있습니다.

        • 로드 테스트와 리그레션 테스트에서 유용합니다.

      4. 플러그인

        • 데이터 필터링, 헤더 수정, 데이터 변환 등의 작업을 수행할 수 있는 다양한 플러그인을 지원합니다.

      5. 기타

        • 네트워크 인터페이스의 트래픽을 캡춰하여 실행되고 설치 및 사용 방법이 매우 간단함!

      주요 구성 요소

      • gor: 메인 실행 파일.

      • Input 모듈: HTTP 요청을 캡처하거나 로그 파일에서 읽습니다.

      • Output 모듈: 요청 데이터를 다른 서버로 전송하거나 로그 파일에 기록합니다.

      • Middleware: 요청 데이터를 가공하거나 필터링할 수 있는 중간 프로세스.

      활용 방법

      활용 case

      설명


      사용자에게 영향이 가지 않는 Canary 배포

      1. canary 배포로 API1 서버에 신규 소스 코드를 적용한다.

      2. API1 서버를 health down 시켜 사용자 요청 유입을 차단한다.

      3. API2 서버에서 gor를 실행시켜 트래픽을 복제하여 API1 서버로 보낸다.

      4. 오픈서치를 활용해 API1, API2 간의 요청 및 응답을 비교 & 검증한다.


      기존 서버를 신규 서버군으로 교체 시 실트래픽 기반의 api 검증

      1. 노후화된 서비스 코드를 최신 프레임웍 및 라이브러리로 새로 개발한 후 새로운 서버군을 만들었을 경우

      2. 기존 서비스(API1)의 트랙픽을 신규 서버군으로 유입시켜 전반적인 API 응답을 검증하고, 내부 방화벽 오픈 여부등을 사전에 체크하기 쉬움


      트래픽 캡춰 파일로 로컬 서비스 검증 또는 부하테스트

      1. 실트래픽 요청을 캡춰한 후 파일로 생성한다. (requests.gor)

      2. 로컬 개발환경에서 생성된 파일로 부터 트래픽을 읽어들여 API 검증

      3. 생성된 파일로 부터 원하는 속도로 트래픽을 읽어들여 부하테스트 실행

        • 부하 테스트를 위해 임의의 또는 랜덤 데이터를 생성할 필요가 없어 좋음

      실트래픽 캡춰 및 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로 출력하기

      sudo ./gor --input-raw :8080 --output-stdout

      8080 포트의 트래픽을 캡춰해서 stdout로 출력하기

      • reponse도 함께 출력하기

      sudo ./gor --input-raw :8080 --output-stdout --input-raw-track-response

      요청 필터링 하기

      sudo ./gor --input-raw :8080 --output-http http://다른서버 --http-allow-url ^/v1/user/

       path, header, method 기반으로 필터링

      • --http-allow-url /api

      • --http-disallow-url /api

      • --http-allow-header api-version:^1\.0\d

      • --http-disallow-header "User-Agent: Replayed by Gor"

      • --http-allow-method GET

      요청 Rewrite 하기

      요청 rewrite A to B (A:B)

      sudo ./gor --input-raw :8080 --output-http "http://다른서버" \\ --http-rewrite-url /v1/user/([^\\\/]+)/ping:/v2/user/$1/ping

      파라미터 세팅하기

      sudo ./gor --input-raw :8080 --output-http http://다른서버 --http-set-param api\_key=1

      헤더 세팅하기

      sudo ./gor --input-raw :80 --output-http "http://다른서버" \\ --http-header "User-Agent: Replayed by Gor" \\ --http-header "Enable-Feature-X: true"

      트래픽을 파일로 저장하기

      sudo ./gor --input-raw :8080 --output-file requests.gor

      저장된 파일에서 트래픽 재생하기

      sudo ./gor --input-file requests.gor --output-http "http://다른서버"

      성능 테스트하기 

      • 파일로 부터 2배속으로 replay

      `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/disable

      3. 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.gz

      4. 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=x1qa5dfqu5k8g3

      5. apollo-api 2번 서버의 트래픽 중 '공지사항 읽기' 관련 api의 요청을 1번 서버로 전달해보자

      sudo ./gor --input-raw :8080 --output-http 'http://서버주소:8080' -http-allow-url ^/customer/notices --http-allow-method GET

      6. 오픈 서치에서 apollo-api 1번과 2번 서버의 공지사항 읽기 API 응답을 비교한다.


      맺음말

      지금까지 Goreplay를 통해 실서비스 트래픽을 캡춰하여 다양한 케이스로 활용하는 방법에 대해 살펴보았습니다.

      간단한 설치과정과 직관적이고 간단한 코드 몇 줄로 바로 실행해 볼 수 있으니 서비스 개발에 적극 활용해보셨으면 좋겠습니다. 감사합니다.

      참고 자료

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      haru.kim 님의 최신 블로그

      더보기
      동영상 기고하기