본문 바로가기

소프트웨어-이야기/아키텍처

분산 시스템을 위한 유일 ID 생성기 설계 가상면접 사례로 배우는 대규모 시스템 설계 기초 책의 7장을 보면, 분산 시스템을 위한 유일 ID 생성기 설계 패턴에 대해 나온다. 최근에 고민했던 것들이 모두 정리되어있어 블로그에도 남겨본다. 이 책에서는 유일 ID 생성 패턴은 크게 4가지이다. 1. 데이터베이스 별로 pk 생성 규칙을 나눠갖기 DB 별로 사용할 수 있는 pk 생성 규칙을 나눠가지는 안이다. 후보1: pk 증분 기준을 각각 다르게 설정하기 예를 들어, pk를 auto_increment를 데이터베이스 별로 증가시키는 기준을 다르게 가져가는 안이 있다. 갈레라 클러스터 처럼 분산 DB 구조에서는 이런 패턴을 사용하고 있다. 그러나 DB 서버를 증설하거나 삭제하는 작업이 쉽지 않다는 단점이 있다. 후보2: pk 시작값을 다르게 설정하기 대신..
Cursor Pagination - 대용량 데이터에 페이지네이션 적용하기 이 글에서는 Offset Pagination의 단점과 Cursor Pagination의 장점에 대해서 설명하고자 합니다. Pagination은 가장 대중적으로 사용되는 Offset Pagination과 Cursor Pagination으로 나뉩니다. Offset Pagination offset pagination이란, page 혹은 offset/limit을 지정하여 데이터에서 pagination 된 결과를 조회하는 방식을 의미합니다. /article/?offset=10&limit=10 /article/?page=1 이와 같은 쿼리 파라미터를 전달하는 경우, 아래와 같이 쿼리로 데이터를 조회합니다. select * from article limit 10 offset 20 offset pagination 방식..
동영상 플랫폼 이해하기 (2) - AWS MediaConvert AWS 미디어 컨버트란? 파일기반 콘텐츠를 여러 디바이스에 송출할 할 수 있도록 파일을 변환해주는 프로그램이다. File based Transcoding이란? 영상 콘텐츠 파일에 영상 변환과 압축, 패키징, 접근 권한 제어를 수행한다. 영상 변환 영상 파일의 해상도를 낮춰서 파일을 압축하거나, 파일을 여러개로 분할해주는 역할을 수행한다. Adative Streaming을 위하여, 네트워크 대역폭별로 내려줄 영상 파일을 지정할 수 있다. 영상의 썸네일 이미지를 추출할 수 있다. 영상 음성 파일을 추출해준다. 영상 파일 포맷을 변환해준다. 예를 들어, m2ts 포맷 영상 파일을 hsl, mp4 파일으로 변환해준다. 패키징 여러 디바이스 타입에서 영상파일을 사용할 수 있도록 영상 파일을 패키징을 한다. 접근 ..
동영상 플랫폼 이해하기 (1) - HLS 이번 포스팅에서는 스트리밍 동영상 플랫폼을 구성하기 위해 필요한 사전 지식을 정리하고자 합니다. HLS이란? HTTP으로 영상 스트리밍을 할 때 사용하는 프로토콜을 의미합니다. 이 프로토콜은 2009년에 애플에서 공개한 표준이며, 현재는 많은 플랫폼에서 HLS 프로토콜을 지원하고 활용하고 있습니다. HLS 특징 HLS 프로토콜을 사용하면 네트워크 상태에 따라 영상 화질을 선택할 수 있는 Adaptive Bitrate Streaming을 사용할 수 있습니다. 그리고 클라이언트에서 영상을 청크 단위로 쪼개서 다운받을 수 있고, 부분 재생을 할 수 있는 기능도 제공합니다. 이러한 특징 덕분에 사용자는 영상 재생 시, 전체 영상 파일을 다운받지 않아도 되게 되었습니다. 그리고 특정 재생 위치부터 영상을 보는 경..
(GraphQL) GraphQL 개념잡기 GraphQL이란 Facebook에서 만든 어플리케이션 레이어 쿼리 언어입니다. 레이어 쿼리 언어라니.. 좀 어렵게만 들리죠. 🙄 GraphQL도 기존 HTTP 통신과 동일합니다. 필요한 자원을 좀더 유연하게 요청하고, 응답해주는 HTTP 요청 방식 표준으로 이해하면 됩니다. REST API와 뭐가 다른거지? REST API에서는 여러개의 API Path으로 자원을 식별합니다. "/post/{PK}" 이런 방식으로 말이죠. 그리고 HTTP Method으로 API의 목적을 판단합니다. ( GET, POST, PUT, PATCH, DELETE ) 그러나 GraphQL은 자원별로 API Path를 만들지 않습니다. 보통 "/graphql/" path 하나로 여러개의 자원을 한번에 조회합니다. 필요한 자원 정보..
트위터 팔로워 타임라인 시스템 분석 트위터 팔로워 서비스 특징 트위터의 액티브 유저는 3억명이상이다. 초당 600개 이상의 트윗이 생성되고, 초당 60만건 이상의 트윗 조회가 발생하고 있다. 트위터 팔로워 시스템 고려사항 읽기 요청이 헤비하다. Eventually Consistent 특성이 있다. 약간의 딜레이를 허용한다. 데이터 저장소 비용을 최적화해야한다. 준비물 1. 장기 보관용 RDB 데이터베이스 2. 인메모리 캐시용 Redis 데이터 설계 MySQL InnoDB 유실되면 안되는 정보는 RDB에 저장한다. RDB에 저장되는 데이터는 회원 / 트윗 / 팔로워 테이블 3개이다. Redis Cache 트윗 조회 요청에 빠르게 응답하기 위해, 타임라인 정보는 캐시에 저장한다. 빠른 계산을 위하여, 타임라인 캐시는 사전에 집계해둔다. 모든 ..
(카오스 엔지니어링)카오스 몽키 카오스 몽키가 생긴 배경 => 넷플릭스에서 IDC에서 AWS으로 이관하면서 탄생했음. 2016년도에 릴리즈되었음카오스 몽키는 golang으로 만들어져있다. go가 설치되어있으면, go get으로 카오스몽키를 다운받을 수 있다. 카오스 몽키를 설치하려면 Spinnaker가 기본으로 설치되어있어야한다. 이게 있어야 몽키가 죽일 클러스터를 만들 수 있다. Spinnaker는 로드 밸런서, 서버 그룹 등등을 테스트 서버에 만들어준다. 카오스 몽키를 띄우려면 데이터베이스도 설치해야한다. 카오스 몽키를 사용하려면 설정 파일이 필요하다. 여기에는 카오스 몽키, 데이터베이스, 스피네이커 설정 정보가 들어간다. Kubernetes Helm은 쿠버네티스 차트를 관리하는 역할을 한다.
(Strangler Pattern/스트랭글러 패턴) 레거시 코드를 마이크로 서비스 아키텍처로 개선하기 Strangler Pattern모놀리틱 아키텍처로 된 시스템이 계속 자라나면, 더이상 관리할 수 없는 수준이 된다.그리고 아키텍처가 복잡해지거나, 비즈니스 로직이 파편화되면 코드를 관리하기 어려워진다. 그러다보면 배포하기도 까다로워지고, 배포가 무서워지기도 한다. 이럴 땐 버티거나, 서비스 아키텍처로 코드를 리팩토링해야한다. 서비스 아키텍처로 서비스를 한번에 옮기는 것은 리스크가 있다. 시스템은 정상적으로 돌아가면서, 점진적으로 서비스 아키텍처로 코드를 분리해나가는 디자인 패턴이 Strangler Pattern이다. 개선 방법1. 분리해내야하는 도메인을 Service Layer으로 리팩토링을 해야한다. 2. 그리고 분리해낸 도메인의 API가 호출되면, Proxy 단에서 라우팅을 분기처리해준다. 3. 신규..