241113 TIL - oreno turn wk1 (1)

LIHA·2024년 11월 13일
0

내일배움캠프

목록 보기
109/117
post-thumbnail

특강

첫 만남은 너무 어려워 - 좋은 리드미라는 것은 뭘까

핵심을 요약하자면 다음과 같다.

  1. 사람들은 글을 끝까지 읽지 않는다
  2. 면접관의 눈길이 갈만한 것을 리드미 상단에 올려라
  3. 하이퍼링크는 너무 많으면 좋지 않으니 접거나 수를 줄일 것

기술적 의사결정

테스트 툴

어떤 테스트 툴을 쓸까? 여러 테스트 툴을 살펴보고 특장점 별로 정리해 보았다.

  • Artillery: JS 베이스. Node.js로 구동. HTTP, Socket.io, Websocket 등 여러 프로토콜 지원. 러닝커브가 높고 TCP 프로토콜을 지원하지 않는듯 함
  • Locust: Python 베이스. Locust에서 지원하는 테스트 웹 인터페이스가 존재.
  • Apache JMeter: JAVA 베이스. 테스트 툴의 수학의 정석 같은 느낌. 러닝커브가 낮고 GUI 존재.
  • NGrinder: 네이버에서 만든 테스트 툴. Groovy, Jython 언어를 통해 스크립팅. 자바와 거의 완벽호환 선택할 특별한 메리트 없음
  • k6: JS 기반의 테스트 툴이긴 한데 HTTP에 특화. TCP나 Websocket 통신 미지원. 제외

결정: Apache JMeter. 테스트 툴 계의 정석으로 채택

로깅 파이프라인

  • ELK (엘라스틱서치 - 로그스태쉬 - 키바나)
  • EFK (엘라스틱서치 - 플루언티드 - 키바나)
    -> ELK와 EFK는 뭐가 다르고 왜 선택해야 하는가? 참고 블로그

-> ELK는 엘라스틱 사의 로깅 파이프라인 관련 플랫폼의 종합.
-> EFK는 ELK에서 로그스태쉬 대신 플루언티드를 채택한 것

로그스태쉬랑 플루언티드는 뭐가 다른가?

  • 로그스태쉬는 엘라스틱 사의 플랫폼 중 하나라 호환성을 기대할 수 있을 것. 단점은 beats라는 데이터 콜렉팅 플로우가 하나 더 필요
  • 플루언티드는 로그스태쉬보다 가볍고 유연하다는 장점

EFK

ELK

결정: EFK

분산서버

참고 블로그 - 우리 서버에는 무엇을 선택해야 할까

게임 장르별 분산 서버 형태
참고 블로그 - 분산 서버 구조

로드밸런서

  • NGINX
  • ELB (Elastic Load Balancing)
    NGINX란?

-> 로드밸런싱은 추후에 다시 해보기로.


참고

온라인 게임의 네트워크 구성

프로카데미 - 온라인 게임의 네트워크 구성
프로카데미 - 게임 서버의 2가지 기술 2

JMeter는 무엇이고 어떻게 사용하는 걸까?

참고 블로그 1
Apache JMeter는 아파치에서 만든 서버 성능 및 부하 테스트 툴. 순수 자바 애플리케이션이라 자바 8 버전 이상이 설치되어 있어야 한다고.

JMeter 다운로드: https://jmeter.apache.org/download_jmeter.cgi
JAVA 다운로드: https://www.java.com/ko/download/ie_manual.jsp?locale=ko

JMeter는 JAVA를 설치하지 않으면 실행이 안 된다. (자바 설치없이 실행해봤다가 거절당함)
JAVA를 설치했다면 bin 폴더 내의 jmeter를 실행해주자.

실행하면 이런 화면이 뜬다. 우측의 테스트 플랜 이름을 바꾸면 좌측에 반영된다.

JMeter의 Thread Group

좌측에서 테스트 플랜 우클릭 > Add > Threads (Users) > Thread Group 클릭

참고 블로그에 따르면 Thread properties가 중요한 부분이라고.

Number of Threads: 몇 개의 쓰레드(유저 수)로 테스트할 지
Ramp-up period: {Number of Thread} 만큼의 쓰레드를 몇초에 걸쳐서 만들 지
Loop Count: 요청을 몇번을 반복할 지

Thread Group의 Sampler

참고 블로그는 Thread Group 우클릭 > Add > Sampler > HTTP Request (HTTP Request를 보내는 경우) 라고 나와있는데 우리는 TCP Websocket 서버를 쓸테니 이건 아닐 것이고 일단 TCP Sampler를 선택했다. 이후 JMeter TCP로 검색해서 사용법을 찾아보니 몇 블로그가 나왔다.

참고 깃헙

TCP Client classname이라는 란이 있는데 당황하지 않고 참고 블로그를 보자. 공식 문서에 따르면 여기에 쓸 수 있는 classname은 3가지가 있고 다음과 같다고 한다.

TCPClientImpl

This implementation is fairly basic. When reading the response, it reads until the end of line byte, if this is defined by setting the property tcp.eolByte, otherwise until the end of the input stream. You can control charset encoding by setting tcp.charset, which will default to Platform default encoding.
-> 기본이 되는 Implement. 응답값을 읽어올 때 tcp.eolByte 세팅으로 정의되어 있으면 선형 바이트의 끝까지 읽고, 아니면 인풋 스트림의 끝까지 읽는다. tcp.charset 세팅으로 플랫폼의 디폴트 인코딩인 charset 인코딩을 컨트롤할 수 있다.
-> 아마 생략하면 이걸로 설정되는 듯?

BinaryTCPClientImpl

This implementation converts the GUI input, which must be a hex-encoded string, into binary, and performs the reverse when reading the response. When reading the response, it reads until the end of message byte, if this is defined by setting the property tcp.BinaryTCPClient.eomByte, otherwise until the end of the input stream.
-> 16진수로 인코딩된 그래픽 인풋을 바이너리로 바꿔주고, 응답값을 읽을 때 뒤집는다는 듯. 응답을 읽을 때 tcp.BinaryTCPClient.eomByte 세팅으로 정의되어 있으면 메시지 바이트의 끝까지 읽고, 아니면 입력 스트림의 끝까지 읽는다.

LengthPrefixedBinaryTCPClientImpl

This implementation extends BinaryTCPClientImpl by prefixing the binary message data with a binary length byte. The length prefix defaults to 2 bytes. This can be changed by setting the property tcp.binarylength.prefix.length.
-> 바이너리 길이 바이트를 프리픽스로 고정한 바이너리 메시지 데이터로 BinaryTCPClientImpl의 확장판. 프리픽스는 기본적으로 2바이트로 설정되어 있다. tcp.binarylength.prefix.length 설정에 의해 프리픽스 바이트 길이는 바뀔 수 있다고.

부하 테스트를 할때는 JMeter GUI 모드를 쓰지 말라고 한다


JMeter cmd창에 뜨는 메시지. 터미널에서 사용할 명령어를 알려준다.

대강 이렇다고 한다.

테스팅 툴에 대한 생각을 다시 해보는 건 어떤지? 라는 조언

참고 깃헙에 따르면, JMeter에서 TCP 가변길이 패킷을 테스트 할 수 있는 방법이 없어서 플러그인을 직접 만들어줘야 한다고.
JSON 포맷을 바이너리 데이터로 바꿔주는걸 지원한다. 시나리오 별로 구조체를 다 만들어야 한다고.
테스트 패킷을...

profile
갑자기 왜 춤춰?

0개의 댓글