23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
안녕하세요.
SK Planet에서 Web3기술을 이용하여 서비스 개발을 하고 있는 원준수입니다.
각 wallet의 nonce 고려, 서명 등 고려사항으로 인하여 블록체인 부하테스트에서의 난항을 겪던 중
Locust라는 오픈소스 툴을 사용하여 어려움을 해결할 수 있었습니다.
간단하게 Locust의 간단한 기능과 장점에 대해서 공유하겠습니다.
Locust는 사용자 정의 테스트 시나리오를 작성하는 데에 Python을 기반으로 하고 있습니다.
Python은 많은 개발자들이 이미 익숙한 언어이며, 높은 유연성과 확장성을 제공합니다.
저의 경우에도 web3 python module 임포트하여 쉽게 테스트 코드를 작성할 수 있었습니다.
이외에도 사용자가 웹 기반 인터페이스를 통해 테스트를 모니터링하고 제어할 수 있는 기능을 제공하여 작업이 더 직관적이고 효율적으로 만들어줍니다.
또한, 마스터-워커 (Master-Worker) 구조를 지원하여 대규모 트래픽을 생성하고 관리하여 복잡한 성능 테스트 시나리오를 효율적으로 수행할 수 있습니다.
본 포스팅에서는 Locust를 이용한 간단한 테스트를 작성해보겠습니다.
🧑🚀 요청사항
초당 100개의 요청을 처리하고 나머지 요청은 제한하는 로직을 작성하고 올바르게 작동하는지 테스트
빠르고 간단하게 서버를 구성하기 위해 Golang을 사용하고 코드 작성은 ChatGPT의 힘을 빌렸습니다.
<서버코드>
package main
import (
"fmt"
"golang.org/x/time/rate"
"log"
"net/http"
)
// 요청을 처리할 핸들러
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, world!")
}
// 속도 제한을 구현하는 미들웨어
func rateLimiter(next http.Handler, limiter *rate.Limiter) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if !limiter.Allow() {
http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
return
}
next.ServeHTTP(w, r)
})
}
func main() {
limiter := rate.NewLimiter(rate.Limit(100), 120) // 초당 100개의 요청을 허용하고 최대 120개의 버스트 요청을 허용
mux := http.NewServeMux()
mux.HandleFunc("/", handler)
// rate limiter 미들웨어 추가
wrappedMux := rateLimiter(mux, limiter)
fmt.Println("Starting server at :8080")
if err := http.ListenAndServe(":8080", wrappedMux); err != nil {
log.Fatal(err)
}
}초당 100개의 요청을 초과하면 429 응답코드를 내려주게 됩니다.
설치
locust 공식 홈페이지 - https://docs.locust.io/en/stable/installation.html
homebrew - https://formulae.brew.sh/formula/locust
코드 작성
from locust import HttpUser, task, between
HOST="http://localhost:8080"
class WebsiteUser(HttpUser):
host = HOST
@task
def test(self):
with self.client.get('/', name="devocean-test", catch_response=True) as response:
print(response)
wait_time = between(1,1)'WebsiteUser' 클래스는 Locust에서 제공하는 기본 사용자 클래스 중 하나입니다.
이 클래스를 상속하면 Locust가 HTTP 요청을 쉽게 만들고 처리할 수 있는 여러 기능을 활용할 수 있습니다.
@task 데코레이터는 테스트 시나리오의 일부를 정의합니다.
작성된 test 메소드는 무한 루프로 실행되며, 웹 호스트의 루트 페이지에 GET 요청을 보냅니다.
self.client.get() 메서드는 Locust에서 제공하는 HTTP 클라이언트를 사용하여 GET 요청을 보내고, 응답을 받습니다.
catch_response=True로 설정하면 Locust가 응답을 캐치하여 실패 여부를 확인할 수 있습니다.
wait_time 속성을 통해 각 사용자가 다음 작업을 수행하기 전에 1초의 시간을 대기하도록 설정해두었습니다.
각 사용자는 1초에 한번의 요청을 진행하게 됩니다.
Locust 실행
# 작성한 파일이름으로 변경 (devocean.py)
$ locust -f devocean.py 브라우저에서 localhost:8089 접속
Number of users - 테스트를 수행하는 동안 생성될 가상 사용자의 총 수
Ramp-up - 부하를 점진적으로 증가시킬 사용자의 수
가상 사용자 100까지는 rate limit이 발생하지 않는 것을 볼 수 있음 (초당 100번 미만 호출)
사용자를 110으로 늘려보면?
RateLimit이 발생하기 시작함
서버에서 정상적으로 RateLimit이 작동하고 있는 것 확인
Locust의 기능을 간단하게 소개해보았습니다.
공식 홈페이지를 확인해주시면 다양한 좋은 기능들을 확인해볼 수 있습니다.
행복한 하루 보내세요~
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.