[기술블로그] 2월 2주 주간 기술블로그 Follow Up

금주(2/5~2/11)에 포스팅 된 주요 기술 블로그의 포스팅을 요약하여 공유합니다.

F/U 하는 기술 블로그 목록은 이 링크를, 지난주 포스팅은 이 링크를 참고하세요.

금주 업로드 된 포스팅 개수 : 10 개

요약한 포스팅 수 : 1개


당근마켓 팀 블로그

1. 예측 가능한 대규모 서비스 개발하기

포스팅 요약 보기

게시일 : 2/7
게시글 분류 : 성능 개선, 벤치마크 테스트, 문제 해결 과정
주요 기술 : Config Store(Central Dogma), 지형정보 검색(GEOS)

개요

당근마켓에서 사용자가 어느 국가에 위치하는지 파악하기 위한 서비스 개발을 진행했다.

개발한 기능은 두 가지 이다.

  1. ITC(IP to Country) : IP 정보 기반으로 국가 정보를 찾아주는 API MaxMind 사의 GeoIP2 Database(IPDB) 사용
  2. CTC(Coordinates To Country): 위경도 좌표 기반으로 국가 정보를 찾아주는 API 국가별 Polygon 데이터를 사용 = 국가 영해 기준 GeoJSON 2차원 공간 검색 트리에 삽입

1. 안전한 ITC 데이터 업데이트
1-1. IPDB 자동 업데이트

문제점 : IPDB를 매번 배포하려면 도커 이미지 빌드, 블루 그린 배포와 같은 전략 수립이 필요해 복잡함

해결방안

  1. IPDB 버전 관리를 위한 Config Store 사용
  2. LINE에서 개발한 CentralDogma 적용 (IPDB 버전, Hash, 업데이트 시각 저장)
  3. Central Dogma 변경점 발생 시 AWS S3로 서비스로 데이터를 내려받아주는 Watcher 적용

1-2. IPDB가 없어도 정상 서비스할 것

문제점 : 새 버전의 IPDB, Central Dogma, Watcher 중 하나라도 문제가 생기면 서비스가 불가

해결방안

  1. 기본 IPDB를 서비스에 붙여놔서 문제 있으면 그쪽을 바라보도록 설정
  2. goroutine을 통한 데이터 업데이트로 서비스 간 의존성을 제거

2. CTC의 성능 문제

프로토타입 개발 후 테스트하니 CTC의 성능이 굉장히 느렸음

2-1. 프로그램 언어 변경

문제점 : CPU 부하로 성능이 너무 느림

해결방안

  1. 언어 변경 : Python → Go
  2. 패키지 포팅 : GEOS → gogeos

gogeo에서는 STRTree를 사용할 수 없어 R Tree를 구현한 패키지를 활용

STRTree : 지형 정보를 MBR(사각형)으로 나누어 트리 구조로 저장

2-2. Geometry 검색용 Tree 최적화

문제점 : RTree.SearchIntersect를 사용했는데, 이 함수는 R Tree의 Branch Factor에 성능이 좌우됨

RTree.SearchIntersect : 점과 겹치는 모든 Bounding Box 검색 함수

해결방안 : 최적의 Branch Factor 탐색 : SearchIntersect 성능 = log BF(N)

  • BF = Branch Factor. 노드 당 엔트리 수 / N : 전체 엔트리 수
  • go 벤치 테스트 사용
  • 원래 R Tree는 Disk Based이므로 디스크의 페이지 사이즈와 같으면 효율적이지만, 이 라이브러리는 트리를 모두 메모리에 올려놔서 상관이 없음
  • 대신 최대 엔트리의 30% 를 사용하는 것이 퍼포먼스가 좋아 테스트 했으나 대부분 비슷해 성능 개선에 실패

2-3. 검색 함수 성능 개선

문제점 : CTC 의 병목 사유가 Tree 의 서치 과정이 아니라 Contains 함수가 너무 무거운 것이었음

해결방안

  1. gogeos 대신 다른 패키지를 사용하자 : geoos < geos < orb 순으로 성능이 좋았으나, 다이나믹 하지 않음
  2. gogeos의 Prepared Geometry 사용

GEOS Prepared Geometry : Geometry가 변하지 않는 특성을 이용해 미리 계산해둘 수 있는 데이터를 미리 캐싱해두는 방식. Contains와 Intersects 연산에 특히 성능 개선 효과가 크다.

결과 : geos RPS = 500 → prepared geometry = 30,000 (600배 개선)

2. golangci-lint를 이용하여 코딩 스타일을 효과적으로 관리하기


kakao Tech


1. 쿠버네티스에 레디스 캐시 클러스터 구축기


직방 TECH

1. Spring 개발자의 NestJs 적응하기

2. 코드 리팩토링, IF문을 제거하자 (전략패턴)


Google Developers

1. Hyper-local ads targeting made easy and automated with Radium


Amazon Science Blog

1. Automated reasoning’s scientific frontiers


ebay Tech Blog

1. Creating High-Quality Staging Data with a NoSQL Data Migration System

2. How eBay Developed an Automatic Testing Solution for Batch Application Upgrades


slack engineering

1. Stabilize, Modularize, Modernize: Scaling Slack’s Mobile Codebases


포스팅이 없는 블로그

네이버 D2 : 1/29

NHN Cloud MeetUp! : 1/20

LINE Engineering : 1/28

우아한형제들 기술 블로그 : 1/6

WATCHA 팀 블로그 : 1/26

무신사 기술 블로그 : 21/12/17

야놀자 : 21/11/26

THE NETFLIX TECH BLOG : 2/1

Linked in Engineering : 2/4

Engineering at Meta : 1/18

댓글남기기