System Design (8) 썸네일형 리스트형 Object-Oriented Design (개체 지향 디자인을 위한 체크리스트) ood 설명에 앞서서 내 생각을 말하자면.. 이 내용 역시 번역에 가까운 포스팅이고 당장 실제로 내가 겪은 개발 케이스는 아니다. 그럼에도 불구하고, 이런 글을 포스팅 하는 것은 끊임없이 시스템을 어떻게 잘 구축할 것인지에 대해 훈련이 되어 있어야 한다고 믿기 때문에 계속 포스팅을 하는 것이다. 전쟁에서 대규모 전투가 없더라도 그것을 가정하고 훈련을 하는 것처럼 시스템 디자인에 대한 생각들도 '훈련'을 스스로 해야 한다고 본다. 물론 운이 좋아서 내가 일하는 직장에서 시스템 디자인을 실험하기 좋은 트래픽과 환경, 그리고 프로젝트를 맡게 되면 가장 베트스겠지만, 돈을 받고 일하는 직장에선 그렇지 않을 확률이 꽤 크므로, 모의로 연습을 해나가자. 여러 시스템 디자인 관련 문제가 있을 때 다음과 같은 것들을 .. Instagram system design(generating news feed) 드디어 인스타그램을 시스템적으로 디자인해보는 케이스를 다뤄보게 되었다. 참고로 시스템 디자인 아이디어는 내 아이디어는 아니고, 기존의 레퍼런스를 잘 정리(?) 하면서 나의 학습을 위한 것이다. 우선 내가 아는 부분이 별로 없으니, 좋은 사례들을 학습하는 것이다. 인스타그램?(what is Instagram?) 다들 잘 아시리라 생각한다. 2번 아래 항목을 참고해서 풀자. 요구사항과 시스템의 목표(Requirements and Goals of the System) Functional Requirements Photo 업로드, 다운로드, 뷰 Photo/video title로 검색을 할 수 있게 유저들이 다른 유저들을 팔로우할 수 있게 시스템은 해당 유저가 팔로우하고 있는 모든 사람들의 top photo로 구.. Tiny URL 설계 레퍼런스 Tiny url 로 기존 url을 짧게 디자인하는 시스템을 만든다고 생각해보자. 주로, 카카오톡의 오픈 채팅 링크 생성 등이 tiny url로 shortening 되는 시스템이라고 볼 수 있다. 각설하고, 아래와 같은 flow로 시스템 디자인에 대한 생각을 해보자. 왜 우리가 URL Shortening 이 필요할까? (Why do we need it?) URL shortening은 long URLs 의 alias 를 만들기 위해 사용된다. Short link라고도 불리움.. short link를 타고 가면, original link로 redirect 된다. URL Shortening 을 쓰는 이유는, 우선 짧으니까 display, print, message 등에서 공간을 아낄 수 있음. 그리고 또한, 디.. Basic Steps to System Design for Real Service 시스템 디자인은 실제 서비스를 개발로 옮길 때 있어서 매우 중요함. 왜냐하면, 같은 기능을 구현하더라도, 이게 얼마나 많은 유저가 사용하고, 어떻게 확장을 해나가야하는 것 등등 까지 고려를 한다면, 같은 코드라도 고려할 것들이 많아진다. 이를 해결하기 위한 것이 시스템 디자인이고, 특히 백엔드 개발이라면 시스템 디자인에 대해 생각하고 공부해야 되는 것이다. 아래는 시스템 디자인을 하기 위한 기본 스텝들이다. Requirement Clarifications(요구 사항을 명확히 하기) 시스템 디자인에 대해 생각하기 앞서, 최대한 효과적인 질문을 통해 우리가 풀고자 하는 문제의 exact scope 을 명확히 잡는 것은 매우 중요함 가령 트위터 같은 서비스를 시스템 디자인한다고 떠올려 보자. 그럼 아래와 같은.. Data Partitioning Basics Data Partitioning 은 db를 많은 작은 파트로 쪼개는 기술이다. 이로써 manageability, 퍼포먼스, 가용성, 그리고, 어플리케이션의 로드밸런싱을 개선시켜준다. Partitioning Method 의 종류 Horizontal Partitioning: put diff rows into diff tables. 다른 row 들을 다른 테이블로 놓는다. 즉, 테이블에 row가 적재되는 매트릭스를 생각할 때, 이를 가로로 자른다고 생각하면 된다. 이러한 파티셔닝은 또한 Data Sharding이라고도 얘기함 단점으로는 이러한 파티셔닝을 하기 위한 범위를 신중하게 설정하지 않으면, 파티셔닝 스키마는 언밸런스한 서버가 될 것이다.(즉, 균일하게 쪼개지지 않았다는 얘기다.) Vertical Par.. Cache ? / Cache Invalidation 앞전에 얘기한 LB는 계속적으로 증가하는 서버 수가 있을 때, scale Horizontally 을 잘 할 수 있도록 도와주는 역할을 한다. 그런데, Caching은 너가 이미 갖고 있는 자원 뿐 아니라 달성할 수 없는 요구사항도 달성하게 만들어주는 역할을 할 것이다.. (달성할 수 없는 요구사항도 달성하게 만들어주는건 좀 더 설명하겠다.) Caching은 자주 접근하는 데이터를 미리 엑세스가 빠른곳에 배치하여, 빠르게 로드하는 스킬이다. 즉, 캐싱은 Locality of reference principle 의 이점을 가진다. 이렇게 되면, 아랫단까지 내려갈 거 없이 앞단에서 데이터를 빠르게 가져와 처리할 수 있다. Application Server Cache Request layer 노드 위에 직접 캐.. Load Balancer(로드밸런서)와 LB 알고리즘 간략 정리 애플리케이션을 위한 서버가 여러대 있다고 생각해보자. 무조건 서버만 많다고 성능이 극대화되는 것이 아니고, 이를 잘 분산시켜 서버에 분배해야 성능이 극대화 될 것이다. 이런 서버들에게 요청들을 밸런스있게 분산시켜주는 역할을 하는 중간자가 필요할텐데, 이게 로드밸런서다. LB는 어떤 분산 시스템에서든 또다른 매우 중요한 컴포넌트임 트래픽을 여러 서버로 분산시켜줘서 responsiveness 와 db와 애플리케이션의 가용성을 올려주는 역할을 한다. 또한, LB는 요청들을 분산시키면서, 모든 자원들의 상태를 계속 트래킹 한다. 예를 들면, 어떤 서버가 지금 요청 처리를 못하는 상태에 있으면, LB에서 이 상태를 알아둬서 해당 서버로의 트래픽 분산을 막을 수 있다. LB는 크게 3가지 위치에 둠 유저와 웹서버 .. 분산 시스템의 특징 5가지 글을 쓰기에 앞서, 시스템 디자인 카테고리를 새로 만든 이유를 얘기하겠다. 누군가 시스템 디자인에 대한 공부가 필요하다는 얘기를 듣고, 시스템 디자인 인터뷰에 대한 공부를 하게 되었는데, 사실 이게 인터뷰를 위한 것이라기보다는 백엔드 개발자라면 알아야 할 덕목에 가깝다고 느꼈다. 완벽한 정리는 아니겠지만, 핵심을 잘 담고자 노력할 예정이니 봐주길 바란다. 먼저 시스템 디자인의 기본을 보자. 만약 거대한 시스템을 디자인한다고 할 때 우리는 아래 3가지를 고려해야 한다. 어떤 다른 아키텍쳐적인 파트들이 사용될 수 있을까? 이러한 아키텍쳐적인 파트들이 어떻게 상호작용을 하며 작동할까? 이러한 파트들을 어떻게 하면 가장 최고로 잘 이용할 수 있을까? Trade-off 는 어떻게 될까? 즉, 위의 3가지 얘기는,.. 이전 1 다음