본문 바로가기
반응형

전체글439

스케일링 가능한 Ngrinder 환경 구축하기 (feat. AWS Beanstalk) 네이버의 Ngrinder는 대표적인 성능 부하 테스트 도구입니다. 개인적으로는 다른 테스트 도구들에 비해서 설치 과정이 조금 번거롭다는 단점에 비해 사용성과 UI/UX가 너무 직관적이라는 장점으로 인해서 오랫동안 애정하고 있는 제품인데요. 서버 퍼포먼스 테스트 툴 사용후기 설치형을 지원하다보니 동적으로 Agent 수를 늘리고싶을때마다 설치된 이미지로 서버를 재생성하는 방식으로 늘리는게 참 불편했습니다. 이럴 경우 AWS를 통해서는 보통 2가지 방법으로 해결할 수 있는데, 오토스케일링 그룹 Beanstalk 등 동적으로 동일한 서버 환경을 편하게 증설할 수 있습니다. 이번 시간에는 AWS Beanstalk을 이용하여 스케일링 가능한 Ngrinder 환경 구축하기를 진행해보겠습니다. 1. EC2에 Contr.. 2021. 6. 18.
iterm2 에 한글 자소 분리 문제 처음 iterm2를 세팅하게 되면 다음과 같이 한글의 자소가 분리되는 현상을 볼 수 있습니다. iterm2의 유니코드 세팅이 none으로 되어있기 때문인데요. 이를 설정해보겠습니다. iterm2 의 Preferences (단축키: command+,) 으로 이동합니다. 그리고 차례로 Profiles -> Text -> Unicode normalization form 으로 이동합니다. (정리하면 Preferences -> Profiles -> Text -> Unicode normalization form 순) 여기서 NFC나 HFS+ 중 하나를 선택하시면 됩니다. (둘 중 한글 자소가 제대로 합쳐지는 것이면 됩니다.) 그럼 아래와 같이 한글 자소가 분리되지 않고 잘 합쳐진 형태로 보이게 됩니다. 참고 KLDP 2021. 6. 13.
[Typescript] 1. TypeORM에서 페이징 API 만들기 - 기본페이징 기능 웹 서비스를 구현하는 과정에서 페이징 API는 가장 기본적인 기능인데요. Java 기반의 페이징 구현 코드는 많은데, Typescript 와 TypeORM 의 구현 코드가 많지 않아 작성하게 되었습니다. 현재 Typescript 와 TypeORM 스펙으로 웹 서비스를 구현하신다면 한번쯤 참고해보셔도 좋을것 같습니다. 전체 코드는 Github에 있습니다. 여기서는 기본적인 페이징에 대해서만 소개 드리는데요. 고성능의 페이징 API가 필요하다면 이전의 포스팅들을 참고해주세요. 1. NoOffset 사용하기 2. 커버링 인덱스 사용하기 3-1. 페이지 건수 고정하기 3-2. 첫 페이지 조회 결과 cache 하기 1. 프로젝트 구조 사용된 대표적인 패키지는 다음과 같습니다. Typescript TypeDI DI.. 2021. 6. 10.
7시간 장애와 수영장 지난주 금요일에 7시간동안 서비스가 안되는 초대형 사고가 났다. [서비스 장애 발생 공지] 2021년 6월 4일 서비스 오류 원인은 이벤트로 인해서 높은 트래픽이였지만, 현 서비스의 인프라 스펙을 봤을때 그정도 트래픽은 무리없이 넘어갔어야 했다. 하지만 결국 장애가 났었고, 이유는 서비스에서 사용중이던 여러 쿼리들과 코드들의 비효율 때문이였다. 슬로우쿼리 데드락을 유발할 수 있는 쿼리 최종 생성되는 쿼리를 예측할 수 없게 추상화된 SQL Builder 코드 이 쿼리를 개선하면, 또 다른 쿼리가 터지고, 그다음 쿼리가 또 터지고 연쇄폭발처럼 터져서 데드락 쿼리들 kill 하면서 인덱스 넣고 DB 업그레이드하고, 서버 늘리고 커넥션풀 늘리고 그랬다. 어떻게 마무리 되긴했지만, 위기감이 정말 많이 들었다. 바.. 2021. 6. 9.
is_left vs left_at vs left_status 트위터를 보다가 재미난 포스팅을 하나 발견했다. you-might-as-well-timestamp-it 전체적인 글의 주장은 다음과 같다. 소프트웨어 개발에서는 상황에 의존하는게 좋은 설계이지, 어떤 상황에도 좋은 기준이라는건 있을 수 없다고 생각한다. 다만, boolean (is_deleted) 대신 timestamp (deleted_at) 를 저장하는 것은 상황에 관계 없이 확실하게 좋은 설계라고 생각한다. 일반적으로 어떤 flag 값이 필요하다고 하면 그 flag가 언제 변경되었냐도 거의 필수적으로 필요하게 된다. 이미 boolean으로 결정해서 사용할 경우 이 시간을 찾아 내기 위한 마이그레이션 비용이 생각보다 많이 필요하고, 그때 가서 변경하기엔 많이 늦었다. 만약 timestamp (delet.. 2021. 6. 3.
Pinpoint APM Node 사용하기 지난 시간에 이어, 설치된 Pinpoint Node 의 기본적인 사용법과 장단점을 배워보겠습니다. 1. 로컬 프로젝트에서 접근하기 저는 로컬 개발을 위해 nodemon을 사용하고 있어, nodemon.json에 다음과 같이 설정을 해서 접근할 수 있습니다. { "env": { "PINPOINT_COLLECTOR_IP":"ec2 ip", "PINPOINT_SAMPLING_RATE":"1", "PINPOINT_APPLICATION_NAME":"pinpoint-node", "PINPOINT_AGENT_ID": "local" } } 물론 Pinpoint Collector의 방화벽 (Security Group) 에 현재 로컬 PC의 IP가 인바운드에 등록 (포트: 9991 ~ 9993) 되어 있어야 합니다. 위 .. 2021. 5. 30.

728x90