연구한 이야기

    클라이언트 IP를 '잘' 가져오자

    요즘은 너무나도 당연히 대부분의 사용자 기기가 공유기 뒤에 숨어있듯이, 서버 또한 로드밸런서 뒤에 숨어있는 것이 너무나도 당연한 구조가 되었다. 이제 서버 개발자는 하나의 고민을 더 하게 된다. 예전에는 p2p 통신을 위해 홀펀칭을 고민하고 릴레이를 해주어야 했다면, 이제는 클라이언트 IP를 가져오기 위해 고민을 해야 할 차례가 되었다. 우리가 얻을 수 있는 클라이언트 IP는, 해당 클라이언트가 숨어있는 라우터 공유기의 공인 IP이다. 하지만 그 정보 또한, 프록시와 로드밸런서가 가득한 네트워크 세상에서 어떻게 가져와야 할지 고민해봤다. 사실 맨 처음에는 도커 서비스에서 client addr을 가져오니 도커 브릿지 ip가 찍히는 것이 문제였다. 그래서 docker network_mode를 host로 놓아..

    게임 서버 로그 처리하기

    게임 서버 로그 처리하기

    어떤 로그? 어디에서 로그를 수집할까 게임 클라이언트 로그 클라이언트의 데이터는 믿지 않는 것이 원칙 디버깅용 (크래시 위치 등) 재현 스텝 파악용 게임 서버 로그 추적되어야 하는 모든 이벤트를 기록 재화의 증감 액션 히스토리 이벤트 처리 결과 어떤 형태의 로그를 수집할까 로그 형태를 직접 정의하여 사용하는것이 일반적 공통 헤더를 정의 후, 사용하는 것이 일반적이다. 일반적으로 탭으로 구분되는 TSV 형태를 주로 사용한다. JSON 형태로 저장하는 경우도 더러 존재한다. 텍스트 파일로 로컬 저장하는 것이 일반적 바로 DB나 네트워크 저장소에 넣기에는 부하와 안정성 문제 로컬 텍스트 파일로 저장하여 서버가 크래시나도 보존되도록 한다 신경써야 하는 점? 누락이 존재하여서는 안된다. 게임 서버가 크래시가 나더..

    서버 로그가 누락되고 있어요..!

    게임 서버가 출력하는 게임 로그가, 로그 DB로 일부만 들어가는.. 크리티컬한 문제가 발견되었다. 분명 이것저것 테스트까지 완료한 서비스들과 설정대로 패키징하여 퍼블리셔사에 전달드렸는데..! 퍼블리셔사에서 서버 로그가 누락되는 것 같다고 전달해주셨을 때 가슴이 철렁 했다. 이제 개발 환경을 구축중인, 신작 프로젝트라 그나마 다행이지.. 한 번, 로그 관리 플로우를 되짚어 보자. 게임 서버는 로그를 로컬 파일에 한 라인씩 append해가며 작성해 나간다. 만약 로그 파일이 생성된지 5분이 넘었거나, 파일 크기가 5MB가 넘었다면, 새 파일을 열어 그곳에서 이어간다. 그리고, 쉘 스크립트를 기반으로 하는 서비스에 의해, 해당 로그 폴더에서 생성된지 6분 이상 지난 파일이 logstash 서버로 전송된다. 그..

    alpine리눅스와 stat

    이번에, 마운트된 디렉터리 내 파일들이 만약 생성된지 5분 이상 지났다면 처리하는 프로그램을 만들게 되었다. 간단한 처리라, shell script (bash) 로 작성하여 alpine을 기반으로 하는 도커 이미지로 패키징하였다. 문제는, stat -c %W 명령어를 실행했을 때 값이 정상적으로 뜨지를 않았다.. 그래서 도커 컨테이너 접속해서 확인해보니 stat 했을 때 파일의 생성 시각이 아예 뜨지를 않았다. 그래서 실험삼아 기본 이미지를 alpine이 아닌 ubuntu로 변경해 보았더니, 같은 stat 명령어를 같은 마운트된 폴더 파일에 수행했을 때 파일 생성 시각이 잘 보였다. 그래서 이 문제의 원인을 여러 가지로 추측중에 있다. - alpine리눅스가 경량이다 보니, stat 기능 또한 ubunt..

    mysql connect 시에 timezone 관련해서 에러가 나요!

    The server time zone value 'KST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver mysql에서 SELECT @@global.time_zone; 해보면 SYSTEM 값이 나오면, 서버에는 기본 timezone이 없는 상태. 이 상황에서 클라이언트가 timezone 명시 없이 접속하게 되면 에러가 나게 된다. 서버에서 timezone을 설정하던지 (SET 쿼리), 클라이언트가 연결 시에 serverTime명시하자.

    Android Studio NDK breakpoint가 잡히지 않아요!

    debugger가 dual 로 켜진 상황 (app→edit configurations→debugger) C++ 코드의 breakpoint들이, debugging을 시작하면 빨간 점에서 비활성화 표식으로 바뀜. Native code debug is not working in Android Studio 3 - Stack Overflow proj.androidstudio 폴더의 app/.cxx 폴더를 지워주고 다시 디버깅하니 잘 잡힌다!

    dockerfile은 죄가 없다.

    업무를 진행하며, 다양한 서버와 인프라를 도커 환경으로 묶어 봤다. 이 때, 어떨 때는 도커 빌드 속도가 빨랐다가 어느 때는 느리고, 이런저런 문제를 겪기도 했다. dockerfile을 작성할 때 유의해야 할 세 가지를 뽑아 정리해 보았다. 1. 레이어 개수에 유의하기 Dockerfile의 각 명령어는, 대부분 새로운 레이어를 생성한다. 불필요하게 많은 레이어는 빌드 시간과 이미지 크기를 증가시켜, 효율성을 저하시킬 수 있다. 기존에는 가독성을 위해 다음과 같이 작성했었다. FROM alpine:latest RUN apk update RUN apk add rust RUN apk add cargo ... 하지만 위 dockerfile의 경우 벌써 네개의 레이어가 만들어진다. 따라서, 아래처럼 개선할 수 있..

    conan 패키지 관리자 도입하기 : 개론

    conan 패키지 관리자 도입하기 : 개론

    회사에서 기존 CMake기반의 개발 환경에, conan을 도입해보는 업무를 맡았다 부끄럽지만 기존에 CMake를 써본 경험도, XCode IDE를 써본 경험도 없어서, 꽤나 많은 시행착오들이 있었는데, 이러한 과정을 간단하게 글로 포스팅해보고자 한다. Conan이 뭔가요? conan은 C/C++을 위한 패키지 관리자입니다. 외부 라이브러리나 의존성을 효과적으로 관리하고 프로젝트에 포함하는 것이 가능해집니다. 코난을 사용하면 어떤 점이 있는지, 정리해 보겠습니다. 기존 C/C++ 라이브러리 추가 플로우 필요한 라이브러리를 수동으로 다운로드받고, 빌드 환경에 맞게 수동으로 설정해주어야 했습니다. 헤더 위치를 지정해주고, 빌드에 포함할 디렉터리나, 라이브러리 파일을 직접 입력해주어야 합니다. 또한, 플랫폼이나..