API 성능 테스트를 위한 응답 타이머 구축

지난 6개월 동안 나는 약 50편의 블로그 글을 썼는데 주로 인터넷 위탁 관리와 성능 등 기술 주제에 관심을 기울였다.한 조의 글에서 나는 테두리 위탁 관리 플랫폼을 이용하여 세계 각지의 사용자에게 API를 제공할 때 사람들이 기대하는 속도 향상을 평가해야 한다.
대부분의 기준 테스트 도구의 문제는 단일 위치에서 테스트를 할 것이라고 가정하는 것이다.나의 예에서 나는 몇 군데에서 테스트를 하고 싶다. 왜냐하면 나는 그와 합작한 위탁 관리 공급자가 사용자가 세계 어느 곳에 있든지 그들의 테두리 네트워크의 성능은 비교할 수 있다는 것을 증명하기를 원하기 때문이다.
나는 네 개 이상의 테스트 노드와 로컬 기기 (컨트롤러) 에서 온 API를 테스트하도록 테스트를 설계했다.API를 단일 서버와 클라이언트의 테두리 트랜잭션 네트워크에 배치하고 모든 테스트 노드의 지연이 받아들일 수 있도록 하겠습니다.

이것은 보기에는 매우 간단하지만, 놀랍게도 나는 이 임무를 위해 만든 기존의 도구를 찾을 수 없다.본고에서 저는 당신을 이끌고 제 여정을 완성할 것입니다. 최종적으로 an open-source response timer Docker image 세계 어느 곳에나 신속하게 배치할 수 있는 서버를 만들었습니다.

솔루션 1: Pingdom


이 임무를 위해 설계된 것은 아니지만 Pingdom's Website Speed Tester 실제로는 일을 잘한다.URL을 삽입하고 테스트할 데이터 센터를 선택하면 Pingdom이 웹 사이트나 API 응답 속도에 대한 통계를 되돌려줍니다.그것은 무료이며 서버 설정이 필요 없고 사용이 간단하다.
그러나 핑덤은 완벽한 해결 방안이 아니다.Pingdom을 사용하여 API를 벤치마킹하는 문제는 다음과 같습니다.
  • 사용률을 제한하기 때문에 여러 위치에서 테스트를 실행하는 데 시간이 오래 걸립니다.
  • POST, PUT 또는 DELETE 요청을 보낼 수 없습니다.
  • 요청에 제목이나 본문을 추가할 수 없습니다.
  • 같은 단점에 중복 요청을 하는 것은 불가능하다.

  • Pingdom 테스트를 사용하여 서비스에 대한 간단한 GET 요청을 테스트할 수 있지만 제가 필요로 하는 더 복잡한 API 요청에는 턱없이 부족합니다.

    솔루션 2: 볼륨


    경험이 있는 Linux 사용자는 curl can do this on its own 이것이 바로 내가 다음에 생각하는 것이다.권곡의 문제는 포맷이다.
    예를 들어, API 끝에 대한 총 요청 시간을 얻기 위해 이러한 작업을 실행할 수 있습니다.
    curl --output /dev/null \
      --silent --write-out '%{time_total}' \
      https://jsonplaceholder.typicode.com/posts
    0.005255
    
    이것은 초 단위로 응답 시간을 표시합니다. 이것은curl이기 때문에 명령행 매개 변수로 주체를 지정하는 방법headers를 사용할 수 있습니다.이 솔루션에 대한 나의 유일한 불만은 DNS 해석과 데이터 전송에 얼마나 걸렸는가와 같은 시간적 세부 사항을 제공하지 않았다는 것이다.
    이것은 당연히 쓸모가 있지만, 나는 더 좋을 것이라고 생각한다.
    내가 구글에서 검색했을 때, 나는 this response on StackOverflow 기반 a blog post 을 발견했고, 저자는 curl-format.txt 템플릿 파일을 사용하여 그의 곱슬머리 요청의 출력을 포맷했다.나는 네가 할 수 있을지 몰랐지만, 이것은 게임 규칙을 바꾸었다.
    템플릿 파일을 만들면 다음과 같은 응답을 얻을 수 있습니다.
    curl -w "@curl-format.txt" -o /dev/null -s https://jsonplaceholder.typicode.com/posts
    # Response
              final_url:  https://jsonplaceholder.typicode.com/posts
          response_code:  200s
        time_namelookup:  0.065948s
           time_connect:  0.080941s
        time_appconnect:  0.135187s
       time_pretransfer:  0.135663s
          time_redirect:  0.000000s
     time_starttransfer:  0.164189s
                        ----------
             time_total:  0.166145s
    
    그것은 보기에 더 보기 좋지만, 테스트를 시작하기 전에 모든 서버에 이 템플릿을 만들고 싶지 않습니다.나의 이상적인 해결 방안은 SSH를 통해 단일 명령을 실행하고 모든 URL에서 이 테스트를 실행할 수 있도록 하는 것이다.

    솔루션 3: Docker Image+Curl


    텍스트 파일과curl 명령을 압축할 수 있는 방법은 매우 많다.맞춤형 셸 스크립트는 작동할 수 있지만, 이 테스트를 실행하고 싶을 때마다 복사해야 합니다.그것도 그렇게 많은 기능이 없어요. - 만약에 제가 이 프로젝트를 확장하고 더 많은 기능을 제공하고 싶다면 어떻게 해야 하나요?
    따라서 제 해결 방안은curl 기반 build a custom Docker image 입니다. 출력 템플릿과 필수 인자를 포함하는curl 명령을 포함합니다.이렇게 하면 Docker 컨테이너를 실행할 수 있는 모든 환경에서 응답 타이머를 실행할 수 있고 매번 일치하는 출력 형식을 얻을 수 있습니다.물론 이것은 간단한 해결 방안이지만 확실히 효과가 있다.
    이 스크립트를 로컬에서 사용하려면 Docker 이미지를 드래그합니다.
    docker pull draftdev/rt
    
    API의 URL을 입력으로 실행하려면 다음과 같이 하십시오.
    docker run --rm draftdev/rt jsonplaceholder.typicode.com/posts
    # Response
              final_url:  http://jsonplaceholder.typicode.com/posts
          response_code:  200s
        time_namelookup:  0.025098s
           time_connect:  0.042070s
        time_appconnect:  0.000000s
       time_pretransfer:  0.042265s
          time_redirect:  0.000000s
     time_starttransfer:  0.091801s
                        ----------
             time_total:  0.098020s
    
    셸 스크립트는 사용자가 사용하는 모든 입력을 밑바닥curl 요청에 전달하기 때문에 사용자 정의 방법(-X, 머리(-H 또는 주체(-d를 포함하여 추가할 수 있습니다.
    docker run --rm draftdev/rt jsonplaceholder.typicode.com/posts -H 'Content-Type: application/json' -d '{"title": "Another great post"}' -X POST
    # Response
              final_url:  http://jsonplaceholder.typicode.com/posts
          response_code:  201s
        time_namelookup:  0.014518s
           time_connect:  0.029930s
        time_appconnect:  0.000000s
       time_pretransfer:  0.029982s
          time_redirect:  0.000000s
     time_starttransfer:  0.143273s
                        ----------
             time_total:  0.143517s
    
    이 스크립트는 Docker가 설치된 원격 서버에서 같은 생각으로 실행할 수 있습니다.나는 any of the arguments that curl supports 이런 일을 하는 것을 더 좋아한다. 그들의 DigitalOcean 은 Docker를 설치한 사람들로 하여금 신속하게 새로운 물방울을 회전하게 한다.
    marketplace Docker image
    일반적으로 내 SSH 키를 각 새 물방울에 추가하여 구성한 후에 API를 테스트하기 위해 이와 같은 작업을 실행할 수 있습니다.
    ssh root@<YOUR_DROPLET_IP> "docker run --rm draftdev/rt jsonplaceholder.typicode.com/posts -H 'Content-Type: application/json' -d '{\"title\": \"Another great post\"}' -X POST"
    # Response
              final_url:  http://jsonplaceholder.typicode.com/posts
          response_code:  201s
        time_namelookup:  0.001051s
           time_connect:  0.004071s
        time_appconnect:  0.000000s
       time_pretransfer:  0.004155s
          time_redirect:  0.000000s
     time_starttransfer:  0.046294s
                        ----------
             time_total:  0.046395s
    
    이것은 나로 하여금 임의의 서로 다른 위탁 관리 옵션 사이에서 API의 응답 시간과 기준 성능을 테스트할 수 있게 한다.

    Digital Ocean 영역 다음 단계


    비록 이 일을 완성했지만, 나는 이 생각을 계속 개선하고 싶다.Pingdom이 응답 시간 테스트에 있어서 매우 부족하다는 것을 깨달았습니다. 분포식 위탁 관리는 현대 웹 창고의 중요한 구성 부분이 되고 있습니다. 저는 이 도구를 개선하기 위해 더 많은 일을 할 수 있습니다.
    우선, 나는 더 많은 지역을 가진 호스트 공급자를 지원하고 싶다.AWS EC2 실례상 이것을 실행하는 것은 가능할 것입니다. 그리 번거롭지 않지만, 일부 서버 설정을 자동화하고 싶습니다.웹 인터페이스를 구축하여 가용성을 높이고 이를 CI 작업 흐름의 일부로 포장하는 것도 볼 수 있다.
    내가 그것을 써서 무엇을 하든지 간에 이것은 하룻밤을 쓸 만한 재미있고 유용한 프로젝트이다.
    당신은 어떻게 생각합니까?나에게 적합한 데이텀 API 도구가 있습니까?나는 너의 편지를 매우 받고 싶다. 특히 네가 이전에 이 문제를 해결한 적이 있다면.

    좋은 웹페이지 즐겨찾기