Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/donnemartin/system-design-primer
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
https://github.com/donnemartin/system-design-primer
design design-patterns design-system development interview interview-practice interview-questions programming python system web web-application webapp
Last synced: about 1 month ago
JSON representation
Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards.
- Host: GitHub
- URL: https://github.com/donnemartin/system-design-primer
- Owner: donnemartin
- License: other
- Created: 2017-02-26T16:15:28.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2024-02-22T15:23:46.000Z (4 months ago)
- Last Synced: 2024-02-22T17:31:22.799Z (4 months ago)
- Topics: design, design-patterns, design-system, development, interview, interview-practice, interview-questions, programming, python, system, web, web-application, webapp
- Language: Python
- Homepage:
- Size: 10.7 MB
- Stars: 247,136
- Watchers: 6,567
- Forks: 42,426
- Open Issues: 417
-
Metadata Files:
- Readme: README-ja.md
- Contributing: CONTRIBUTING.md
- License: LICENSE.txt
Lists
- awesome-bytecode - SystemDesignPrimer
- links - System Design Primer
- awesome-distributed-systems - system-design-primer
- awesome-list - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 141555 | (Python)
- awesome-learning-collections - System Design Primer - *Learn how to design large-scale systems. Prep for the system design interview.* (Software Development)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- awesome-engineering-management - System design primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | (Tools / Mentoring)
- resources - The System Design Primer
- Product-Management-and-Leadership - GitHub repo as your Bible or Quran or Bhagavad Gita
- alexandria - Learn how to design large-scale systems
- Awesome-List - System Design Primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (ð Books)
- awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- be-a-professional-programmer - system-design-primer
- Resources - Learn how to design large-scale systems
- awesome-hacktoberfest - Complete DBMS Guide, From Zero to Hero
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 230689 | (Python)
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-articles - System design resource
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 202678 | (Python)
- awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-learning-resources - System Design Primer
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- pure-awesomeness - system-design-primer
- awesome-links - system-design-primer - design large-scale systems, by donnemartin (architecture)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- mobile-awesome - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Interviews / Multiplatform samples)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-github-repos - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-cloud-architect - System Design Primer - learn how to design large-scale systems. (System Design)
- my-awesome - The System Design Primer
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-links - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-list - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- principe-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-list - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- Absolute-Awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- awesome-robotics-system-design - The System Design Primer
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-projects - system design primer - scale systems. Prep for the system design interview. Includes Anki flashcards. (Uncategorized / Uncategorized)
- awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-repositories - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- guia-ackercode - system-design-primer
- awesome-repos - System Design Primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | [CC-BY-SA-4.0](https://github.com/donnemartin/system-design-primer/blob/master/LICENSE.txt) | (Index / System Design)
- awesome-starred - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars-coconut - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome - 倧系ç»è®Ÿè®¡
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 191325 | (Python)
- awesome-learning - donnemartin/system-design-primer
- awesome-laravel-interviews - System Designs
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-software-engineering - System Design Primer - scale systems. (System)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-list - The Systems Design Primer
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 202185 | (Python)
- awesome-lists - `system-design-primer`
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- awesome_learning_from_github - system-design-primer
- my-awesome-starred - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome_readings - Donne Martin - The System Design Primer
- awesome-software-architecture - https://github.com/donnemartin/system-design-primer - Donne Martin (Distributed Systems Design / Resources)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- reading-material - Learn how to design large-scale systems
- Starred-Repo - System Design Interview
- awesome-repos-and-resources - System Design Primer by donnemartin
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-computer-science-websites - System Design Primer
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-github-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-wiki-books - donnemartin/system-design-primer
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-faang-interview - System design interview
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- my-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | (Python)
- awesome-coding - System-design-primer
- awesome-tech-resources - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. (Awesome Github Repositorys)
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- awesome-links - System Design Primer
- awesome-software-quality - Learn how to design large-scale systems
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome - System design primer - scale systems (Learning tech sites)
- awesome-starts - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- awesome-resources - The System Design Primer
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 146459 | (Python)
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-github - ç³»ç»è®Ÿè®¡æå
- awesome-tools - https://github.com/donnemartin/system-design-primer - Learn how to design large-scale systems (Resources ## / Email ###)
- awesome-tools - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Uncategorized / Uncategorized)
- xiao-awesome - system-design-primer
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 183729 | (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- docsify-awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome - The System Design Primer - learn how to design large-scale systems. (Architecture Design)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- artsz-awesome - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-ccamel - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 88568 | (Python)
- awesome-starts - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-cto - System Design Primer - Learn how to design large-scale systems - scale systems. Prep for the system design interview. Includes Anki flashcards. (Table of Contents / Distributed Systems)
- my-awesome - donnemartin / system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Learn/Book/List)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260615 | (Python)
- awesome-from-stars - donnemartin/system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. (HarmonyOS / Windows Manager)
- awesome - The System Design Primer
- stars - donnemartin/system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. (HarmonyOS / Windows Manager)
- starred-awesome - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-projects - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-python-again -
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 109172 | (Python)
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- Interview-Preparation -
- awesome-design-patterns - system-design-primer - Design large-scale systems. (General Architecture)
- another-awesome-list - github
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260207 | (Python)
- my-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-sre-cheatsheets - Systems Design Primer
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 259800 | (Python)
- awesome_dotnet_cloud_ecosystem - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards
- awesome - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-interview - system-design-primer
- every-programmer-should-know - System Design: A Primer
- github-FE-project - system-design-primer
- awesome-openminds-team - System Design Primer
- awesome-rainmana - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260677 | (Python)
- awesome-awesome - ç³»ç»è®Ÿè®¡
- awesome-stars - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 259392 | (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260107 | (Python)
- lousy-list - System Design Primer
- Awesome-GithubRepos - System design primer - scale systems. Prep for the system design interview. Includes Anki flashcards. (This repo contains the list of awesome repo present in github. A tribute to the freely available awesome educational resources.)
- awesome - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | 14 hours ago | ([GitHub](#gitHub))
- stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome - system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-list - The System Design Primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Programming Language Tutorials / For Scala)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260544 | (Python)
- awesome-computer-science - System design concepts explanation for interview preparation (By Donne Martin on Github)
- Awesome-GitHub-Repo - system-design-primer - åž®å©äœ åŠä¹ åŠäœè®Ÿè®¡å€§åç³»ç»ã[<img src="https://tva1.sinaimg.cn/large/008i3skNly1gxlhtmg11mj305k05k746.jpg" alt="埮信" width="18px" height="18px" />](https://mp.weixin.qq.com/s?__biz=MzUxNjg4NDEzNA%3D%3D&chksm=f9a2257cced5ac6ae928edb792014120ea367f88402af7d363580f3d44fcde8da3e864bf39f3&idx=1&mid=2247497397&scene=21&sn=8416e22549c14eaf4688842d139640ba#wechat_redirect) (åŠä¹ èµæº / åŠä¹ 项ç®)
- jimsghstars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-repositories - System Design Primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | [CC-BY-SA-4.0](https://github.com/donnemartin/system-design-primer/blob/master/LICENSE.txt) | (â¶ïž Content / System Design)
- gitcat - system-design-primer
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 259908 | (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260544 | (Python)
- awesome-stars - donnemartin/system-design-primer - `â 260771` Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (design)
- awesome-bookmarks - [â-â
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260873 | (Python)
- my-awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260611 | (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (webapp)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 259932 | (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260680 | (Python)
- awesome-huzhi - system-design-primer - 讟计å¯æ©å±ç³»ç» (计ç®æºåºç¡)
- awesome-stars-webVueBlog - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python / è¿ç»Ž\&DevOps)
- awesome-fr - system-design-primer
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260542 | (Python)
- awesome-stars - donnemartin/system-design-primer - Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. (Python)
- awesome-stars - system-design-primer - scale systems. Prep for the system design interview. Includes Anki flashcards. | donnemartin | 260850 | (Python)
- my-awesome-learning-resources - System design primer ð¬
README
*[English](README.md) â [æ¥æ¬èª](README-ja.md) â [ç®äœäžæ](README-zh-Hans.md) â [ç¹é«äžæ](README-zh-TW.md) | [اÙعÙرÙØšÙÙÙÙØ©â](https://github.com/donnemartin/system-design-primer/issues/170) â [àŠ¬àŠŸàŠàŠ²àŠŸ](https://github.com/donnemartin/system-design-primer/issues/220) â [Português do Brasil](https://github.com/donnemartin/system-design-primer/issues/40) â [Deutsch](https://github.com/donnemartin/system-design-primer/issues/186) â [ελληΜικά](https://github.com/donnemartin/system-design-primer/issues/130) â [×¢×ך×ת](https://github.com/donnemartin/system-design-primer/issues/272) â [Italiano](https://github.com/donnemartin/system-design-primer/issues/104) â [íêµìŽ](https://github.com/donnemartin/system-design-primer/issues/102) â [ÙارسÛ](https://github.com/donnemartin/system-design-primer/issues/110) â [Polski](https://github.com/donnemartin/system-design-primer/issues/68) â [ÑÑÑÑкОй ÑзÑк](https://github.com/donnemartin/system-design-primer/issues/87) â [Español](https://github.com/donnemartin/system-design-primer/issues/136) â [àž àž²àž©àž²à¹àžàž¢](https://github.com/donnemartin/system-design-primer/issues/187) â [TÃŒrkçe](https://github.com/donnemartin/system-design-primer/issues/39) â [tiếng Viá»t](https://github.com/donnemartin/system-design-primer/issues/127) â [Français](https://github.com/donnemartin/system-design-primer/issues/250) | [Add Translation](https://github.com/donnemartin/system-design-primer/issues/28)*
# ã·ã¹ãã èšèšå ¥é
## åæ©ã»ç®ç
> 倧èŠæš¡ã·ã¹ãã ã®ã·ã¹ãã èšèšãåŠã¶
>
> ã·ã¹ãã èšèšé¢æ¥èª²é¡ã«åãã### 倧èŠæš¡ã·ã¹ãã ã®èšèšãåŠã¶
ã¹ã±ãŒã©ãã«ãªã·ã¹ãã ã®ã·ã¹ãã èšèšãåŠã¶ããšã¯ãããè¯ããšã³ãžãã¢ã«ãªãããšã«è³ããã§ãããã
ã·ã¹ãã èšèšã¯ãšãŠãåºç¯ãªãããã¯ãå«ã¿ãŸããã·ã¹ãã èšèšåçã«ã€ããŠã¯ **ã€ã³ã¿ãŒãããäžã«ã¯èšå€§ãªéã®æç®ãæ£ãã°ã£ãŠããŸãã**
ãã®ãªããžããªã¯å€§èŠæš¡ã·ã¹ãã æ§ç¯ã«å¿ èŠãªç¥èãåŠã¶ããšãã§ãã **æç®ãªã¹ããäœç³»çã«ãŸãšãããã®** ã§ãã
### ãªãŒãã³ãœãŒã¹ã³ãã¥ããã£ããåŠã¶
ãã®ãããžã§ã¯ãã¯ãããããããã£ãšæŽæ°ãããŠãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®åæ段éã«ãããŸããã
[Contributions](#contributing) ã¯å€§æè¿ã§ãïŒ
### ã·ã¹ãã èšèšé¢æ¥èª²é¡ã«åãã
ã³ãŒãæè¡é¢æ¥ã«å ããŠãã·ã¹ãã èšèšã«é¢ããç¥èã¯ãå€ãã®ããã¯äŒæ¥ã«ããã **æè¡æ¡çšé¢æ¥ããã»ã¹** 㧠**å¿ èŠäžå¯æ¬ ãªèŠçŽ ** ã§ãã
**ã·ã¹ãã èšèšé¢æ¥ã§ã®é »åºè³ªåã«åã**ãèªåã®è§£çãš*æš¡ç¯è§£ç*:ãã£ã¹ã«ãã·ã§ã³ãã³ãŒããããŠå³è¡šãªã©ã*æ¯èŒ*ããŠåŠã³ãŸãããã
é¢æ¥æºåã«åœ¹ç«ã€ãã®ä»ã®ãããã¯:
* [åŠç¿æé](#åŠç¿æé)
* [ã·ã¹ãã èšèšé¢æ¥èª²é¡ã«ã©ã®ããã«æºåããã](#ã·ã¹ãã èšèšé¢æ¥ã«ã©ã®ããã«ããŠèšãã°ããã)
* [ã·ã¹ãã èšèšèª²é¡äŸ **ãšãã®è§£ç**](#ã·ã¹ãã èšèšèª²é¡äŸãšãã®è§£ç)
* [ãªããžã§ã¯ãæåèšèšèª²é¡äŸã **ãšãã®è§£ç**](#ãªããžã§ã¯ãæåèšèšåé¡ãšè§£ç)
* [ãã®ä»ã®ã·ã¹ãã èšèšé¢æ¥èª²é¡äŸ](#ä»ã®ã·ã¹ãã èšèšé¢æ¥äŸé¡)## æèšã«ãŒã
ãã®[Ankiçšãã©ãã·ã¥ã«ãŒãããã](https://apps.ankiweb.net/) ã¯ãééå埩ã掻çšããŠãã·ã¹ãã èšèšã®ããŒã³ã³ã»ããã®åŠç¿ãæ¯æŽããŸãã
* [ã·ã¹ãã èšèšããã](resources/flash_cards/System%20Design.apkg)
* [ã·ã¹ãã èšèšç·Žç¿èª²é¡ããã](resources/flash_cards/System%20Design%20Exercises.apkg)
* [ãªããžã§ã¯ãæåç·Žç¿èª²é¡ããã](resources/flash_cards/OO%20Design.apkg)å€åºå ã移åäžã®å匷ã«åœ¹ç«ã€ã§ãããã
### ã³ãŒãã£ã³ã°æè¡èª²é¡çšã®åé¡: ç·Žç¿çšã€ã³ã¿ã©ã¯ãã£ãã¢ããªã±ãŒã·ã§ã³
ã³ãŒãæè¡é¢æ¥çšã®åé¡ãæ¢ããŠããå Žåã¯[**ãã¡ã**](https://github.com/donnemartin/interactive-coding-challenges)
å§åŠ¹ãªããžããªã® [**Interactive Coding Challenges**](https://github.com/donnemartin/interactive-coding-challenges)ãèŠãŠã¿ãŠãã ãããè¿œå ã®æèšãããã«ãŒããå ¥ã£ãŠããŸãã
* [Coding deck](https://github.com/donnemartin/interactive-coding-challenges/tree/master/anki_cards/Coding.apkg)
## ã³ã³ããªãã¥ãŒã
> ã³ãã¥ããã£ããåŠã¶
ãã«ãªã¯ãšã¹ãçã®è²¢ç®ã¯ç©æ¥µçã«ãé¡ãããŸã:
* ãšã©ãŒä¿®æ£
* ã»ã¯ã·ã§ã³å 容æ¹å
* æ°èŠã»ã¯ã·ã§ã³è¿œå
* [翻蚳ãã](https://github.com/donnemartin/system-design-primer/issues/28)çŸåšãå 容ã®æ¹åãå¿ èŠãªäœæ¥äžã®ã³ã³ãã³ãã¯[ãã¡ã](#é²è¡äžã®äœæ¥)ã§ãã
ã³ã³ããªãã¥ãŒãã®åã«[Contributing Guidelines](CONTRIBUTING.md)ãèªã¿ãŸãããã
## ã·ã¹ãã èšèšç®æ¬¡
> è³åŠãå«ããæ§ã ãªã·ã¹ãã èšèšã®åãããã¯ã®æŠèŠã **å šãŠã¯ãã¬ãŒããªãã®é¢ä¿ã«ãããŸãã**
>
> ããããã®ã»ã¯ã·ã§ã³ã¯ããåŠã³ãæ·±ãããããªä»ã®æç®ãžã®ãªã³ã¯ã貌ãããŠããŸãã
* [ã·ã¹ãã èšèšãããã¯: ãŸãã¯ãããã](#ã·ã¹ãã èšèšãããã¯ã¹-ãŸãã¯ãããã)
* [Step 1: ã¹ã±ãŒã©ããªãã£ã«é¢ããåç»ãèŠã](#ã¹ããã-1-ã¹ã±ãŒã©ããªãã£ã«é¢ããåç»ã芳ãŠåŸ©ç¿ãã)
* [Step 2: ã¹ã±ãŒã©ããªãã£ã«é¢ããèšäºãèªã](#ã¹ããã-2-ã¹ã±ãŒã©ããªãã£ã«é¢ããè³æãèªãã§åŸ©ç¿ãã)
* [次ã®ã¹ããã](#次ã®ã¹ããã)
* [ããã©ãŒãã³ã¹ vs ã¹ã±ãŒã©ããªãã£](#ããã©ãŒãã³ã¹-vs-ã¹ã±ãŒã©ããªãã£)
* [ã¬ã€ãã³ã·ãŒ vs ã¹ã«ãŒããã](#ã¬ã€ãã³ã·ãŒ-vs-ã¹ã«ãŒããã)
* [å¯çšæ§ vs äžè²«æ§](#å¯çšæ§-vs-äžè²«æ§)
* [CAPçè«](#cap-çè«)
* [CP - äžè²«æ§(consistency)ãšåå²æ§(partition)èæ§](#cp---äžè²«æ§ãšåæèæ§consistency-and-partition-tolerance)
* [AP - å¯çšæ§(availability)ãšåå²æ§(partition)èæ§](#ap---å¯çšæ§ãšåæèæ§availability-and-partition-tolerance)
* [äžè²«æ§ ãã¿ãŒã³](#äžè²«æ§ãã¿ãŒã³)
* [匱ãäžè²«æ§](#匱ãäžè²«æ§)
* [çµææŽåæ§](#çµææŽåæ§)
* [匷ãäžè²«æ§](#匷ãäžè²«æ§)
* [å¯çšæ§ ãã¿ãŒã³](#å¯çšæ§ãã¿ãŒã³)
* [ãã§ã€ã«ãªãŒããŒ](#ãã§ã€ã«ãªãŒããŒ)
* [ã¬ããªã±ãŒã·ã§ã³](#ã¬ããªã±ãŒã·ã§ã³)
* [ãã¡ã€ã³ããŒã ã·ã¹ãã (DNS)](#ãã¡ã€ã³ããŒã ã·ã¹ãã )
* [ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯(CDN)](#ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯content-delivery-network)
* [ããã·ã¥CDN](#ããã·ã¥cdn)
* [ãã«CDN](#ãã«cdn)
* [ããŒããã©ã³ãµãŒ](#ããŒããã©ã³ãµãŒ)
* [ã¢ã¯ãã£ã/ããã·ãæ§æ](#ã¢ã¯ãã£ãããã·ã)
* [ã¢ã¯ãã£ã/ã¢ã¯ãã£ãæ§æ](#ã¢ã¯ãã£ãã¢ã¯ãã£ã)
* [Layer 4 ããŒããã©ã³ã·ã³ã°](#layer-4-ããŒããã©ã³ã·ã³ã°)
* [Layer 7 ããŒããã©ã³ã·ã³ã°](#layer-7-ããŒããã©ã³ã·ã³ã°)
* [æ°Žå¹³ã¹ã±ãŒãªã³ã°](#æ°Žå¹³ã¹ã±ãŒãªã³ã°)
* [ãªããŒã¹ãããã· (WEBãµãŒããŒ)](#ãªããŒã¹ãããã·webãµãŒããŒ)
* [ããŒããã©ã³ãµãŒ vs ãªããŒã¹ãããã·](#ããŒããã©ã³ãµãŒ-vs-ãªããŒã¹ãããã·)
* [ã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒ](#ã¢ããªã±ãŒã·ã§ã³å±€)
* [ãã€ã¯ããµãŒãã¹](#ãã€ã¯ããµãŒãã¹)
* [ãµãŒãã¹ãã£ã¹ã«ããªãŒ](#service-discovery)
* [ããŒã¿ããŒã¹](#ããŒã¿ããŒã¹)
* [ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãããžã¡ã³ãã·ã¹ãã (RDBMS)](#ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãããžã¡ã³ãã·ã¹ãã -rdbms)
* [ãã¹ã¿ãŒ/ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³](#ãã¹ã¿ãŒã¹ã¬ãŒã-ã¬ããªã±ãŒã·ã§ã³)
* [ãã¹ã¿ãŒ/ãã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³](#ãã¹ã¿ãŒãã¹ã¿ãŒ-ã¬ããªã±ãŒã·ã§ã³)
* [ãã§ãã¬ãŒã·ã§ã³](#federation)
* [ã·ã£ãŒãã£ã³ã°](#ã·ã£ãŒãã£ã³ã°)
* [ãããŒãã©ã€ãŒãŒã·ã§ã³](#éæ£èŠå)
* [SQL ãã¥ãŒãã³ã°](#sqlãã¥ãŒãã³ã°)
* [NoSQL](#nosql)
* [ããŒ/ããªã¥ãŒã¹ãã¢](#ããŒããªã¥ãŒã¹ãã¢)
* [ããã¥ã¡ã³ãã¹ãã¢](#ããã¥ã¡ã³ãã¹ãã¢)
* [ã¯ã€ãã«ã©ã ã¹ãã¢](#ã¯ã€ãã«ã©ã ã¹ãã¢)
* [ã°ã©ã ããŒã¿ããŒã¹](#ã°ã©ãããŒã¿ããŒã¹)
* [SQL or NoSQL](#sqlãnosqlã)
* [ãã£ãã·ã¥](#ãã£ãã·ã¥)
* [ã¯ã©ã€ã¢ã³ããã£ãã·ã³ã°](#ã¯ã©ã€ã¢ã³ããã£ãã·ã³ã°)
* [CDNãã£ãã·ã³ã°](#cdnãã£ãã·ã³ã°)
* [WebãµãŒããŒãã£ãã·ã³ã°](#webãµãŒããŒãã£ãã·ã³ã°)
* [ããŒã¿ããŒã¹ãã£ãã·ã³ã°](#ããŒã¿ããŒã¹ãã£ãã·ã³ã°)
* [ã¢ããªã±ãŒã·ã§ã³ãã£ãã·ã³ã°](#ã¢ããªã±ãŒã·ã§ã³ãã£ãã·ã³ã°)
* [ããŒã¿ããŒã¹ã¯ãšãªã¬ãã«ã§ãã£ãã·ã³ã°ãã](#ããŒã¿ããŒã¹ã¯ãšãªã¬ãã«ã§ã®ãã£ãã·ã³ã°)
* [ãªããžã§ã¯ãã¬ãã«ã§ãã£ãã·ã³ã°ãã](#ãªããžã§ã¯ãã¬ãã«ã§ã®ãã£ãã·ã³ã°)
* [ãã€ãã£ãã·ã¥ãæŽæ°ããã®ã](#ãã€ãã£ãã·ã¥ãæŽæ°ããã)
* [ãã£ãã·ã¥ã¢ãµã€ã](#ãã£ãã·ã¥ã¢ãµã€ã)
* [ã©ã€ãã¹ã«ãŒ](#ã©ã€ãã¹ã«ãŒ)
* [ã©ã€ãããã€ã³ã (ã©ã€ãããã¯)](#ã©ã€ãããã€ã³ã-ã©ã€ãããã¯)
* [ãªãã¬ãã·ã¥ã¢ããã](#ãªãã¬ãã·ã¥ã¢ããã)
* [éåæåŠç](#éåæåŠç)
* [ã¡ãã»ãŒãžãã¥ãŒ](#ã¡ãã»ãŒãžãã¥ãŒ)
* [ã¿ã¹ã¯ãã¥ãŒ](#ã¿ã¹ã¯ãã¥ãŒ)
* [ããã¯ãã¬ãã·ã£ãŒ](#ããã¯ãã¬ãã·ã£ãŒ)
* [éä¿¡](#éä¿¡)
* [äŒéå¶åŸ¡ãããã³ã« (TCP)](#äŒéå¶åŸ¡ãããã³ã«-tcp)
* [ãŠãŒã¶ããŒã¿ã°ã©ã ãããã³ã« (UDP)](#ãŠãŒã¶ããŒã¿ã°ã©ã ãããã³ã«-udp)
* [é éæç¶åŒåº (RPC)](#é éæç¶åŒåº-rpc)
* [Representational state transfer (REST)](#representational-state-transfer-rest)
* [ã»ãã¥ãªãã£](#ã»ãã¥ãªãã£)
* [è£éº](#è£éº)
* [2ã®ä¹æ°è¡š](#2ã®ä¹æ°è¡š)
* [å šãŠã®ããã°ã©ããŒãç¥ãã¹ãã¬ã€ãã³ã·ãŒå€](#å šãŠã®ããã°ã©ããŒãç¥ãã¹ãã¬ã€ãã³ã·ãŒå€)
* [ä»ã®ã·ã¹ãã èšèšé¢æ¥äŸé¡](#ä»ã®ã·ã¹ãã èšèšé¢æ¥äŸé¡)
* [å®äžçã§ã®ã¢ãŒããã¯ãã£](#å®äžçã®ã¢ãŒããã¯ãã£)
* [åäŒæ¥ã®ã¢ãŒããã¯ãã£](#åäŒæ¥ã®ã¢ãŒããã¯ãã£)
* [äŒæ¥ã®ãšã³ãžãã¢ããã°](#äŒæ¥ã®ãšã³ãžãã¢ããã°)
* [äœæ¥äž](#é²è¡äžã®äœæ¥)
* [ã¯ã¬ãžãã](#ã¯ã¬ãžãã)
* [é£çµ¡æ å ±](#contact-info)
* [ã©ã€ã»ã³ã¹](#license)## åŠç¿æé
> åŠç¿ã¹ãã³ã«å¿ããŠã¿ãã¹ããããã¯ã¹ (short, medium, long)
![Imgur](images/OfVllex.png)
**Q: é¢æ¥ã®ããã«ã¯ãããã«ãããã®ãã¹ãŠããããªããšãããªãã®ã§ããããïŒ**
**A: ãããããã«ãããã¹ãŠãããå¿ èŠã¯ãããŸããã**
é¢æ¥ã§äœãèããããã¯ä»¥äžã®æ¡ä»¶ã«ãã£ãŠå€ãã£ãŠããŸã:
* ã©ãã ãã®æè¡çµéšãããã
* ããªãã®æè¡èæ¯ãäœã§ããã
* ã©ã®ããžã·ã§ã³ã®ããã«é¢æ¥ãåããŠããã
* ã©ã®äŒæ¥ã®é¢æ¥ãåããŠããã
* éããçµéšã®ããåè£è ã¯äžè¬çã«ã·ã¹ãã èšèšã«ã€ããŠããæ·±ãç¥èãæããŠããããšãèŠæ±ãããã§ããããã·ã¹ãã ã¢ãŒããã¯ããããŒã ãªãŒããŒã¯åã¡ã³ããŒã®æã€ãããªç¥èããã¯æ·±ãèŠèãæã£ãŠããã¹ãã§ããããäžæµããã¯äŒæ¥ã§ã¯è€æ°åã®èšèšé¢æ¥ã課ãããããšãå€ãã§ãã
ãŸãã¯åºãå§ããŠãããããããã€ãã®åéã«çµã£ãŠæ·±ããŠããã®ãããã§ããããæ§ã ãªã·ã¹ãã èšèšã®ãããã¯ã«ã€ããŠå°ããã€ç¥ã£ãŠããããšã¯ããããšã§ãã以äžã®åŠç¿ã¬ã€ããèªåã®åŠç¿ã«åœãŠãããæéãæè¡çµéšãã©ã®è·äœãã©ã®äŒç€Ÿã«å¿åããŠããããªã©ãå å³ããŠèªåçšã«èª¿æŽããŠäœ¿ããšããã§ãããã
* **çæé** - **å¹ åºã** ã·ã¹ãã èšèšãããã¯ãåŠã¶ã**ããã€ãã®** é¢æ¥èª²é¡ã解ãããšã§å¯Ÿçããã
* **äžæé** - **å¹ åºã** ãã㊠**ãããªãã«æ·±ã**ã·ã¹ãã èšèšãããã¯ãåŠã¶ã**å€ãã®** é¢æ¥èª²é¡ã解ãããšã§å¯Ÿçããã
* **é·æé** - **å¹ åºã** ãã㊠**ãã£ãšæ·±ã**ã·ã¹ãã èšèšãããã¯ãåŠã¶ã**ã»ãŒå šãŠã®** é¢æ¥èª²é¡ã解ãããšã§å¯Ÿçããã| | çæé | äžæé | é·æé |
|---|---|---|---|
| [ã·ã¹ãã èšèšãããã¯](#ã·ã¹ãã èšèšç®æ¬¡) ãèªã¿ãã·ã¹ãã åäœæ©åºã«ã€ããŠåºãç¥ã | :+1: | :+1: | :+1: |
| 次ã®ãªã³ã¯å ã®ããã€ãã®ããŒãžãèªã㧠[åäŒæ¥ã®ãšã³ãžãã¢ãªã³ã°ããã°](#äŒæ¥ã®ãšã³ãžãã¢ããã°) å¿åããäŒç€Ÿã«ã€ããŠç¥ã | :+1: | :+1: | :+1: |
| 次ã®ãªã³ã¯å ã®ããã€ãã®ããŒãžãèªã [å®äžçã§ã®ã¢ãŒããã¯ãã£](#å®äžçã®ã¢ãŒããã¯ãã£) | :+1: | :+1: | :+1: |
| 埩ç¿ãã [ã·ã¹ãã èšèšé¢æ¥èª²é¡ã«ã©ã®ããã«æºåããã](#ã·ã¹ãã èšèšé¢æ¥ã«ã©ã®ããã«ããŠèšãã°ããã) | :+1: | :+1: | :+1: |
| ãšããããäžåšãã [ã·ã¹ãã èšèšèª²é¡äŸ](#ã·ã¹ãã èšèšèª²é¡äŸãšãã®è§£ç) | Some | Many | Most |
| ãšããããäžåšãã [ãªããžã§ã¯ãæåèšèšåé¡ãšè§£ç](#ãªããžã§ã¯ãæåèšèšåé¡ãšè§£ç) | Some | Many | Most |
| 埩ç¿ãã [ãã®ä»ã·ã¹ãã èšèšé¢æ¥ã§ã®è³ªåäŸ](#ä»ã®ã·ã¹ãã èšèšé¢æ¥äŸé¡) | Some | Many | Most |## ã·ã¹ãã èšèšé¢æ¥ã«ã©ã®ããã«ããŠèšãã°ããã
> ã·ã¹ãã èšèšé¢æ¥è©Šéšåé¡ã«ã©ã®ããã«åãçµãã
ã·ã¹ãã èšèšé¢æ¥ã¯ **open-ended conversation(Yes/Noã§ã¯çããããªãå£é 質å)ã§ã**ã èªåã§äŒè©±ãçµã¿ç«ãŠãããšãæ±ããããŸãã
以äžã®ã¹ãããã«åŸã£ãŠè°è«ãçµã¿ç«ãŠãããšãã§ããã§ãããããã®éçšã確ããªãã®ã«ããããã«ã次ã®ã»ã¯ã·ã§ã³[ã·ã¹ãã èšèšèª²é¡äŸãšãã®è§£ç](#system-design-interview-questions-with-solutions) ã以äžã®æéã«åŸã£ãŠèªã¿èŸŒããšããã§ãããã
### ã¹ããã 1: ãã®ã·ã¹ãã 䜿çšäŸã®æŠèŠãå¶çŽãæšèšå€çãèãåºãããŸãšãã
ã·ã¹ãã ä»æ§ã®èŠæ±äºé ãèãåºããåé¡ç®æãç¹å®ããŸãããã䜿çšäŸãšå¶çŽãæ確ã«ããããã®è³ªåãæããããŸããããèŠæ±ããæšèšå€ã«ã€ããŠãè°è«ããŠãããŸãããã
* 誰ããã®ãµãŒãã¹ã䜿ãã®ãïŒ
* ã©ã®ããã«äœ¿ãã®ãïŒ
* äœäººã®ãŠãŒã¶ãŒãããã®ãïŒ
* ã·ã¹ãã ã¯ã©ã®ãããªæ©èœãæããã®ãïŒ
* ã·ã¹ãã ãžã®å ¥åãšåºåã¯ïŒ
* ã©ãã ãã®å®¹éã®ããŒã¿ãæãå¿ èŠãããã®ãïŒ
* äžç§éã«äœãªã¯ãšã¹ãã®éä¿¡ãæ³å®ããããïŒ
* èªã¿æžãæ¯çã®æšå®å€ã¯ãããçšåºŠãïŒ### ã¹ããã 2: ããé«ã¬ãã«ã®ã·ã¹ãã èšèšãçµã¿ç«ãŠã
éèŠãªã³ã³ããŒãã³ããå šãŠèæ ®ããé«ã¬ãã«ã®ã·ã¹ãã èšèšæŠèŠãçµã¿ç«ãŠãã
* äž»èŠãªã³ã³ããŒãã³ããšæ¥ç¶ãã¹ã±ããããŠæžãåºã
* èãã®è£ä»ãããã### ã¹ããã 3: æ žãšãªãã³ã³ããŒãã³ããèšèšãã
ããããã®äž»èŠãªã³ã³ããŒãã³ãã«ã€ããŠã®è©³çŽ°ãåŠã¶ãäŸãã°ã[urlççž®ãµãŒãã¹](solutions/system_design/pastebin/README.md)ã®èšèšãåãããéã«ã¯æ¬¡ã®ããã«ãããšããã§ããã:
* å ã®URLã®ããã·ã¥åãããã®ãäœãããããä¿åãã
* [MD5](solutions/system_design/pastebin/README.md) ãš [Base62](solutions/system_design/pastebin/README.md)
* ããã·ã¥è¡çª
* SQL ããã㯠NoSQL
* ããŒã¿ããŒã¹ã¹ããŒã
* ããã·ã¥åãããURLãå ã®URLã«å翻蚳ãã
* ããŒã¿ããŒã¹åç §
* API & ãªããžã§ã¯ãæåã®èšèš### ã¹ããã 4: ã·ã¹ãã èšèšã®ã¹ã±ãŒã«
äžããããå¶çŽæ¡ä»¶ããããã«ããã¯ãšãªããããªãšãããå²ãåºããæ確åããã äŸãã°ãã¹ã±ãŒã©ããªãã£ã®åé¡è§£æ±ºã®ããã«ä»¥äžã®èŠçŽ ãèæ ®ããå¿ èŠãããã ãããïŒ
* ããŒããã©ã³ãµãŒ
* æ°Žå¹³ã¹ã±ãŒãªã³ã°
* ãã£ãã·ã³ã°
* ããŒã¿ããŒã¹ã·ã£ãŒãã£ã³ã°åããã解決çãšãã®ãã¬ãŒããªãã«ã€ããŠè°è«ãããããå šãŠã®ããšã¯ãã¬ãŒããªãã®é¢ä¿ã«ãããããã«ããã¯ã«ã€ããŠã¯[ã¹ã±ãŒã©ãã«ãªã·ã¹ãã èšèšã®åç](#ã·ã¹ãã èšèšç®æ¬¡)ãèªããšããã§ãããã
### ã¡ãã£ãšããæç®åé¡
ã¡ãã£ãšããæšèšå€ãæèšç®ã§ããããšãæ±ããããããšããããããããŸããã[è£éº](#è£éº)ã®ä»¥äžã®é ç®ã圹ã«ç«ã€ã§ããã:
* [ãã©è£èšç®ã§ã·ã¹ãã èšèšãã](http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html)
* [2ã®ä¹æ°è¡š](#2ã®ä¹æ°è¡š)
* [å šãŠã®ããã°ã©ããŒãç¥ã£ãŠããã¹ãã¬ã€ãã³ã·ã®åèå€](#å šãŠã®ããã°ã©ããŒãç¥ãã¹ãã¬ã€ãã³ã·ãŒå€)### æç®ãšãã®ä»ã®åèè³æ
以äžã®ãªã³ã¯å ããŒãžãèŠãŠã©ã®ãããªè³ªåãæãããããããæŠèŠãé ã«å ¥ããŠãããŸããã:
* [ã·ã¹ãã èšèšé¢æ¥ã§æåããã«ã¯ïŒ](https://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/)
* [ã·ã¹ãã èšèšé¢æ¥](http://www.hiredintech.com/system-design)
* [ã¢ãŒããã¯ãã£ãã·ã¹ãã èšèšé¢æ¥ãžã®å°å ¥](https://www.youtube.com/watch?v=ZgdS0EUmn70)## ã·ã¹ãã èšèšèª²é¡äŸãšãã®è§£ç
> é »åºã®ã·ã¹ãã èšèšé¢æ¥èª²é¡ãšåè解çãã³ãŒãåã³ãã€ã¢ã°ã©ã
>
> 解ç㯠`solutions/` ãã©ã«ã以äžã«ãªã³ã¯ã貌ãããŠãã| åé¡ | |
|---|---|
| Pastebin.com (ããã㯠Bit.ly) ãèšèšãã| [解ç](solutions/system_design/pastebin/README.md) |
| Twitterã¿ã€ã ã©ã€ã³ (ãããã¯Facebookãã£ãŒã)ãèšèšãã
Twitteræ€çŽ¢(ãããã¯Facebookæ€çŽ¢)æ©èœãèšèšãã | [解ç](solutions/system_design/twitter/README.md) |
| ãŠã§ãã¯ããŒã©ãŒãèšèšãã | [解ç](solutions/system_design/web_crawler/README.md) |
| Mint.comãèšèšãã | [解ç](solutions/system_design/mint/README.md) |
| SNSãµãŒãã¹ã®ããŒã¿æ§é ãèšèšãã | [解ç](solutions/system_design/social_graph/README.md) |
| æ€çŽ¢ãšã³ãžã³ã®ããŒ/ããªã¥ãŒæ§é ãèšèšãã | [解ç](solutions/system_design/query_cache/README.md) |
| Amazonã®ã«ããŽãªæ¯ã®å£²ãäžãã©ã³ãã³ã°ãèšèšãã | [解ç](solutions/system_design/sales_rank/README.md) |
| AWSäžã§100äžäººèŠæš¡ã®ãŠãŒã¶ãŒãæããµãŒãã¹ãèšèšãã | [解ç](solutions/system_design/scaling_aws/README.md) |
| ã·ã¹ãã èšèšåé¡ãè¿œå ãã | [Contribute](#contributing) |### Pastebin.com (ããã㯠Bit.ly) ãèšèšãã
[åé¡ãšè§£çãèŠã](solutions/system_design/pastebin/README.md)
![Imgur](images/4edXG0T.png)
### Twitterã¿ã€ã ã©ã€ã³&æ€çŽ¢ (ãããã¯Facebookãã£ãŒã&æ€çŽ¢)ãèšèšãã
[åé¡ãšè§£çãèŠã](solutions/system_design/twitter/README.md)
![Imgur](images/jrUBAF7.png)
### ãŠã§ãã¯ããŒã©ãŒã®èšèš
[åé¡ãšè§£çãèŠã](solutions/system_design/web_crawler/README.md)
![Imgur](images/bWxPtQA.png)
### Mint.comã®èšèš
[åé¡ãšè§£çãèŠã](solutions/system_design/mint/README.md)
![Imgur](images/V5q57vU.png)
### SNSãµãŒãã¹ã®ããŒã¿æ§é ãèšèšãã
[åé¡ãšè§£çãèŠã](solutions/system_design/social_graph/README.md)
![Imgur](images/cdCv5g7.png)
### æ€çŽ¢ãšã³ãžã³ã®ããŒ/ããªã¥ãŒæ§é ãèšèšãã
[åé¡ãšè§£çãèŠã](solutions/system_design/query_cache/README.md)
![Imgur](images/4j99mhe.png)
### Amazonã®ã«ããŽãªæ¯ã®å£²ãäžãã©ã³ãã³ã°ãèšèšãã
[åé¡ãšè§£çãèŠã](solutions/system_design/sales_rank/README.md)
![Imgur](images/MzExP06.png)
### AWSäžã§100äžäººèŠæš¡ã®ãŠãŒã¶ãŒãæããµãŒãã¹ãèšèšãã
[åé¡ãšè§£çãèŠã](solutions/system_design/scaling_aws/README.md)
![Imgur](images/jj3A5N8.png)
## ãªããžã§ã¯ãæåèšèšåé¡ãšè§£ç
> é »åºã®ãªããžã§ã¯ãæåã·ã¹ãã èšèšé¢æ¥èª²é¡ãšåè解çãã³ãŒãåã³ãã€ã¢ã°ã©ã
>
> 解ç㯠`solutions/` ãã©ã«ã以äžã«ãªã³ã¯ã貌ãããŠãã>**åè: ãã®ã»ã¯ã·ã§ã³ã¯äœæ¥äžã§ã**
| åé¡ | |
|---|---|
| ããã·ã¥ãããã®èšèš | [解ç](solutions/object_oriented_design/hash_table/hash_map.ipynb) |
| LRUãã£ãã·ã¥ã®èšèš | [解ç](solutions/object_oriented_design/lru_cache/lru_cache.ipynb) |
| ã³ãŒã«ã»ã³ã¿ãŒã®èšèš | [解ç](solutions/object_oriented_design/call_center/call_center.ipynb) |
| ã«ãŒãã®ãããã®èšèš | [解ç](solutions/object_oriented_design/deck_of_cards/deck_of_cards.ipynb) |
| é§è»å Žã®èšèš | [解ç](solutions/object_oriented_design/parking_lot/parking_lot.ipynb) |
| ãã£ãããµãŒããŒã®èšèš | [解ç](solutions/object_oriented_design/online_chat/online_chat.ipynb) |
| å圢é åã®èšèš | [Contribute](#contributing) |
| ãªããžã§ã¯ãæåã·ã¹ãã èšèšåé¡ãè¿œå ãã | [Contribute](#contributing) |## ã·ã¹ãã èšèšãããã¯ã¹: ãŸãã¯ãããã
ã·ã¹ãã èšèšã®å匷ã¯åããŠïŒ
ãŸãåãã«ããã䜿ãããèšèšåçã«ã€ããŠãããããäœã§ããããã©ã®ããã«çšããããããé·æçæã«ã€ããŠåºæ¬çãªç¥èãåŸãå¿ èŠããããŸã
### ã¹ããã 1: ã¹ã±ãŒã©ããªãã£ã«é¢ããåç»ã芳ãŠåŸ©ç¿ãã
[Harvardã§ã®ã¹ã±ãŒã©ããªãã£ã®è¬çŸ©](https://www.youtube.com/watch?v=-W9F__D3oY4)
* ããã§è§ŠããããŠãããããã¯ã¹:
* åçŽã¹ã±ãŒãªã³ã°
* æ°Žå¹³ã¹ã±ãŒãªã³ã°
* ãã£ãã·ã³ã°
* ããŒããã©ã³ã·ã³ã°
* ããŒã¿ããŒã¹ã¬ããªã±ãŒã·ã§ã³
* ããŒã¿ããŒã¹ããŒãã£ã·ã§ã³### ã¹ããã 2: ã¹ã±ãŒã©ããªãã£ã«é¢ããè³æãèªãã§åŸ©ç¿ãã
[ã¹ã±ãŒã©ããªãã£](http://www.lecloud.net/tagged/scalability/chrono)
* ããã§è§ŠããããŠãããããã¯ã¹:
* [ã¯ããŒã³](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones)
* [ããŒã¿ããŒã¹](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database)
* [ãã£ãã·ã¥](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache)
* [éåæ](http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism)### 次ã®ã¹ããã
次ã«ããã€ã¬ãã«ã§ã®ãã¬ãŒããªãã«ã€ããŠã¿ãŠãã:
* **ããã©ãŒãã³ã¹** vs **ã¹ã±ãŒã©ããªãã£**
* **ã¬ã€ãã³ã·** vs **ã¹ã«ãŒããã**
* **å¯çšæ§** vs **äžè²«æ§****å šãŠã¯ãã¬ãŒããªãã®é¢ä¿ã«ãã**ãšããã®ãèã«åœããŠãããŸãããã
ãããããããæ·±ãå 容ãDNSãCDNãããŠããŒããã©ã³ãµãŒãªã©ã«ã€ããŠåŠç¿ãé²ããŠãããŸãããã
## ããã©ãŒãã³ã¹ vs ã¹ã±ãŒã©ããªãã£
ãªãœãŒã¹ãè¿œå ãããã®ã«ã€ã㊠**ããã©ãŒãã³ã¹** ãåäžããå Žåãã®ãµãŒãã¹ã¯ **ã¹ã±ãŒã©ãã«** ã§ãããšèšããã§ããããäžè¬çã«ãããã©ãŒãã³ã¹ãåäžããããšããã®ã¯ããªãã¡èšç®åŠçãå¢ããããšãæå³ããŸãããããŒã¿ã»ãããå¢ããæãªã©ãã倧ããªåŠçãæããããã«ãªãããšã§ããããŸãã1
ããã©ãŒãã³ã¹vsã¹ã±ãŒã©ããªãã£ããšãããä»ã®èãæ¹:
* **ããã©ãŒãã³ã¹** ã§ã®åé¡ãæ±ããŠããæãããªãã®ã·ã¹ãã ã¯äžäººã®ãŠãŒã¶ãŒã«ãšã£ãŠé ããšèšããã§ãããã
* **ã¹ã±ãŒã©ããªãã£** ã§ã®åé¡ãæ±ããŠãããšããäžäººã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯éãã§ãããå€ãã®ãªã¯ãšã¹ããããæã«ã¯é ããªã£ãŠããŸãã§ãããã### ãã®ä»ã®åèè³æãããŒãž
* [ã¹ã±ãŒã©ããªãã£ã«ã€ããŠ](http://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html)
* [ã¹ã±ãŒã©ããªãã£ãå¯çšæ§ãå®å®æ§ããã¿ãŒã³](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/)## ã¬ã€ãã³ã·ãŒ vs ã¹ã«ãŒããã
**ã¬ã€ãã³ã·ãŒ** ãšã¯ãªã«ãããã®åäœãè¡ãããããã¯çµæãç®åºããã®ã«èŠããæé
**ã¹ã«ãŒããã** ãšã¯ãã®ãããªåäœãçµæç®åºãåäœæéã«è¡ãããåæ°
äžè¬çã«ã **æ倧éã®ã¹ã«ãŒããã** ã **蚱容ç¯å²å ã®ã¬ã€ãã³ã·ãŒ** ã§å®çŸããããšãç®æãã®ãæ®éã ã
### ãã®ä»ã®åèè³æãããŒãž
* [ã¬ã€ãã³ã·ãŒ vs ã¹ã«ãŒããããç解ãã](https://community.cadence.com/cadence_blogs_8/b/sd/archive/2010/09/13/understanding-latency-vs-throughput)
## å¯çšæ§ vs äžè²«æ§
### CAP çè«
åæ£åã³ã³ãã¥ãŒã¿ã·ã¹ãã ã«ãããŠã¯äžã®äžã€ã®ãã¡äºã€ãŸã§ããåæã«ä¿èšŒããããšã¯ã§ããªãã:
* **äžè²«æ§** - å šãŠã®èªã¿èŸŒã¿ã¯ææ°ã®æžã蟌ã¿ãããã¯ãšã©ãŒãåãåã
* **å¯çšæ§** - åãåãæ å ±ãææ°ã®ãã®ã ãšããä¿èšŒã¯ãªãããå šãŠã®ãªã¯ãšã¹ãã¯ã¬ã¹ãã³ã¹ãå¿ ãåãåã
* **åæèæ§** - ãããã¯ãŒã¯åé¡ã«ãã£ãŠé äžåã®åæãèµ·ããŠãã·ã¹ãã ãåäœãç¶ãã*ãããã¯ãŒã¯ã¯ä¿¡é Œã§ããªãã®ã§ãåæèæ§ã¯å¿ ãä¿èšŒããªããã°ãªããŸãããã€ãŸããœãããŠã§ã¢ã·ã¹ãã ãšããŠã®ãã¬ãŒããªãã¯ãäžè²«æ§ãåãããå¯çšæ§ãåãããèããªããã°ãªããŸããã*
#### CP - äžè²«æ§ãšåæèæ§(consistency and partition tolerance)
åæãããããŒãããã®ã¬ã¹ãã³ã¹ãåŸ ã¡ç¶ããŠãããšã¿ã€ã ã¢ãŠããšã©ãŒã«é¥ãå¯èœæ§ããããŸããCPã¯ããªãã®ãµãŒãã¹ãã¢ãããã¯ãªèªã¿æžãïŒäžå¯åæäœïŒãå¿ èŠãšããéã«ã¯ããéžæè¢ã§ãããã
#### AP - å¯çšæ§ãšåæèæ§(availability and partition tolerance)
ã¬ã¹ãã³ã¹ã¯ããŒãäžã«ããããŒã¿ã§ææ°ã®ãã®ãè¿ããŸããã€ãŸããææ°çã®ããŒã¿ãè¿ããããšã¯éããŸãããåæã解æ¶ãããåŸããæžã蟌ã¿ãåæ ãããã®ã«ã¯æéãããããŸãã
[çµææŽåæ§](#çµææŽåæ§)ããæ±ãããµãŒãã¹ã®éã«ã¯APãæ¡çšããã®ãããã§ãããããããã¯ãå€éšãšã©ãŒã«é¢ãããã·ã¹ãã ã皌åããå¿ èŠãããéã«ãåæ§ã§ãã
### ãã®ä»ã®åèè³æãããŒãž
* [CAP çè«ãæ¯ãè¿ã](http://robertgreiner.com/2014/08/cap-theorem-revisited/)
* [å¹³æãªè±èªã§ã®CAP çè«ã®ã€ã³ãã](http://ksat.me/a-plain-english-introduction-to-cap-theorem/)
* [CAP FAQ](https://github.com/henryr/cap-faq)## äžè²«æ§ãã¿ãŒã³
åãããŒã¿ã®è€è£œãè€æ°ããç¶æ ã§ã¯ãã¯ã©ã€ã¢ã³ããäžè²«ããããŒã¿è¡šç€ºãåãåãããã«ãã©ã®ããã«ããããåæããã°ããã®ããšãã課é¡ããããŸãã [CAP çè«](#cap-çè«) ã«ãããäžè²«æ§ã®å®çŸ©ãæãåºããŠã¿ãŸããããå šãŠã®èªã¿åãã¯ææ°ã®æžã蟌ã¿ããŒã¿ãããã¯ãšã©ãŒãåãåãã¯ãã§ãã
### 匱ãäžè²«æ§
æžã蟌ã¿åŸã®èªã¿åãã§ã¯ããã®ææ°ã®æžã蟌ã¿ãèªãããèªããªãã£ããããããã¹ããšãã©ãŒãåã®ã¢ãããŒãã«åºã¥ãã
ãã®ã¢ãããŒãã¯memcachedãªã©ã®ã·ã¹ãã ã«èŠãããŸãã匱ãäžè²«æ§ã¯ãªã¢ã«ã¿ã€ã æ§ãå¿ èŠãªãŠãŒã¹ã±ãŒã¹ãäŸãã°VoIPããããªãã£ããããªã¢ã«ã¿ã€ã ãã«ããã¬ã€ã€ãŒã²ãŒã ãªã©ãšçžæ§ãããã§ããããäŸãã°ãé»è©±ã«åºãŠãããšãã«æ°ç§éé³å£°ãåãåããªããªã£ããšãããããã®åŸã«æ¥ç¶ãå埩ããŠããã®æ¥ç¶ãåæãããŠããéã«è©±ãããŠããããšã¯èãåããªããšãããããªæãã§ãã
### çµææŽåæ§
æžã蟌ã¿ã®åŸãèªã¿åãã¯æçµçã«ã¯ãã®çµæãèªã¿åãããšãã§ãã(ããªç§ã»ã©é ããŠãšããã®ãäžè¬çã§ã)ãããŒã¿ã¯éåæçã«è€è£œãããŸãã
ãã®ã¢ãããŒãã¯DNSãã¡ãŒã«ã·ã¹ãã ãªã©ã«æ¡çšãããŠããŸããçµææŽåæ§ã¯å€ãã®ãªã¯ãšã¹ããæããµãŒãã¹ãšçžæ§ãããã§ãããã
### 匷ãäžè²«æ§
æžã蟌ã¿ã®åŸãèªã¿åãã¯ãããå¿ ãèªãããšãã§ããŸããããŒã¿ã¯åæçã«è€è£œãããŸãã
ãã®ã¢ãããŒãã¯ãã¡ã€ã«ã·ã¹ãã ãRDBMSãªã©ã§æ¡çšãããŠããŸãããã©ã³ã¶ã¯ã·ã§ã³ãæ±ããµãŒãã¹ã§ã¯åŒ·ãäžè²«æ§ãå¿ èŠã§ãããã
### ãã®ä»ã®åèè³æãããŒãž
* [ããŒã¿ã»ã³ã¿ãŒéã§ã®ãã©ã³ã¶ã¯ã·ã§ã³](http://snarfed.org/transactions_across_datacenters_io.html)
## å¯çšæ§ãã¿ãŒã³
é«ãå¯çšæ§ãæ ä¿ããã«ã¯äž»ã«æ¬¡ã®äºã€ã®ãã¿ãŒã³ããããŸã: **ãã§ã€ã«ãªãŒããŒ** ãš **ã¬ããªã±ãŒã·ã§ã³** ã§ãã
### ãã§ã€ã«ãªãŒããŒ
#### ã¢ã¯ãã£ãã»ããã·ã
ã¢ã¯ãã£ãã»ããã·ããã§ã€ã«ãªãŒããŒã«ãããŠã¯ãåšæä¿¡å·ã¯ã¢ã¯ãã£ããããã¯ã¹ã¿ã³ãã€äžã®ããã·ããªãµãŒããŒã«éãããŸããåšæä¿¡å·ãäžæãããæã«ã¯ãããã·ãã ã£ããµãŒããŒãã¢ã¯ãã£ããµãŒããŒã®IPã¢ãã¬ã¹ãåŒãç¶ãã§ãµãŒãã¹ãåéããŸãã
èµ·åãŸã§ã®ããŠã³ã¿ã€ã ã¯ããã·ããµãŒããŒãããããããªã¹ã¿ã³ãã€ç¶æ ã«ãããããã³ãŒã«ãããªã¹ã¿ã³ãã€ç¶æ ã«ãããã§å€ãããŸããã¢ã¯ãã£ããªãµãŒããŒã®ã¿ããã©ãã£ãã¯ãæããŸãã
ã¢ã¯ãã£ãã»ããã·ããã§ã€ã«ãªãŒããŒã¯ãã¹ã¿ãŒã»ã¹ã¬ãŒããã§ã€ã«ãªãŒããŒãšåŒã°ããããšããããŸãã
#### ã¢ã¯ãã£ãã»ã¢ã¯ãã£ã
ã¢ã¯ãã£ãã¢ã¯ãã£ãæ§æã§ã¯äž¡æ¹ã®ãµãŒããŒããã©ãã£ãã¯ãæãããšã§è² è·ãåæ£ããŸãã
ãããã®ãµãŒããŒããããªãã¯ãªãã®ã®å ŽåãDNSã¯äž¡æ¹ã®ãµãŒããŒã®ãããªãã¯IPãç¥ã£ãŠããå¿ èŠããããŸããããããã©ã€ããŒããªãã®ãªå Žåãã¢ããªã±ãŒã·ã§ã³ããžãã¯ãäž¡æ¹ã®ãµãŒããŒã®æ å ±ã«ã€ããŠç¥ã£ãŠããå¿ èŠããããŸãã
ã¢ã¯ãã£ãã»ã¢ã¯ãã£ããªãã§ã€ã«ãªãŒããŒã¯ãã¹ã¿ãŒã»ãã¹ã¿ãŒãã§ã€ã«ãªãŒããŒãšåŒã°ããããšããããŸãã
### çæ: ãã§ã€ã«ãªãŒããŒ
* ãã§ã€ã«ãªãŒããŒã§ã¯ããå€ãã®ããŒããŠã§ã¢ãèŠããè€éããå¢ããŸãã
* ææ°ã®æžã蟌ã¿ãããã·ããµãŒããŒã«è€è£œãããåã«ã¢ã¯ãã£ããèœã¡ããšãããŒã¿æ¬ æãèµ·ããæœåšå¯èœæ§ããããŸãã### ã¬ããªã±ãŒã·ã§ã³
#### ãã¹ã¿ãŒã»ã¹ã¬ãŒãããšããã¹ã¿ãŒã»ãã¹ã¿ãŒ
ãã®ãããã¯ã¯ [ããŒã¿ããŒã¹](#ããŒã¿ããŒã¹) ã»ã¯ã·ã§ã³ã«ãããŠãã詳现ã«è§£èª¬ãããŠããŸã:
* [ãã¹ã¿ãŒã»ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³](#ãã¹ã¿ãŒã¹ã¬ãŒã-ã¬ããªã±ãŒã·ã§ã³)
* [ãã¹ã¿ãŒã»ãã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³](#ãã¹ã¿ãŒãã¹ã¿ãŒ-ã¬ããªã±ãŒã·ã§ã³)## ãã¡ã€ã³ããŒã ã·ã¹ãã
Source: DNS security presentationãã¡ã€ã³ããŒã ã·ã¹ãã (DNS) 㯠www.example.com ãªã©ã®ãã¡ã€ã³ããŒã ãIPã¢ãã¬ã¹ãžãšç¿»èš³ããŸãã
DNSã¯å°æ°ã®ãªãŒãœã©ã€ãºããããµãŒããŒãäžäœã«äœçœ®ããéå±€çæ§é ã§ããããªãã®ã«ãŒã¿ãŒãããã¯ISPã¯æ€çŽ¢ãããéã«ã©ã®DNSãµãŒããŒã«æ¥ç¶ããããšããæ å ±ãæäŸããŸããäœãéå±€ã®DNSãµãŒããŒã¯ãã®çµè·¯ãããããã£ãã·ã¥ããŸãããã ããã®æ å ±ã¯äŒæ¬é 延ã«ãã£ãŠé³è åããå¯èœæ§ããããŸããDNSã®çµæã¯ããªãã®ãã©ãŠã¶ãããã¯OSã«äžå®æéïŒ[time to live (TTL)](https://en.wikipedia.org/wiki/Time_to_live)ã«èšå®ãããæéïŒãã£ãã·ã¥ãããŸãã
* **NS record (name server)** - ããªãã®ãã¡ã€ã³ã»ãµããã¡ã€ã³ã§ã®DNSãµãŒããŒãç¹å®ããŸãã
* **MX record (mail exchange)** - ã¡ãã»ãŒãžãåãåãã¡ãŒã«ãµãŒããŒãç¹å®ããŸãã
* **A record (address)** - IPã¢ãã¬ã¹ã«ååãã€ããŸãã
* **CNAME (canonical)** - ä»ã®ååãããã¯ã`CNAME` (example.com ã www.example.com) ããã㯠`A` recordãžãšååãæã瀺ãã[CloudFlare](https://www.cloudflare.com/dns/) ã [Route 53](https://aws.amazon.com/route53/) ãªã©ã®ãµãŒãã¹ã¯ãããŒãžãDNSãµãŒãã¹ãæäŸããŠããŸããããã€ãã®DNSãµãŒãã¹ã§ã¯æ§ã ãªææ³ã䜿ã£ãŠãã©ãã£ãã¯ãæãããšãã§ããŸã:
* [å éã©ãŠã³ãããã³](http://g33kinfo.com/info/archives/2657)
* ãã©ãã£ãã¯ãã¡ã³ããã³ã¹äžã®ãµãŒããŒã«è¡ãã®ãé²ããŸã
* æ§ã ãªã¯ã©ã¹ã¿ãŒãµã€ãºã«å¿ããŠèª¿æŽããŸã
* A/B ãã¹ã
* ã¬ã€ãã³ã·ãŒããŒã¹
* å°çããŒã¹### æ¬ ç¹: DNS
* äžèšã§ç€ºãããŠãããããªãã£ãã·ã³ã°ã«ãã£ãŠç·©åãããŠãããšã¯ãããDNSãµãŒããŒãžã®æ¥ç¶ã«ã¯å°ãé 延ãçããã
* DNSãµãŒããŒã¯ã[æ¿åºãISPäŒæ¥,ãããŠå€§äŒæ¥](http://superuser.com/questions/472695/who-controls-the-dns-servers/472729)ã«ç®¡çãããŠãããããããã®ç®¡çã¯è€éã§ããã
* DNSãµãŒãã¹ã¯[DDoS attack](http://dyn.com/blog/dyn-analysis-summary-of-friday-october-21-attack/)ã®äŸã§ãIPã¢ãã¬ã¹ãªãã«ãŠãŒã¶ãŒãTwitterãªã©ã«ã¢ã¯ã»ã¹ã§ããªããªã£ãããã«ãæ»æãåããå¯èœæ§ãããã### ãã®ä»ã®åèè³æãããŒãž
* [DNS ã¢ãŒããã¯ãã£](https://technet.microsoft.com/en-us/library/dd197427(v=ws.10).aspx)
* [Wikipedia](https://en.wikipedia.org/wiki/Domain_Name_System)
* [DNS èšäº](https://support.dnsimple.com/categories/dns/)## ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯(Content delivery network)
ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯(CDN)ã¯äžçäžã«é 眮ããããããã·ãµãŒããŒã®ãããã¯ãŒã¯ããŠãŒã¶ãŒã«äžçªå°ççã«è¿ããµãŒããŒããã³ã³ãã³ããé ä¿¡ããã·ã¹ãã ã®ããšã§ããAmazonã®CloudFrontãªã©ã¯äŸå€çã«ãã€ãããã¯ãªã³ã³ãã³ããé ä¿¡ããŸãããäžè¬çã«ãHTML/CSS/JSãåçããããŠåç»ãªã©ã®éçãã¡ã€ã«ãCDNãéããŠé ä¿¡ãããŸãããã®ãµã€ãã®DNSãã¯ã©ã€ã¢ã³ãã«ã©ã®ãµãŒããŒãšäº€ä¿¡ããããšããæ å ±ãäŒããŸãã
CDNãçšããŠã³ã³ãã³ããé ä¿¡ããããšã§ä»¥äžã®äºã€ã®çç±ã§ããã©ãŒãã³ã¹ãåçã«åäžããŸã:
* ãŠãŒã¶ãŒã¯è¿ãã«ããããŒã¿ã»ã³ã¿ãŒããåä¿¡ã§ãã
* ããã¯ãšã³ããµãŒããŒã¯CDNãåŠçããŠããããªã¯ãšã¹ãã«é¢ããŠã¯åŠçããå¿ èŠããªããªããŸã### ããã·ã¥CDN
ããã·ã¥CDNã§ã¯ãµãŒããŒããŒã¿ã«æŽæ°ããã£ãæã«ã¯å¿ ããæ°ããã³ã³ãã³ããåãåãæ¹åŒã§ããã³ã³ãã³ããçšæããCDNã«çŽæ¥ã¢ããããŒãããURLãCDNãæãããã«æå®ãããšãããŸã§ãå šãŠèªåã§è²¬ä»»ãè² ã圢ã§ããã³ã³ãã³ãããã€æéåãã«ãªãã®ãæŽæ°ãããã®ããèšå®ããããšãã§ããŸããã³ã³ãã³ãã¯æ°èŠäœææãæŽæ°æã®ã¿ã¢ããããŒããããããšã§ãã©ãã£ãã¯ã¯æå°åãããäžæ¹ãã¹ãã¬ãŒãžã¯æ倧éæ¶è²»ãããŠããŸããŸãã
ãã©ãã£ãã¯ã®å°ãªãããããã¯é »ç¹ã«ã¯ã³ã³ãã³ããæŽæ°ãããªããµã€ãã®å Žåã«ã¯ããã·ã¥CDNãšçžæ§ãããã§ããããã³ã³ãã³ãã¯å®æçã«åã³ãã«ãããã®ã§ã¯ãªããCDNã«äžåºŠã®ã¿é 眮ãããŸãã
### ãã«CDN
ãã«CDNã§ã¯äžäººç®ã®ãŠãŒã¶ãŒããªã¯ãšã¹ãããæã«ãæ°ããã³ã³ãã³ãããµãŒãã¹ã®ãµãŒããŒããååŸããŸããã³ã³ãã³ãã¯èªåã®ãµãŒããŒã«ä¿åããŠãCDNãæãURLãæžãæããŸããçµæãšããŠãCDNã«ã³ã³ãã³ãããã£ãã·ã¥ããããŸã§ã¯ãªã¯ãšã¹ãåŠçãé ããªããŸãã
[time-to-live (TTL)](https://en.wikipedia.org/wiki/Time_to_live) ã¯ã³ã³ãã³ããã©ãã ãã®æéãã£ãã·ã¥ãããããèŠå®ããŸãããã«CDNã¯CDN äžã§ã®ã¹ãã¬ãŒãžã¹ããŒã¹ãæå°åããŸãããæå¹æéãåãããã¡ã€ã«ãæŽæ°åã«ãã«ãããŠããŸãããšã§åé·ãªãã©ãã£ãã¯ã«ç¹ãã£ãŠããŸãå¯èœæ§ããããŸãã
倧èŠæš¡ãªãã©ãã£ãã¯ã®ãããµã€ãã§ã¯ãã«CDNãçžæ§ãããã§ãããããšããã®ãããã©ãã£ãã¯ã®å€§éšåã¯æè¿ãªã¯ãšã¹ããããCDNã«æ®ã£ãŠããã³ã³ãã³ãã«ã¢ã¯ã»ã¹ãããã®ã§ããããšãå€ãããã§ãã
### æ¬ ç¹: CDN
* CDNã®ã³ã¹ãã¯ãã©ãã£ãã¯éã«ãã£ãŠå€ãããŸãããã¡ãããCDNã䜿ããªãå Žåã®ã³ã¹ããšæ¯èŒããã¹ãã§ãããã
* TTLãåããåã«ã³ã³ãã³ããæŽæ°ããããšé³è åããæãããããŸãã
* CDNã§ã¯éçã³ã³ãã³ããCDNãæãããã«URLãæŽæ°ããå¿ èŠããããŸãã### ãã®ä»ã®åèè³æãããŒãž
* [ã°ããŒãã«ã«åæ£ãããã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯](http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci)
* [ããã·ã¥CDNãšãã«CDNã®éã](http://www.travelblogadvice.com/technical/the-differences-between-push-and-pull-cdns/)
* [Wikipedia](https://en.wikipedia.org/wiki/Content_delivery_network)## ããŒããã©ã³ãµãŒ
Source: Scalable system design patternsããŒããã©ã³ãµãŒã¯å ¥åãããã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ããã¢ããªã±ãŒã·ã§ã³ãµãŒããŒãããŒã¿ããŒã¹ãžãšåæ£ããããã©ã®ã±ãŒã¹ã§ãããŒããã©ã³ãµãŒã¯ãµãŒããŒçèšç®ãªãœãŒã¹ããã®ã¬ã¹ãã³ã¹ãé©åãªã¯ã©ã€ã¢ã³ãã«è¿ããããŒããã©ã³ãµãŒã¯ä»¥äžã®ããšã«å¹æçã§ã:
* ãªã¯ãšã¹ããç¶æ ã®è¯ããªããµãŒããŒã«è¡ãã®ãé²ã
* ãªã¯ãšã¹ããéå°ã«éãã®ãé²ã
* ç¹å®ç®æã®æ¬ é¥ã§ãµãŒãã¹ãèœã¡ãããšãé²ãããŒããã©ã³ãµãŒã¯ (è²»çšã®é«ã) ããŒããŠã§ã¢ãããã¯HAProxyãªã©ã®ãœãããŠã§ã¢ã§å®çŸã§ããã
ä»ã®å©ç¹ãšããŠã¯:
* **SSL termination** - å ¥åããããªã¯ãšã¹ãã解èªããããŸãããµãŒããŒã¬ã¹ãã³ã¹ãæå·åããããšã§ããã¯ãšã³ãã®ãµãŒããŒããã®ã³ã¹ããé«ãã€ããã¡ãªåŠçãè«ãè² ããªããŠããããã«è©ä»£ããããŸãã
* [X.509 certificates](https://en.wikipedia.org/wiki/X.509) ãããããã®ãµãŒããŒã«ã€ã³ã¹ããŒã«ããå¿ èŠããªãããŸã
* **ã»ãã·ã§ã³ç®¡ç** - ã¯ãããŒãåãæ±ããŠã§ãã¢ããªãã»ãã·ã§ã³æ å ±ãä¿æããŠããªãæãªã©ã«ãç¹å®ã®ã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ããåãã€ã³ã¹ã¿ã³ã¹ãžãšæµããŸããé害ã«å¯Ÿå¿ããããã«ã[ã¢ã¯ãã£ãã»ããã·ã](#ã¢ã¯ãã£ãããã·ã) ããã㯠[ã¢ã¯ãã£ãã»ã¢ã¯ãã£ã](#ã¢ã¯ãã£ãã¢ã¯ãã£ã) ã¢ãŒãã®ã©ã¡ãã«ãããŠããè€æ°ã®ããŒããã©ã³ãµãŒãé 眮ããã®ãäžè¬çã§ãã
ããŒããã©ã³ãµãŒã¯ä»¥äžã®ãããªçš®ã ã®ã¡ããªãã¯ãçšããŠãã©ãã£ãã¯ã«ãŒãã£ã³ã°ãè¡ãããšãã§ããŸã:
* ã©ã³ãã
* Least loaded
* ã»ãã·ã§ã³/ã¯ãããŒ
* [ã©ãŠã³ãããã³ãããã¯å éã©ãŠã³ãããã³](http://g33kinfo.com/info/archives/2657)
* [Layer 4](#layer-4-ããŒããã©ã³ã·ã³ã°)
* [Layer 7](#layer-7-ããŒããã©ã³ã·ã³ã°)### Layer 4 ããŒããã©ã³ã·ã³ã°
Layer 4 ããŒããã©ã³ãµãŒã¯ [ãã©ã³ã¹ããŒãã¬ã€ã€ãŒ](#éä¿¡) ãåç §ããŠã©ã®ããã«ãªã¯ãšã¹ããé åãããå€æããŸããäžè¬çã«ããã©ã³ã¹ããŒãã¬ã€ã€ãŒãšããŠã¯ããœãŒã¹ãéä¿¡å IPã¢ãã¬ã¹ãããããŒã«èšè¿°ãããããŒãçªå·ãå«ãŸããŸããããã±ããã®äžèº«ã®ã³ã³ãã³ãã¯å«ã¿ãŸããã Layer 4 ããŒããã©ã³ãµãŒã¯ãããã¯ãŒã¯ãã±ãããäžæµãµãŒããŒãžå±ããäžæµãµãŒããŒããé ä¿¡ããããšã§ãããã¯ãŒã¯ã¢ãã¬ã¹å€æ [Network Address Translation (NAT)](https://www.nginx.com/resources/glossary/layer-4-load-balancing/) ãå®çŸããŸãã
### Layer 7 ããŒããã©ã³ã·ã³ã°
Layer 7 ããŒããã©ã³ãµãŒã¯ [ã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒ](#éä¿¡) ãåç §ããŠã©ã®ããã«ãªã¯ãšã¹ããé åãããå€æããŸããããããŒãã¡ãã»ãŒãžãã¯ãããŒãªã©ã®ã³ã³ãã³ãã®ããšã§ããLayer 7 ããŒããã©ã³ãµãŒã¯ãããã¯ãŒã¯ãã©ãã£ãã¯ã®çµç«¯ãåãæã¡ ã¡ãã»ãŒãžãèªã¿èŸŒã¿ãããŒããã©ã³ã·ã³ã°ã®å€æãããéžæãããµãŒããŒãšã®æ¥ç¶ãç¹ããŸããäŸãã° layer 7 ããŒããã©ã³ãµãŒã¯åç»ã®ãã©ãã£ãã¯ãçŽæ¥ããã®ããŒã¿ããã¹ãããŠãããµãŒããŒã«ã€ãªããšåæã«ã決æžåŠçãªã©ã®ããç¹çŽ°ãªãã©ãã£ãã¯ãã»ãã¥ãªãã£åŒ·åããããµãŒããŒã«æµããšããããšãã§ããã
æè»æ§ãšã®ãã¬ãŒããªãã«ãªããŸããã layer 4 ããŒããã©ã³ãµãŒã§ã¯Layer 7ããŒããã©ã³ãµãŒãããæèŠæéãèšç®ãªãœãŒã¹ãå°ãªãæžãŸããããšãã§ããŸãããã ããæšä»ã®æ±çšããŒããŠã§ã¢ã§ã¯ããã©ãŒãã³ã¹ã¯æå°éã®ã¿ããçºæ®ã§ããªãã§ãããã
### æ°Žå¹³ã¹ã±ãŒãªã³ã°
ããŒããã©ã³ãµãŒã§ã¯æ°Žå¹³ã¹ã±ãŒãªã³ã°ã«ãã£ãŠããã©ãŒãã³ã¹ãšå¯çšæ§ãåäžãããããšãã§ããŸããæé ãªæ±çšãã·ã³ãè¿œå ããããšã«ãã£ãŠã¹ã±ãŒã«ã¢ãŠããããæ¹ããäžã€ã®ãµãŒããŒãããé«äŸ¡ãªãã·ã³ã«ã¹ã±ãŒã«ã¢ããããïŒ**åçŽã¹ã±ãŒãªã³ã°**ïŒããè²»çšå¯Ÿå¹æãé«ããªããçµæçã«å¯çšæ§ãé«ããªããŸãããŸããæ±çšããŒããŠã§ã¢ãæ±ãã人æãéãæ¹ããç¹ååã®åçšããŒããŠã§ã¢ãæ±ãã人æãéããããç°¡åã§ãããã
#### æ¬ ç¹: æ°Žå¹³ã¹ã±ãŒãªã³ã°
* æ°Žå¹³çã«ã¹ã±ãŒãªã³ã°ããŠãããšãè€éããå¢ãäžã«ããµãŒããŒã®ã¯ããŒãã³ã°ãå¿ èŠã«ãªãã
* ãµãŒããŒã¯ã¹ããŒãã¬ã¹ã§ããå¿ èŠããã: ãŠãŒã¶ãŒã«é¢é£ããã»ãã·ã§ã³ãããããã£ãŒã«åçãªã©ã®ããŒã¿ãæã£ãŠã¯ãããªã
* ã»ãã·ã§ã³ã¯äžå çãª[ããŒã¿ããŒã¹](#ããŒã¿ããŒã¹) (SQLã NoSQL)ãªã©ã®ããŒã¿ã¹ãã¢ã«ã¹ãã¢ãããã [ãã£ãã·ã¥](#ãã£ãã·ã¥) (Redisã Memcached)ã«æ®ãå¿ èŠããããŸãã
* ãã£ãã·ã¥ãããŒã¿ããŒã¹ãªã©ã®äžæµãµãŒããŒã¯äžæµãµãŒããŒãã¹ã±ãŒã«ã¢ãŠãããã«ã€ããŠããå€ãã®åææ¥ç¶ãä¿ããªããã°ãªããŸããã### æ¬ ç¹: ããŒããã©ã³ãµãŒ
* ããŒããã©ã³ãµãŒã¯ãªãœãŒã¹ãäžè¶³ããŠããããèšå®ãé©åã§ãªãå Žåãã·ã¹ãã å šäœã®ããã«ããã¯ã«ãªãå¯èœæ§ããããŸãã
* åäžé害ç¹ãé€ãããšããŠããŒããã©ã³ãµãŒãå°å ¥ããçµæãè€éããå¢ããŠããŸãããšã«ãªããŸãã
* ããŒããã©ã³ãµãŒãäžã€ã ãã ãšãããåäžé害ç¹ã«ãªã£ãŠããŸããŸããäžæ¹ã§ãããŒããã©ã³ãµãŒãè€æ°ã«ãããšãããã«è€éããå¢ããŠããŸããŸãã### ãã®ä»ã®åèè³æãããŒãž
* [NGINX ã¢ãŒããã¯ãã£](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)
* [HAProxy ã¢ãŒããã¯ãã£ã¬ã€ã](http://www.haproxy.org/download/1.2/doc/architecture.txt)
* [ã¹ã±ãŒã©ããªãã£](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones)
* [Wikipedia](https://en.wikipedia.org/wiki/Load_balancing_(computing))
* [Layer 4 ããŒããã©ã³ã·ã³ã°](https://www.nginx.com/resources/glossary/layer-4-load-balancing/)
* [Layer 7 ããŒããã©ã³ã·ã³ã°](https://www.nginx.com/resources/glossary/layer-7-load-balancing/)
* [ELB listener config](http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-listener-config.html)## ãªããŒã¹ãããã·(webãµãŒããŒ)
ãªããŒã¹ãããã·ãµãŒããŒã¯å éšãµãŒãã¹ããŸãšããŠå€éšã«çµ±äžãããã€ã³ã¿ãŒãã§ãŒã¹ãæäŸãããŠã§ããµãŒããŒã§ããã¯ã©ã€ã¢ã³ãããã®ãªã¯ãšã¹ãã¯ããã«å¯Ÿå¿ãããµãŒããŒã«éãããŠããã®åŸã¬ã¹ãã³ã¹ããªããŒã¹ãããã·ãã¯ã©ã€ã¢ã³ãã«è¿ããŸãã
ä»ã«ã¯ä»¥äžã®ãããªå©ç¹ããããŸã:
* **ããå ç¢ãªã»ãã¥ãªãã£** - ããã¯ãšã³ããµãŒããŒã®æ å ±ãé ããããIPã¢ãã¬ã¹ããã©ãã¯ãªã¹ãåããããã¯ã©ã€ã¢ã³ãããšã®æ¥ç¶æ°ãå¶éãããã§ããŸãã
* **ã¹ã±ãŒã©ããªãã£ãæè»æ§ãå¢ããŸã** - ã¯ã©ã€ã¢ã³ãã¯ãªããŒã¹ãããã·ã®IPããèŠãªãã®ã§ãè£ã§ãµãŒããŒãã¹ã±ãŒã«ããããèšå®ãå€ãããããªããŸãã
* **SSL termination** - å ¥åããããªã¯ãšã¹ãã解èªãããµãŒããŒã®ã¬ã¹ãã³ã¹ãæå·åããããšã§ãµãŒããŒããã®ã³ã¹ãã®ãããããåŠçãããªããŠæžãããã«ãªããŸãã
* [X.509 蚌ææž](https://en.wikipedia.org/wiki/X.509) ãåãµãŒããŒã«ã€ã³ã¹ããŒã«ããå¿ èŠããªããªããŸãã
* **å§çž®** - ãµãŒããŒã¬ã¹ãã³ã¹ãå§çž®ã§ããŸã
* **ãã£ãã·ã³ã°** - ãã£ãã·ã¥ããããªã¯ãšã¹ãã«å¯ŸããŠãã¬ã¹ãã³ã¹ãè¿ããŸã
* **éçã³ã³ãã³ã** - éçã³ã³ãã³ããçŽæ¥éä¿¡ããããšãã§ããŸãã
* HTML/CSS/JS
* åç
* åç»
* ãªã©ãªã©### ããŒããã©ã³ãµãŒ vs ãªããŒã¹ãããã·
* è€æ°ã®ãµãŒããŒãããæã«ã¯ããŒããã©ã³ãµãŒããããã€ãããšåœ¹ã«ç«ã€ã§ãããã ãã°ãã°ãããŒããã©ã³ãµãŒã¯åãæ©èœãæãããµãŒããŒçŸ€ãžã®ãã©ãã£ãã¯ãæããŸãã
* ãªããŒã¹ãããã·ã§ã¯ãäžèšã«è¿°ã¹ããããªå©ç¹ããåäžã®ãŠã§ããµãŒããŒãã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒã«å¯ŸããŠã瀺ãããšãã§ããŸãã
* NGINX ã HAProxy ãªã©ã®æè¡ã¯layer 7 ãªããŒã¹ãããã·ãšããŒããã©ã³ãµãŒã®äž¡æ¹ããµããŒãããŸãã### æ¬ ç¹: ãªããŒã¹ãããã·
* ãªããŒã¹ãããã·ãå°å ¥ãããšã·ã¹ãã ã®è€éæ§ãå¢ããŸãã
* åäžã®ãªããŒã¹ãããã·ã¯åäžé害ç¹ã«ãªãããŸããäžæ¹ã§ãè€æ°ã®ãªããŒã¹ãããã·ãå°å ¥ãããš(äŸ: [ãã§ã€ã«ãªãŒããŒ](https://en.wikipedia.org/wiki/Failover)) è€éæ§ã¯ããå¢ããŸãã### ãã®ä»ã®åèè³æãããŒãž
* [ãªããŒã¹ãããã· vs ããŒããã©ã³ãµãŒ](https://www.nginx.com/resources/glossary/reverse-proxy-vs-load-balancer/)
* [NGINX ã¢ãŒããã¯ãã£](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/)
* [HAProxy ã¢ãŒããã¯ã㣠ã¬ã€ã](http://www.haproxy.org/download/1.2/doc/architecture.txt)
* [Wikipedia](https://en.wikipedia.org/wiki/Reverse_proxy)## ã¢ããªã±ãŒã·ã§ã³å±€
Source: Intro to architecting systems for scaleãŠã§ãã¬ã€ã€ãŒãã¢ããªã±ãŒã·ã§ã³å±€ (ãã©ãããã©ãŒã å±€ãšãèšããã) ãšåé¢ããããšã§ããããã®å±€ãç¬ç«ã«ã¹ã±ãŒã«ãèšå®ããããšãã§ããããã«ãªããŸããæ°ããAPIãã¢ããªã±ãŒã·ã§ã³å±€ã«è¿œå ããéã«ãäžå¿ èŠã«ãŠã§ããµãŒããŒãè¿œå ããå¿ èŠããªããªããŸãã
**åäžè²¬ä»»ã®åå** ã§ã¯ãå°ããèªåŸçãªãµãŒãã¹ãå調ããŠåãããã«æå±ããŠããŸããå°ãããµãŒãã¹ã®å°ããããŒã ãæ¥æé·ã®ããã«ããç©æ¥µçãªèšç»ãç«ãŠãããããã«ããããã§ãã
ã¢ããªã±ãŒã·ã§ã³å±€ã¯[éåæåŠç](#éåæåŠç)ããµããŒãããŸãã
### ãã€ã¯ããµãŒãã¹
ç¬ç«ããŠãããã€ã§ãããå°èŠæš¡ãªã¢ãžã¥ãŒã«æ§åŒã§ãã[ãã€ã¯ããµãŒãã¹](https://en.wikipedia.org/wiki/Microservices)ããã®è°è«ã«é¢ä¿ããŠããæè¡ã§ããããããããã®ãµãŒãã¹ã¯ç¬èªã®ããã»ã¹ãåŠçããæ確ã§è»œéãªã¡ã«ããºã ã§éä¿¡ããŠããã®ç®çãšããæ©èœãå®çŸããŸãã1
äŸãã°Pinterestã§ã¯ä»¥äžã®ãããªãã€ã¯ããµãŒãã¹ã«åãããŠããŸãããŠãŒã¶ãŒãããã£ãŒã«ããã©ãã¯ãŒããã£ãŒããæ€çŽ¢ãåçã¢ããããŒããªã©ã§ãã
### ãµãŒãã¹ãã£ã¹ã«ããªãŒ
[Consul](https://www.consul.io/docs/index.html)ã [Etcd](https://coreos.com/etcd/docs/latest)ã [Zookeeper](http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) ãªã©ã®ã·ã¹ãã ã§ã¯ãç»é²ãããŠãããµãŒãã¹ã®ååãã¢ãã¬ã¹ãããŒãã®æ å ±ãç£èŠããããšã§ããµãŒãã¹å士ãäºããèŠã€ããããããŠããŸãããµãŒãã¹ã®å®å šæ§ã®ç¢ºèªã«ã¯ [Health checks](https://www.consul.io/intro/getting-started/checks.html) ã䟿å©ã§ãããã«ã¯ [HTTP](#hypertext-transfer-protocol-http) ãšã³ããã€ã³ãããã䜿ãããŸãã Consul ãš Etcd ã®ããããçµã¿èŸŒã¿ã® [key-value store](#ããŒããªã¥ãŒã¹ãã¢) ãæã£ãŠãããèšå®ããŒã¿ãå ±æããŒã¿ãªã©ã®ããŒã¿ãä¿åããŠããããšã«äœ¿ãããŸãã
### æ¬ ç¹: ã¢ããªã±ãŒã·ã§ã³å±€
* ã¢ãŒããã¯ãã£ãéçšããããŠããã»ã¹ãèæ ®ãããšãç·©ãçµã³ä»ããããã¢ããªã±ãŒã·ã§ã³å±€ãè¿œå ããã«ã¯ãã¢ããªã·ãã¯ãªã·ã¹ãã ãšã¯ç°ãªãã¢ãããŒããå¿ èŠã§ãã
* ãã€ã¯ããµãŒãã¹ã¯ãããã€ãšéçšã®ç¹ããèŠããšè€éæ§ãå¢ãããšã«ãªããŸãã### ãã®ä»ã®åèè³æãããŒãž
* [ã¹ã±ãŒã«ããã·ã¹ãã ã¢ãŒããã¯ãã£ãèšèšããããã®ã€ã³ãã](http://lethain.com/introduction-to-architecting-systems-for-scale)
* [ã·ã¹ãã èšèšã€ã³ã¿ãã¥ãŒãçŽè§£ã](http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview)
* [ãµãŒãã¹æåã¢ãŒããã¯ãã£](https://en.wikipedia.org/wiki/Service-oriented_architecture)
* [Zookeeperã®ã€ã³ãããã¯ã·ã§ã³](http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper)
* [ãã€ã¯ããµãŒãã¹ãäœãããã«ç¥ã£ãŠããããããš](https://cloudncode.wordpress.com/2016/07/22/msa-getting-started/)## ããŒã¿ããŒã¹
Source: Scaling up to your first 10 million users### ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãããžã¡ã³ãã·ã¹ãã (RDBMS)
SQLãªã©ã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã¯ããŒãã«ã«æŽçãããããŒã¿ã®éåã§ããã
**ACID** ã¯ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ããã[ãã©ã³ã¶ã¯ã·ã§ã³](https://en.wikipedia.org/wiki/Database_transaction)ã®ããããã£ã®éåã§ãã
* **äžå¯åæ§** - ããããã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ããããªããã®ããããã§ãã
* **äžè²«æ§** - ã©ããªãã©ã³ã¶ã¯ã·ã§ã³ãããŒã¿ããŒã¹ããã確ããªç¶æ ãã次ã®ç¶æ ã«é·ç§»ãããã
* **ç¬ç«æ§** - åæã«ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããããšã¯ãé£ç¶çã«ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããã®ãšåãçµæãããããã
* **æ°žç¶æ§** - ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããããããã®ããã«ä¿åããããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãã¹ã±ãŒã«ãããããã«ã¯ããããã®æè¡ããã: **ãã¹ã¿ãŒã»ã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³**ã **ãã¹ã¿ãŒã»ãã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³**ã **federation**ã **ã·ã£ãŒãã£ã³ã°**ã **éæ£èŠå**ã ãã㊠**SQL ãã¥ãŒãã³ã°**
#### ãã¹ã¿ãŒã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³
ãã¹ã¿ãŒããŒã¿ããŒã¹ãèªã¿åããšæžã蟌ã¿ãåŠçããæžã蟌ã¿ãäžã€ä»¥äžã®ã¹ã¬ãŒãããŒã¿ããŒã¹ã«è€è£œããŸããã¹ã¬ãŒãããŒã¿ããŒã¹ã¯èªã¿åãã®ã¿ãåŠçããŸããã¹ã¬ãŒãããŒã¿ããŒã¹ã¯æšæ§é ã®ããã«è¿œå ã®ã¹ã¬ãŒãã«ããŒã¿ãè€è£œããããšãã§ããŸãããã¹ã¿ãŒããŒã¿ããŒã¹ããªãã©ã€ã³ã«ãªã£ãå Žåã«ã¯ãããããã®ã¹ã¬ãŒãããã¹ã¿ãŒã«ææ Œããããæ°ãããã¹ã¿ãŒããŒã¿ããŒã¹ãè¿œå ããããŸã§ã¯èªã¿åãå°çšã¢ãŒãã§çšŒåããŸãã
Source: Scalability, availability, stability, patterns##### æ¬ ç¹: ãã¹ã¿ãŒã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³
* ã¹ã¬ãŒãããã¹ã¿ãŒã«ææ Œãããã«ã¯è¿œå ã®ããžãã¯ãå¿ èŠã«ãªãã
* ãã¹ã¿ãŒã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ããã¹ã¿ãŒãã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³ã® **äž¡æ¹** ã®æ¬ ç¹ã¯[æ¬ ç¹: ã¬ããªã±ãŒã·ã§ã³](#æ¬ ç¹-ãã¹ã¿ãŒã¹ã¬ãŒã-ã¬ããªã±ãŒã·ã§ã³)ãåç §#### ãã¹ã¿ãŒãã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³
ãããã®ãã¹ã¿ãŒãèªã¿åãæžã蟌ã¿ã®äž¡æ¹ã«å¯Ÿå¿ãããæžã蟌ã¿ã«é¢ããŠã¯ããããå調ãããããããã®ãã¹ã¿ãŒãèœã¡ãŠããã·ã¹ãã å šäœãšããŠã¯èªã¿æžãäž¡æ¹ã«å¯Ÿå¿ãããŸãŸéçšã§ããã
Source: Scalability, availability, stability, patterns##### æ¬ ç¹: ãã¹ã¿ãŒãã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³
* ããŒããã©ã³ãµãŒãå°å ¥ããããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãå€æŽããããšã§ã©ãã«æžã蟌ãããæå®ããªããã°ãªããªãã
* 倧äœã®ãã¹ã¿ãŒãã¹ã¿ãŒã·ã¹ãã ã¯ãäžè²«æ§ãç·©ãïŒACIDåçãå®ã£ãŠããªãïŒãããã¯ãåæããæéããããããã«æžã蟌ã¿ã®ã¬ã€ãã³ã·ãŒãå¢å ããŠããŸã£ãŠããã
* æžã蟌ã¿ããŒããè¿œå ãããã¬ã€ãã³ã·ãŒãå¢å ããã«ã€ãæžã蟌ã¿ã®è¡çªã®å¯èœæ§ãå¢ããã
* ãã¹ã¿ãŒã¹ã¬ãŒã ã¬ããªã±ãŒã·ã§ã³ããã¹ã¿ãŒãã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³ã® **äž¡æ¹** ã®æ¬ ç¹ã¯[æ¬ ç¹: ã¬ããªã±ãŒã·ã§ã³](#æ¬ ç¹-ãã¹ã¿ãŒã¹ã¬ãŒã-ã¬ããªã±ãŒã·ã§ã³) ãåç §##### æ¬ ç¹: ã¬ããªã±ãŒã·ã§ã³
* æ°ããããŒã¿æžã蟌ã¿ãè€è£œããåã«ãã¹ã¿ãŒãèœã¡ãå Žåã«ã¯ãã®ããŒã¿ã倱ãããŠããŸãå¯èœæ§ãããã
* æžã蟌ã¿ã¯èªã¿åãã¬ããªã«ã«ãããŠãªãã¬ã€ããããæžã蟌ã¿ãå€ãå Žåãè€è£œããŒããæžã蟌ã¿ã®åŠçã®ã¿ã§è¡ãè©°ãŸã£ãŠãèªã¿åãã®åŠçãæºè¶³ã«è¡ããªãå¯èœæ§ãããã
* èªã¿åãã¹ã¬ãŒãããŒãã®æ°ãå€ããã°å€ãã»ã©ãè€è£œããªããã°ãªããªãæ°ãå¢ããè€è£œæéã䌞ã³ãŠããŸããŸãã
* ã·ã¹ãã ã«ãã£ãŠã¯ããã¹ã¿ãŒãžã®æžã蟌ã¿ã¯ãã«ãã¹ã¬ããã§äžŠååŠçã§ããäžæ¹ãã¹ã¬ãŒããžã®è€è£œã¯åäžã¹ã¬ããã§é£ç¶çã«åŠçããªããã°ãªããªãå ŽåããããŸãã
* ã¬ããªã±ãŒã·ã§ã³ã§ã¯è¿œå ã®ããŒããŠã§ã¢ãå¿ èŠã«ãªããè€éæ§ãå¢ããŸãã##### ãã®ä»ã®åèè³æãããŒãž: ã¬ããªã±ãŒã·ã§ã³
* [ã¹ã±ãŒã©ããªãã£ã å¯çšæ§ã ã¹ã¿ããªã㣠ãã¿ãŒã³](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/)
* [ãã«ããã¹ã¿ãŒ ã¬ããªã±ãŒã·ã§ã³](https://en.wikipedia.org/wiki/Multi-master_replication)#### Federation
Source: Scaling up to your first 10 million usersãã§ãã¬ãŒã·ã§ã³ (ãããã¯æ©èœåå²åãšãèšã) ã¯ããŒã¿ããŒã¹ãæ©èœããšã«åå²ãããäŸãã°ãã¢ããªã·ãã¯ãªåäžããŒã¿ããŒã¹ã®ä»£ããã«ãããŒã¿ããŒã¹ã **ãã©ãŒã©ã **ã **ãŠãŒã¶ãŒ**ã **ãããã¯ã** ã®ããã«äžã€ã«ããããšã§ãããŒã¿ããŒã¹äžã€ãããã®æžã蟌ã¿ã»èªã¿åãã®ãã©ãã£ãã¯ãæžãããã®çµæã¬ããªã±ãŒã·ã§ã³ã®ã©ã°ãçããªããŸããããŒã¿ããŒã¹ãå°ãããªãããšã§ãã¡ã¢ãªãŒã«åãŸãããŒã¿ãå¢ããŸãããã£ãã·ã¥ã®å±ææ§ãé«ãŸãããããã£ãã·ã¥ãããçãäžãããŸããåäžã®äžå€®ãã¹ã¿ãŒã§æžã蟌ã¿ãçŽååãããããªãããã䞊åã§æžã蟌ã¿ãåŠçããããšãã§ããã¹ã«ãŒãããã®åäžãæåŸ ã§ããŸãã
##### æ¬ ç¹: federation
* 倧èŠæš¡ãªåŠçãããŒãã«ãèŠããã¹ããŒãã®å Žåããã§ãã¬ãŒã·ã§ã³ã¯å¹æçãšã¯èšããªãã§ãããã
* ã©ã®ããŒã¿ããŒã¹ã«èªã¿æžããããã®ããæå®ããã¢ããªã±ãŒã·ã§ã³ããžãã¯ãæŽæ°ããªããã°ãªããŸããã
* [server link](http://stackoverflow.com/questions/5145637/querying-data-by-joining-two-tables-in-two-database-on-different-servers)ã§äºã€ã®ããŒã¿ããŒã¹ããã®ããŒã¿ãé£çµããã®ã¯ããè€éã«ãªãã§ãããã
* ãã§ãã¬ãŒã·ã§ã³ã§ã¯è¿œå ã®ããŒããŠã§ã¢ãå¿ èŠã«ãªããè€éæ§ãå¢ããŸãã##### ãã®ä»ã®åèè³æãããŒãž: federation
* [Scaling up to your first 10 million users](https://www.youtube.com/watch?v=w95murBkYmU)
#### ã·ã£ãŒãã£ã³ã°
Source: Scalability, availability, stability, patternsã·ã£ãŒãã£ã³ã°ã§ã¯ç°ãªãããŒã¿ããŒã¹ã«ãããããããŒã¿ã®ãµãã»ããæçã®ã¿ãæã€ããã«ããŒã¿ãåå²ããŸãããŠãŒã¶ãŒããŒã¿ããŒã¹ãäŸã«ãšããšããŠãŒã¶ãŒæ°ãå¢ããã«ã€ããŠã¯ã©ã¹ã¿ãŒã«ã¯ããå€ãã®æçãå ããããããšã«ãªããŸãã
[federation](#federation)ã®å©ç¹ã«äŒŒãŠããŠãã·ã£ãŒãã£ã³ã°ã§ã¯èªã¿æžãã®ãã©ãã£ãã¯ãæžãããã¬ããªã±ãŒã·ã§ã³ãæžããããã£ãã·ã¥ããããå¢ããããšãã§ããŸããã€ã³ããã¯ã¹ãµã€ãºãæžããããšãã§ããŸããäžè¬çã«ã¯ã€ã³ããã¯ã¹ãµã€ãºãæžãããšãããã©ãŒãã³ã¹ãåäžãã¯ãšãªé床ãéããªããŸãããªã«ãããã®ããŒã¿ãè€è£œããæ©èœããªããã°ããŒã¿ãã¹ã«ã€ãªãããŸããããããäžã€ã®ã·ã£ãŒããèœã¡ãŠããä»ã®ã·ã£ãŒããåããŠããããšã«ãªããŸãããã§ãã¬ãŒã·ã§ã³ãšåãããåäžã®äžå€®ãã¹ã¿ãŒãæžã蟌ã¿ã®åŠçãããªããŠãã䞊åã§æžã蟌ã¿ãåŠçããããšãã§ããã¹ã«ãŒãããã®åäžãæåŸ ã§ããŸãã
ãŠãŒã¶ãŒããŒãã«ãã·ã£ãŒãããäžè¬çãªæ¹æ³ã¯ããŠãŒã¶ãŒã®ã©ã¹ãããŒã ã€ãã·ã£ã«ã§ã·ã£ãŒããããããŠãŒã¶ãŒã®å°ççé 眮ã§ã·ã£ãŒããããªã©ã§ãã
##### æ¬ ç¹: ã·ã£ãŒãã£ã³ã°
* ã·ã£ãŒãã«å¯Ÿå¿ããããã«ã¢ããªã±ãŒã·ã§ã³ããžãã¯ãå€æŽããªããã°ãªããŸãããçµæãšããŠSQLã¯ãšãªãè€éã«ãªããŸãã
* ã·ã£ãŒãã§ã¯ããŒã¿é åããã³ã€ã«ãªã£ãŠããŸãå¯èœæ§ããããŸããäŸãã°ãæšæºãŠãŒã¶ãŒã®éåãæã€ã·ã£ãŒããããå Žåããã®ã·ã£ãŒããä»ã®ã·ã£ãŒããããéãè² è·ãè² ãããšã«ãªããŸãã
* ãªãã©ã³ã·ã³ã°ããããšè€éæ§ãããå¢ããŸãã[consistent hashing](http://www.paperplanes.de/2011/12/9/the-magic-of-consistent-hashing.html) ã«åºã¥ããã·ã£ãŒãã£ã³ã°ã§ã¯ãéä¿¡ããŒã¿ãåæžããããšãã§ããŸãã
* è€æ°ã®ã·ã£ãŒãããã®ããŒã¿ãé£çµããã®ã¯ããè€éã§ãã
* ã·ã£ãŒãã£ã³ã°ã§ã¯è¿œå ã®ããŒããŠã§ã¢ãå¿ èŠã«ãªããè€éæ§ãå¢ããŸãã##### ãã®ä»ã®åèè³æãããŒãž: ã·ã£ãŒãã£ã³ã°
* [ã·ã£ãŒãã®ç»å Ž](http://highscalability.com/blog/2009/8/6/an-unorthodox-approach-to-database-design-the-coming-of-the.html)
* [ã·ã£ãŒãããŒã¿ããŒã¹ã¢ãŒããã¯ãã£](https://en.wikipedia.org/wiki/Shard_(database_architecture))
* [Consistent hashing](http://www.paperplanes.de/2011/12/9/the-magic-of-consistent-hashing.html)#### éæ£èŠå
éæ£èŠåã§ã¯ãæžã蟌ã¿ã®ããã©ãŒãã³ã¹ãããããç ç²ã«ããŠèªã¿èŸŒã¿ã®ããã©ãŒãã³ã¹ãåäžãããããšããŸããèšç®çã«éãããŒãã«ã®çµåãªã©ãããã«ãè€æ°ã®ããŒãã«ã«åé·ãªããŒã¿ã®ã³ããŒãæžã蟌ãŸããã®ã蚱容ããŸããããã€ãã®RDBMSäŸãã°ã[PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL) ãOracleã¯ãã®åé·ãªæ å ±ãåãæ±ããäžè²«æ§ãä¿ã€ããã®[materialized views](https://en.wikipedia.org/wiki/Materialized_view) ãšããæ©èœããµããŒãããŠããŸãã
[ãã§ãã¬ãŒã·ã§ã³](#federation) ã [ã·ã£ãŒãã£ã³ã°](#ã·ã£ãŒãã£ã³ã°)ãªã©ã®ãã¯ããã¯ã«ãã£ãŠããããã®ããŒã¿ã»ã³ã¿ãŒã«åé ãããããŒã¿ãåäžãããããšã¯ãšãŠãè€éãªäœæ¥ã§ããéæ£èŠåã«ãã£ãŠãã®ãããªè€éãªåŠçãããªããŠæžãããã«ãªããŸãã
å€ãã®ã·ã¹ãã ã§ã100察1ãããã¯1000察1ãããã«ãªããããèªã¿åãã®æ¹ããæžã蟌ã¿ã®ãã©ãã£ãã¯ãããå€ãããšã§ããããèªã¿èŸŒã¿ãè¡ãããã«ãè€éãªããŒã¿ããŒã¹ã®ãžã§ã€ã³åŠçãå«ãŸãããã®ã¯èšç®çã«é«äŸ¡ã«ã€ããŸããããã£ã¹ã¯ã®åŠçæéã§èšå€§ãªæéãè²»æ¶ããŠããŸãããšã«ãªããŸãã
##### æ¬ ç¹: éæ£èŠå
* ããŒã¿ãè€è£œãããã
* åé·ãªããŒã¿ã®è€è£œãåæãããããã«å¶çŽãååšãããã®ããšã§ããŒã¿ããŒã¹å šäœã®èšèšãè€éåããã
* éæ£èŠåãããããŒã¿ããŒã¹ã¯é倧ãªæžã蟌ã¿ãåŠçããªããã°ãªããªãå Žåãæ£èŠåãããŠãããããããããã©ãŒãã³ã¹ã«ãããŠå£ãå¯èœæ§ãããã###### ãã®ä»ã®åèè³æãããŒãž: éæ£èŠå
* [Denormalization](https://en.wikipedia.org/wiki/Denormalization)
#### SQLãã¥ãŒãã³ã°
SQLãã¥ãŒãã³ã°ã¯åºç¯ãªç¥èãå¿ èŠãšããåéã§å€ãã® [æ¬](https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=sql+tuning) ãæžãããŠããŸãã
ããã«ããã¯ãæããã«ããã·ãã¥ã¬ãŒãããäžã§ã **ãã³ãããŒã¯** ãå®ãã **ãããã¡ã€ã«** ããããšã¯ãšãŠãéèŠã§ãã
* **ãã³ãããŒã¯** - [ab](http://httpd.apache.org/docs/2.2/programs/ab.html)ãªã©ã®ããŒã«ãçšããŠãé«è² è·ã®ç¶æ³ãã·ãã¥ã¬ãŒã·ã§ã³ããŠã¿ãŸãããã
* **ãããã¡ã€ã«** - [slow query log](http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html) ãªã©ã®ããŒã«ãçšããŠãããã©ãŒãã³ã¹ç¶æ³ã®ç¢ºèªãããŸãããããã³ãããŒã¯ãšãããã¡ã€ã«ããšãããšã§ä»¥äžã®ãããªå¹çåã®éžæè¢ããšãããšã«ãªãã§ãããã
##### ã¹ããŒããçµã
* MySQLã¯ã¢ã¯ã»ã¹é床åäžã®ããããã£ã¹ã¯äžã®é£ç¶ãããããã¯ãžããŒã¿ãæ ŒçŽããŠããŸãã
* é·ãã®æ±ºãŸã£ããã£ãŒã«ãã«å¯ŸããŠã¯ `VARCHAR` ããã `CHAR` ã䜿ãããã«ããŸãããã
* `CHAR` ã®æ¹ãå¹ççã«éãã©ã³ãã ã«ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã äžæ¹ã `VARCHAR` ã§ã¯æ¬¡ã®ããŒã¿ã«ç§»ãåã«ããŒã¿ã®æ«å°Ÿãæ€ç¥ããªããã°ãªããªãããã«é床ãç ç²ã«ãªããŸãã
* ããã°ã®æçš¿ãªã©ã倧ããªããã¹ãã«ã¯ TEXT ã䜿ããŸãããã TEXT ã§ã¯ããŒãªã¢ã³åã®æ€çŽ¢ãå¯èœã§ãã TEXT ãã£ãŒã«ãã«ã¯ãããã¹ããããã¯ãé 眮ãããŠããããã£ã¹ã¯äžã®å Žæãžã®ãã€ã³ã¿ãŒãä¿åãããŸãã
* 2ã®32ä¹ã40å以äžãè¶ ããªãçšåºŠã®å€§ããªæ°ã«ã¯ INT ã䜿ããŸãããã
* é貚ã«é¢ããŠã¯å°æ°ç¹è¡šç€ºäžã®ãšã©ãŒãé¿ããããã« `DECIMAL` ã䜿ããŸãããã
* 倧ã㪠`BLOBS` ãä¿åããã®ã¯é¿ããŸããããã©ããããã®ãªããžã§ã¯ããåã£ãŠããããšãã§ãããã®æ å ±ãä¿åããŸãããã
* `VARCHAR(255)` ã¯8ãããã§æ°ããããæ倧ã®æåæ°ã§ããäžéšã®DBMSã§ã¯ã1ãã€ãã®å©çšå¹çãæ倧åããããã«ãã®æåæ°ããã䜿ãããŸãã
* [æ€çŽ¢æ§èœåäžã®ãã](http://stackoverflow.com/questions/1017239/how-do-null-values-affect-performance-in-a-database-search) ãå¯èœã§ããã° `NOT NULL` å¶çŽãèšå®ããŸãããã##### ã€ã³ããã¯ã¹ãå¹æçã«çšãã
* ã¯ãšãª(`SELECT`ã `GROUP BY`ã `ORDER BY`ã `JOIN`) ã®å¯Ÿè±¡ãšãªãåã«ã€ã³ããã¯ã¹ã䜿ãããšã§é床ãåäžã§ãããããããŸããã
* ã€ã³ããã¯ã¹ã¯éåžžã平衡æ¢çŽ¢æšã§ãã[Bæš](https://en.wikipedia.org/wiki/B-tree)ã®åœ¢ã§è¡šãããŸããBæšã«ããããŒã¿ã¯åžžã«ãœãŒããããç¶æ ã«ãªããŸãããŸãæ€çŽ¢ãé 次ã¢ã¯ã»ã¹ãæ¿å ¥ãåé€ã察æ°æéã§è¡ããŸãã
* ã€ã³ããã¯ã¹ãé 眮ããããšã¯ããŒã¿ãã¡ã¢ãªãŒã«æ®ãããšã«ã€ãªãããã容éãå¿ èŠãšããŸãã
* ã€ã³ããã¯ã¹ã®æŽæ°ãå¿ èŠã«ãªãããæžã蟌ã¿ãé ããªããŸãã
* 倧éã®ããŒã¿ãããŒãããéã«ã¯ãã€ã³ããã¯ã¹ãåã£ãŠããããŒã¿ãããŒãããŠåã³ã€ã³ããã¯ã¹ããã«ãããæ¹ãéãããšããããŸãã##### é«è² è·ãªãžã§ã€ã³ãé¿ãã
* ããã©ãŒãã³ã¹äžå¿ èŠãªãšããã«ã¯[éæ£èŠå](#éæ£èŠå)ãé©çšãã
##### ããŒãã«ã®ããŒãã£ã·ã§ã³
* ããŒãã«ãåå²ãããããã¹ããããç¬ç«ããããŒãã«ã«åé¢ããŠã¡ã¢ãªãŒã«ä¹ããããããã«ããã
##### ã¯ãšãªãã£ãã·ã¥ã調æŽãã
* å Žåã«ãã£ãŠã¯[ã¯ãšãªãã£ãã·ã¥](http://dev.mysql.com/doc/refman/5.7/en/query-cache) ã[ããã©ãŒãã³ã¹åé¡](https://www.percona.com/blog/2014/01/28/10-mysql-performance-tuning-settings-after-installation/) ãåŒãèµ·ããå¯èœæ§ããã
##### ãã®ä»ã®åèè³æãããŒãž: SQLãã¥ãŒãã³ã°
* [MySQLã¯ãšãªãæé©åããããã®Tips](http://20bits.com/article/10-tips-for-optimizing-mysql-queries-that-dont-suck)
* [VARCHAR(255)ããããããèŠãããã®ã¯ãªãã§ïŒ](http://stackoverflow.com/questions/1217466/is-there-a-good-reason-i-see-varchar255-used-so-often-as-opposed-to-another-l)
* [nullå€ã¯ã©ã®ããã«ããã©ãŒãã³ã¹ã«åœ±é¿ããã®ãïŒ](http://stackoverflow.com/questions/1017239/how-do-null-values-affect-performance-in-a-database-search)
* [Slow query log](http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html)### NoSQL
NoSQL 㯠**key-value store**ã **document-store**ã **wide column store**ã ããã㯠**graph database**ã«ãã£ãŠè¡šçŸãããããŒã¿ã¢ã€ãã ã®éåã§ããããŒã¿ã¯äžè¬çã«æ£èŠåãããŠããããã¢ããªã±ãŒã·ã§ã³åŽã§ãžã§ã€ã³ãè¡ãããŸãã倧éšåã®NoSQLã¯çã®ACIDãã©ã³ã¶ã¯ã·ã§ã³ãæããã [çµææŽåæ§](#çµææŽåæ§) çãªæ¯ãèãã®æ¹ã奜ã¿ãŸãã
**BASE** ã¯ãã°ãã°NoSQLããŒã¿ããŒã¹ã®ããããã£ã説æããããã«çšããããŸãã[CAP Theorem](#cap-çè«) ãšå¯Ÿç §çã«ãBASEã¯äžè²«æ§ãããå¯çšæ§ãåªå ããŸãã
* **Basically available** - ã·ã¹ãã ã¯å¯çšæ§ãä¿èšŒããŸãã
* **Soft state** - ã·ã¹ãã ã®ç¶æ ã¯å ¥åããªããŠãæéçµéãšãšãã«å€åããå¯èœæ§ããããŸãã
* **çµææŽåæ§** - ã·ã¹ãã å šäœã¯æéçµéãšãšãã«ãã®éã«å ¥åããªããšããåæã®ããšãäžè²«æ§ãéæãããŸãã[SQLãïŒNoSQLãïŒ](#sqlãnosqlã) ãéžæããã®ã«å ããŠãã©ã®ã¿ã€ãã®NoSQLãã©ã®äœ¿çšäŸã«æãé©ããããç解ããã®ã¯ãšãŠãæçã§ãããã®ã»ã¯ã·ã§ã³ã§ã¯ **ããŒããªã¥ãŒã¹ãã¢**ã **ããã¥ã¡ã³ãã¹ãã¢**ã **ã¯ã€ãã«ã©ã ã¹ãã¢**ã ãš **ã°ã©ãããŒã¿ããŒã¹** ã«ã€ããŠè§ŠããŠãããŸãã
#### ããŒããªã¥ãŒã¹ãã¢
> æŠèŠ: ããã·ã¥ããŒãã«
ããŒããªã¥ãŒã¹ãã¢ã§ã¯äžè¬çã«O(1)ã®èªã¿æžããã§ãããããã¯ã¡ã¢ãªãªããSSDã§è£ä»ããããŠããŸããããŒã¿ã¹ãã¢ã¯ããŒã [èŸæžçé åº](https://en.wikipedia.org/wiki/Lexicographical_order) ã§ä¿æããããšã§ããŒã®å¹ççãªååŸãå¯èœã«ããŠããŸããããŒããªã¥ãŒã¹ãã¢ã§ã¯ã¡ã¿ããŒã¿ãå€ãšãšãã«ä¿æããããšãå¯èœã§ãã
ããŒããªã¥ãŒã¹ãã¢ã¯ãã€ããã©ãŒãã³ã¹ãªæåãå¯èœã§ãåçŽãªããŒã¿ã¢ãã«ãã€ã³ã¡ã¢ãªãŒãã£ãã·ã¥ã¬ã€ã€ãŒãªã©ã®ããŒã¿ãæ¥éã«å€ããå Žåãªã©ã«äœ¿ãããŸããåçŽãªåŠçã®ã¿ã«æ©èœãå¶éãããŠããã®ã§ãè¿œå ã®åŠçæ©èœãå¿ èŠãªå Žåã«ã¯ãã®è€éæ§ã¯ã¢ããªã±ãŒã·ã§ã³å±€ã«èŒããããšã«ãªããŸãã
ããŒããªã¥ãŒã¹ãã¢ã¯ãã£ãšè€éãªããã¥ã¡ã³ãã¹ãã¢ããã°ã©ãããŒã¿ããŒã¹ãªã©ã®åºæ¬ã§ãã
##### ãã®ä»ã®åèè³æãããŒãž: ããŒããªã¥ãŒã¹ãã¢
* [ããŒããªã¥ãŒããŒã¿ããŒã¹](https://en.wikipedia.org/wiki/Key-value_database)
* [ããŒããªã¥ãŒã¹ãã¢ã®æ¬ ç¹](http://stackoverflow.com/questions/4056093/what-are-the-disadvantages-of-using-a-key-value-table-over-nullable-columns-or)
* [Redisã¢ãŒããã¯ãã£](http://qnimate.com/overview-of-redis-architecture/)
* [ã¡ã ãã£ãã·ã¥ã¢ãŒããã¯ãã£](https://adayinthelifeof.nl/2011/02/06/memcache-internals/)#### ããã¥ã¡ã³ãã¹ãã¢
> æŠèŠ: ããã¥ã¡ã³ããããªã¥ãŒãšããŠä¿åãããããŒããªã¥ãŒã¹ãã¢
ããã¥ã¡ã³ãã¹ãã¢ã¯ãªããžã§ã¯ãã«é¢ããå šãŠã®æ å ±ãæã€ããã¥ã¡ã³ã(XMLã JSONã binaryãªã©)ãäžå¿ã«æ®ããã·ã¹ãã ã§ããããã¥ã¡ã³ãã¹ãã¢ã§ã¯ãããã¥ã¡ã³ãèªèº«ã®å éšæ§é ã«åºã¥ãããAPIãããã¯ã¯ãšãªèšèªãæäŸããŸãã *ã¡ã¢ïŒå€ãã®ããŒããªã¥ãŒã¹ãã¢ã§ã¯ãå€ã®ã¡ã¿ããŒã¿ãæ±ãæ©èœãå«ãã§ããŸããããã®ããšã«ãã£ãŠäºã€ããã¥ã¡ã³ãã¹ãã¢ãšã®å¢çç·ãææ§ã«ãªã£ãŠããŸã£ãŠããŸãã*
以äžã®ããšãå®çŸããããã«ãããã¥ã¡ã³ãã¯ã³ã¬ã¯ã·ã§ã³ãã¿ã°ãã¡ã¿ããŒã¿ããã£ã¬ã¯ããªãªã©ãšããŠæŽçãããŠããŸããããã¥ã¡ã³ãå士ã¯ãŸãšããŠã°ã«ãŒãã«ã§ãããã®ã®ãããããã§å šãç°ãªããã£ãŒã«ããæã€å¯èœæ§ããããŸãã
[MongoDB](https://www.mongodb.com/mongodb-architecture) ã [CouchDB](https://blog.couchdb.org/2016/08/01/couchdb-2-0-architecture/) ãªã©ã®ããã¥ã¡ã³ãã¹ãã¢ããè€éãªã¯ãšãªãåŠçããããã®SQLã®ãããªèšèªãæäŸããŠããŸãã[DynamoDB](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf) ã¯ããŒããªã¥ãŒãšããã¥ã¡ã³ãã®äž¡æ¹ããµããŒãããŠããŸãã
ããã¥ã¡ã³ãã¹ãã¢ã¯é«ãæè»æ§ãæ ä¿ããã®ã§ãé »ç¹ã«å€åããããŒã¿ãæ±ãæã«çšããããŸãã
##### ãã®ä»ã®åèè³æãããŒãž: ããã¥ã¡ã³ãã¹ãã¢
* [ããã¥ã¡ã³ãæå ããŒã¿ããŒã¹](https://en.wikipedia.org/wiki/Document-oriented_database)
* [MongoDB ã¢ãŒããã¯ãã£](https://www.mongodb.com/mongodb-architecture)
* [CouchDB ã¢ãŒããã¯ãã£](https://blog.couchdb.org/2016/08/01/couchdb-2-0-architecture/)
* [Elasticsearch ã¢ãŒããã¯ãã£](https://www.elastic.co/blog/found-elasticsearch-from-the-bottom-up)#### ã¯ã€ãã«ã©ã ã¹ãã¢
Source: SQL & NoSQL, a brief history> æŠèŠ: ãã¹ããããããã `ã«ã©ã ãã¡ããªãŒ<è¡ããŒã ã«ã©ã >`
ã¯ã€ãã«ã©ã ã¹ãã¢ã®ããŒã¿ã®åºæ¬åäœã¯ã«ã©ã ïŒããŒã ã»ããªã¥ãŒã®ãã¢ïŒã§ããããããã®ã«ã©ã ã¯ã«ã©ã ãã¡ããªãŒãšããŠïŒSQLããŒãã«ã®ããã«ïŒã°ã«ãŒãåããããšãã§ããŸããã¹ãŒããŒã«ã©ã ãã¡ããªãŒã¯ã«ã©ã ãã¡ããªãŒã®éåã§ããããããã®ã«ã©ã ã«ã¯è¡ããŒã§ã¢ã¯ã»ã¹ããããšãã§ããŸããåãè¡ããŒãæã€ã«ã©ã ã¯åãè¡ãšããŠèªèãããŸããããããã®å€ã¯ãããŒãžã§ã³ç®¡çãšã³ã³ããªã¯ããèµ·ããæã®ããã«ãã¿ã€ã ã¹ã¿ã³ããå«ã¿ãŸãã
Googleã¯[Bigtable](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf)ãåã®ã¯ã€ãã«ã©ã ã¹ãã¢ãšããŠçºè¡šããŸãããããããªãŒãã³ãœãŒã¹ã§Hadoopãªã©ã§ãã䜿ããã[HBase](https://www.mapr.com/blog/in-depth-look-hbase-architecture) ãFacebookã«ãã[Cassandra](http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/architecture/architectureIntro_c.html) ãªã©ã®ãããžã§ã¯ãã«åœ±é¿ãäžããŸãããBigTableãHBaseãCassandraãªã©ã®ã¹ãã¢ã¯ããŒãèŸæžåœ¢åŒã§ä¿æããããšã§éžæããããŒã¬ã³ãžã§ã®ããŒã¿ååŸãå¹ççã«ããŸãã
ã¯ã€ãã«ã©ã ã¹ãã¢ã¯é«ãå¯çšæ§ãšã¹ã±ãŒã©ããªãã£ãæ ä¿ããŸãããããã¯ãšãŠã倧èŠæš¡ãªããŒã¿ã»ãããæ±ãããšã«ãã䜿ãããŸãã
##### ãã®ä»ã®åèè³æãããŒãž: ã¯ã€ãã«ã©ã ã¹ãã¢
* [SQL & NoSQLç°¡åã«æŽå²ãããã](http://blog.grio.com/2015/11/sql-nosql-a-brief-history.html)
* [Bigtable ã¢ãŒããã¯ãã£](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf)
* [HBase ã¢ãŒããã¯ãã£](https://www.mapr.com/blog/in-depth-look-hbase-architecture)
* [Cassandra ã¢ãŒããã¯ãã£](http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/architecture/architectureIntro_c.html)#### ã°ã©ãããŒã¿ããŒã¹
> æŠèŠ: ã°ã©ã
ã°ã©ãããŒã¿ããŒã¹ã§ã¯ãããããã®ããŒããã¬ã³ãŒãã§ãããããã®ã¢ãŒã¯ã¯äºã€ã®ããŒããç¹ãé¢ä¿æ§ãšããŠå®çŸ©ãããŸããã°ã©ãããŒã¿ããŒã¹ã¯å€æ°ã®å€éšããŒãå€å¯Ÿå€ãªã©ã®è€éãªé¢ä¿æ§ãè¡šãã®ã«æé©ã§ãã
ã°ã©ãããŒã¿ããŒã¹ã¯SNSãªã©ã®ãµãŒãã¹ã®è€éãªé¢ä¿æ§ã¢ãã«ãªã©ã«ã€ããŠé«ãããã©ãŒãã³ã¹ãçºæ®ããŸããæ¯èŒçæ°ããããŸã äžè¬çã«ã¯çšããããŠããªãã®ã§ãéçºããŒã«ããªãœãŒã¹ãæ¢ãã®ãä»ã®æ¹æ³ã«æ¯ã¹ãŠé£ãããããããŸãããå€ãã®ã°ã©ãã¯[REST APIs](#representational-state-transfer-rest)ãéããŠã®ã¿ã¢ã¯ã»ã¹ã§ããŸãã
##### ãã®ä»ã®åèè³æãããŒãž: ã°ã©ã
* [GraphããŒã¿ããŒã¹](https://en.wikipedia.org/wiki/Graph_database)
* [Neo4j](https://neo4j.com/)
* [FlockDB](https://blog.twitter.com/2010/introducing-flockdb)#### ãã®ä»ã®åèè³æãããŒãž: NoSQL
* [åºæ¬çšèªã®èª¬æ](http://stackoverflow.com/questions/3342497/explanation-of-base-terminology)
* [NoSQLããŒã¿ããŒã¹ã«ã€ããŠèª¿æ»ãšéžæã¬ã€ã](https://medium.com/baqend-blog/nosql-databases-a-survey-and-decision-guidance-ea7823a822d#.wskogqenq)
* [ã¹ã±ãŒã©ããªãã£](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database)
* [NoSQLã®ã€ã³ãããã¯ã·ã§ã³](https://www.youtube.com/watch?v=qI_g07C_Q5I)
* [NoSQLãã¿ãŒã³](http://horicky.blogspot.com/2009/11/nosql-patterns.html)### SQLãïŒNoSQLãïŒ
Source: Transitioning from RDBMS to NoSQL**SQL** ãéžã¶çç±:
* æ§é åãããããŒã¿
* å³æ Œãªã¹ããŒã
* ãªã¬ãŒã·ã§ãã«ããŒã¿
* è€éãªãžã§ã€ã³ãããå¿ èŠæ§
* ãã©ã³ã¶ã¯ã·ã§ã³
* ã¹ã±ãŒã«ããéã®ãã¿ãŒã³ãæ確ãªãšã
* éçºè ã®æ°ãã³ãã¥ããã£ãã³ãŒãçãããå å®ããŠãã
* ã€ã³ããã¯ã¹ã«ããããŒã¿æ¢çŽ¢ã¯ãšãŠãéã**NoSQL** ãéžã¶çç±:
* æºæ§é åãããããŒã¿
* ãã€ãããã¯ãªããããã¬ãã·ãã«ãªã¹ããŒã
* ãã³ãªã¬ãŒã·ã§ãã«ãªããŒã¿
* è€éãªãžã§ã€ã³ãããå¿ èŠããªã
* ããŒã¿ã®å€ãã®TB (ããã㯠PB) ãä¿åãã
* éäžçã倧èŠæš¡ãªããŒã¿è² è·ã«èãããã
* IOPSã«ã€ããŠã¯æ¥µããŠé«ãã¹ã«ãŒãããã瀺ãNoSQLã«é©ãããµã³ãã«ããŒã¿:
* æ¥æ¿ãªã¯ãªãã¯ã¹ããªãŒã ããã°ããŒã¿ã®åé
* ãªãŒããŒããŒããã¹ã³ã¢ãªã³ã°ããŒã¿
* ã·ã§ããã³ã°ã«ãŒããªã©ã®äžæçæ å ±
* é »ç¹ã«ã¢ã¯ã»ã¹ããã ('ããããª') ããŒãã«
* ã¡ã¿ããŒã¿ãã«ãã¯ã¢ããããŒãã«##### ãã®ä»ã®åèè³æãããŒãž: ãSQLãããã¯NoSQL
* [æåã®1000äžãŠãŒã¶ãŒã«ã¹ã±ãŒã«ã¢ããããããã«](https://www.youtube.com/watch?v=w95murBkYmU)
* [SQLãšNoSQLã®éã](https://www.sitepoint.com/sql-vs-nosql-differences/)## ãã£ãã·ã¥
Source: Scalable system design patternsãã£ãã·ã¥ã¯ããŒãžã®èªã¿èŸŒã¿æéãåæžãããµãŒããŒãããŒã¿ããŒã¹ãžã®è² è·ãäœæžããããšãã§ããŸãããã®ã¢ãã«ã§ã¯ãå®éã®åŠçãä¿åããããã«ããã£ã¹ãããã£ãŒããŸã以åã«ãªã¯ãšã¹ããéä¿¡ããããã©ããã確èªããçŽåã®çµæãåãåããŸãã
ããŒã¿ããŒã¹ã¯ãã®ããŒãã£ã·ã§ã³ã«æž¡ã£ãŠçµ±åãããèªã¿åãæžã蟌ã¿ã®åé ãèŠæ±ããŸããã人æ°ã¢ã€ãã ã¯ãã®åé ãæªããŠã·ã¹ãã å šäœã®ããã«ããã¯ã«ãªã£ãŠããŸãããšããããŸããããŒã¿ããŒã¹ã®åã«ãã£ãã·ã¥ãå·®ã蟌ãããšã§ãã®ããã«ãåäžã§ãªãè² è·ããã©ãã£ãã¯ã®æ¥æ¿ãªå¢å ãåžåããããšãã§ããŸãã
### ã¯ã©ã€ã¢ã³ããã£ãã·ã³ã°
ãã£ãã·ã¥ã¯OSããã©ãŠã¶ãŒãªã©ã®ã¯ã©ã€ã¢ã³ããµã€ãã[ãµãŒããŒãµã€ã](#ãªããŒã¹ãããã·webãµãŒããŒ) ãããã¯ç¬ç«ã®ãã£ãã·ã¥ã¬ã€ã€ãŒã«èšçœ®ããããšãã§ããŸãã
### CDNãã£ãã·ã³ã°
[CDN](#ã³ã³ãã³ãããªããªãŒãããã¯ãŒã¯content-delivery-network) ããã£ãã·ã¥ã®äžã€ãšããŠèããããšãã§ããŸãã
### WebãµãŒããŒãã£ãã·ã³ã°
[ãªããŒã¹ãããã·](#ãªããŒã¹ãããã·webãµãŒããŒ) ã [Varnish](https://www.varnish-cache.org/) ãªã©ã®ãã£ãã·ã¥ã¯éçãããŠåçãªã³ã³ãã³ããçŽæ¥é ä¿¡ããããšãã§ããŸãã webãµãŒããŒããªã¯ãšã¹ãããã£ãã·ã¥ããŠã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã«æ¥ç¶ããããšãªãã«ã¬ã¹ãã³ã¹ãè¿ãããšãã§ããŸãã
### ããŒã¿ããŒã¹ãã£ãã·ã³ã°
ããŒã¿ããŒã¹ã¯æ®éãäžè¬çãªäœ¿çšç¶æ³ã«é©ãããããªãã£ãã·ã³ã°ã®èšå®ãåæç¶æ ã§æã£ãŠããŸãããã®èšå®ãç¹å®ã®ä»æ§ã«åãããŠèª¿æŽããããšã§ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
### ã¢ããªã±ãŒã·ã§ã³ãã£ãã·ã³ã°
ã¡ã ãã£ãã·ã¥ãªã©ã®In-memoryãã£ãã·ã¥ãRedisã¯ã¢ããªã±ãŒã·ã§ã³ãšããŒã¿ã¹ãã¬ãŒãžã®éã®ããŒããªã¥ãŒã¹ãã¢ã§ããããŒã¿ã¯RAMã§ä¿æããããããããŒã¿ããã£ã¹ã¯ã§ä¿åãããäžè¬çãªããŒã¿ããŒã¹ãããã ãã¶éãã§ããRAM容éã¯ãã£ã¹ã¯ãããéãããŠããã®ã§ã[least recently used (LRU)](https://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used)ãªã©ã®[cache invalidation](https://en.wikipedia.org/wiki/Cache_algorithms) ã¢ã«ãŽãªãºã ã 'ã³ãŒã«ã' ãªãšã³ããªã匟ãã'ããã' ãªããŒã¿ãRAMã«ä¿åããŸãã
Redisã¯ããã«ä»¥äžã®ãããªæ©èœãåããŠããŸã:
* ããŒãžã¹ãã³ã¹èšå®
* ãœãŒãæžã¿ã»ããããªã¹ããªã©ã®çµã¿èŸŒã¿ããŒã¿æ§éãã£ãã·ã¥ã«ã¯æ§ã ãªã¬ãã«ã®ãã®ããããŸããããããã倧ããäºã€ã®ã«ããŽãªãŒã®ããããã«åé¡ããããšãã§ããŸã: **ããŒã¿ããŒã¹ã¯ãšãª** ãš **ãªããžã§ã¯ã** ã§ã:
* è¡ã¬ãã«
* ã¯ãšãªã¬ãã«
* Fully-formed serializable objects
* Fully-rendered HTMLäžè¬çã«ããã¡ã€ã«ããŒã¹ãã£ãã·ã³ã°ã¯ã¯ããŒã³ãäœãåºããŠãªãŒãã¹ã±ãŒãªã³ã°ãé£ããããŠããŸãã®ã§é¿ããã¹ãã§ãã
### ããŒã¿ããŒã¹ã¯ãšãªã¬ãã«ã§ã®ãã£ãã·ã³ã°
ããŒã¿ããŒã¹ãã¯ãšãªããéã«ã¯å¿ ãã¯ãšãªãããŒãšããŠããã·ã¥ããŠçµæããã£ãã·ã¥ã«ä¿åããŸãããããã®ææ³ã¯ãã£ãã·ã¥æéåãåé¡ã«æ©ãããšã«ãªããŸã:
* è€éãªã¯ãšãªã«ãããã£ãã·ã¥ãããçµæãåé€ããããšãå°é£
* ããŒãã«ã»ã«ãªã©ã®ããŒã¿æçãå€åããæã«ããã®å€åããã»ã«ãå«ããããããªãå šãŠã®ãã£ãã·ã¥ãããã¯ãšãªãåé€ããå¿ èŠãããã### ãªããžã§ã¯ãã¬ãã«ã§ã®ãã£ãã·ã³ã°
ããŒã¿ãã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ããããããã«ããªããžã§ã¯ããšããŠæããŠã¿ãŸããããã¢ããªã±ãŒã·ã§ã³ã«ãããŒã¿ããŒã¹ããã®ããŒã¿ã»ãããã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãããŒã¿æ§é ãšããŠçµã¿ç«ãŠãããŸãã:
* ãã®ããŒã¿ãå€æŽããããããªããžã§ã¯ãããã£ãã·ã¥ããåé€ããããš
* éåæåŠçã蚱容ããŸã: ã¯ãŒã«ãŒããã£ãã·ã¥ããããªããžã§ã¯ãã®äžã§ææ°ã®ãã®ãéããŠããŸãäœããã£ãã·ã¥ããã:
* ãŠãŒã¶ãŒã®ã»ãã·ã§ã³
* å®å šã«ã¬ã³ããŒããããŠã§ãããŒãž
* ã¢ã¯ãããã£ã¹ããªãŒã
* ãŠãŒã¶ãŒã°ã©ãããŒã¿### ãã€ãã£ãã·ã¥ãæŽæ°ããã
ãã£ãã·ã¥ã«ä¿åã§ãã容éã¯éãããŠãããããèªåã®ã±ãŒã¹ã§ã¯ã©ã®ãã£ãã·ã¥ææ³ãäžçªãããã¯æ€èšããå¿ èŠããããŸãã
#### ãã£ãã·ã¥ã¢ãµã€ã
Source: From cache to in-memory data gridã¢ããªã±ãŒã·ã§ã³ã¯ã¹ãã¬ãŒãžãžã®èªã¿æžãã®åŠçãããŸãããã£ãã·ã¥ã¯ã¹ãã¬ãŒãžãšã¯çŽæ¥ãããšããããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ä»¥äžã®ããšãããŸã:
* ãã£ãã·ã¥ã®äžã®ãšã³ããªãåç §ããŸãããçµæãšããŠãã£ãã·ã¥ãã¹ã«ãªããŸã
* ããŒã¿ããŒã¹ãããšã³ããªãååŸããŸã
* ãšã³ããªããã£ãã·ã¥ã«è¿œå ããŸã
* ãšã³ããªãè¿ããŸã```python
def get_user(self, user_id):
user = cache.get("user.{0}", user_id)
if user is None:
user = db.query("SELECT * FROM users WHERE user_id = {0}", user_id)
if user is not None:
key = "user.{0}".format(user_id)
cache.set(key, json.dumps(user))
return user
```[Memcached](https://memcached.org/) ã¯éåžžãã®ããã«äœ¿ãããã
ãã®åŸã®ãã£ãã·ã¥ããŒã¿èªã¿èŸŒã¿ã¯éãã§ãããã£ãã·ã¥ã¢ãµã€ãã¯ã¬ãŒãžãŒããŒãã£ã³ã°ã§ãããšãèšãããŸãããªã¯ãšã¹ããããããŒã¿ã®ã¿ããã£ãã·ã¥ããããªã¯ãšã¹ããããŠããªãããŒã¿ã§ãã£ãã·ã¥ã溢ããã®ãé²æ¢ããŸãã
##### æ¬ ç¹: ãã£ãã·ã¥ã¢ãµã€ã
* åãã£ãã·ã¥ãã¹ã¯äžã€ã®ããªãããåŒã³åºãããšã«ãªããäœæã§ããã»ã©ã®é 延ãèµ·ããŠããŸããŸãã
* ããŒã¿ããŒã¹ã®ããŒã¿ãæŽæ°ããããšãã£ãã·ã¥ããŒã¿ã¯å€ããã®ã«ãªã£ãŠããŸããŸããtime-to-live (TTL)ãèšå®ããããšã§ãã£ãã·ã¥ãšã³ããªã®æŽæ°ã匷å¶çã«è¡ãããããã¯ã©ã€ãã¹ã«ãŒãæ¡çšããããšã§ãã®åé¡ã¯ç·©åã§ããŸãã
* ããŒããèœã¡ããšãæ°èŠã®ç©ºã®ããŒãã§ä»£æ¿ãããããšã§ã¬ã€ãã³ã·ãŒãå¢å ããããšã«ãªããŸãã#### ã©ã€ãã¹ã«ãŒ
Source: Scalability, availability, stability, patternsã¢ããªã±ãŒã·ã§ã³ã¯ãã£ãã·ã¥ãã¡ã€ã³ã®ããŒã¿ã¹ãã¢ãšããŠäœ¿ããããã«ããŒã¿ã®èªã¿æžããè¡ããŸããäžæ¹ããã£ãã·ã¥ã¯ããŒã¿ããŒã¹ãžã®èªã¿æžããæ åœããŸãã
* ã¢ããªã±ãŒã·ã§ã³ã¯ãã£ãã·ã¥ã«ãããšã³ããªãè¿œå ã»æŽæ°ããŸã
* ãã£ãã·ã¥ã¯åæçã«ããŒã¿ã¹ãã¢ã«æžã蟌ã¿ãè¡ããŸã
* ãšã³ããªãè¿ããŸãã¢ããªã±ãŒã·ã§ã³ã³ãŒã:
```
set_user(12345, {"foo":"bar"})
```ãã£ãã·ã¥ã³ãŒã:
```python
def set_user(user_id, values):
user = db.query("UPDATE Users WHERE id = {0}", user_id, values)
cache.set(user_id, user)
```ã©ã€ãã¹ã«ãŒã¯æžã蟌ã¿åŠçã®ããã§å šäœãšããŠã¯é ããªãã¬ãŒã·ã§ã³ã§ãããæžã蟌ãŸããã°ããã®ããŒã¿ã«é¢ããèªã¿èŸŒã¿ã¯éãã§ãããŠãŒã¶ãŒåŽã¯äžè¬çã«ããŒã¿æŽæ°æã®æ¹ãèªã¿èŸŒã¿æãããã¬ã€ãã³ã·ãŒã«èš±å®¹çã§ãããã£ãã·ã¥å ã®ããŒã¿ã¯ææ°çã§ä¿ãããŸãã
##### æ¬ ç¹: ã©ã€ãã¹ã«ãŒ
* ããŒããèœã¡ãããšããããã¯ã¹ã±ãŒãªã³ã°ã«ãã£ãŠæ°ããããŒããäœæãããæã«ãæ°ããããŒãã¯ããŒã¿ããŒã¹å ã®ãšã³ããªãŒãæŽæ°ããããŸã§ã¯ãšã³ããªãŒããã£ãã·ã¥ããŸããããã£ãã·ã¥ã¢ãµã€ããšã©ã€ãã¹ã«ãŒã䜵çšããããšã§ãã®åé¡ãç·©åã§ããŸãã
* æžã蟌ãŸããããŒã¿ã®å€§éšåã¯äžåºŠãèªã¿èŸŒãŸããããšã¯ãããŸããããã®ããŒã¿ã¯TTLã«ãã£ãŠå§çž®ããããšãã§ããŸãã#### ã©ã€ãããã€ã³ã (ã©ã€ãããã¯)
Source: Scalability, availability, stability, patternsã©ã€ãããã€ã³ãã§ã¯ã¢ããªã±ãŒã·ã§ã³ã¯ä»¥äžã®ããšãããŸã:
* ãã£ãã·ã¥ã®ãšã³ããªãŒãè¿œå ã»æŽæ°ããŸã
* ããŒã¿ã¹ãã¢ãžã®æžã蟌ã¿ãéåæçã«è¡ãããšã§ãæžã蟌ã¿ããã©ãŒãã³ã¹ãåäžãããŸãã##### æ¬ ç¹: ã©ã€ãããã€ã³ã
* ãã£ãã·ã¥ãããŒã¿ã¹ãã¢å ã®ã³ã³ãã³ãã«ãããããåã«ãã£ãã·ã¥ãèœã¡ããšããŒã¿æ¬ æãèµ·ããå¯èœæ§ããããŸãã
* ãã£ãã·ã¥ã¢ãµã€ããã©ã€ãã¹ã«ãŒãããå®è£ ãè€éã«ãªããŸãã#### ãªãã¬ãã·ã¥ã¢ããã
Source: From cache to in-memory data gridæéåããããåã«ãçŽè¿ã§ã¢ã¯ã»ã¹ãããå šãŠã®ãã£ãã·ã¥ãšã³ããªãèªåçã«æŽæ°ããããã«èšå®ããããšãã§ããŸãã
ããã©ã®ã¢ã€ãã ãå°æ¥å¿ èŠã«ãªãã®ããæ£ç¢ºã«äºæž¬ããããšãã§ããã®ãªãã°ããªãŒãã¹ã«ãŒãããã¬ã€ãã³ã·ãŒãåæžããããšãã§ããŸãã
##### æ¬ ç¹: ãªãã¬ãã·ã¥ã¢ããã
* ã©ã®ã¢ã€ãã ãå¿ èŠã«ãªããã®äºæž¬ãæ£ç¢ºã§ãªãå Žåã«ã¯ãªãã¬ãã·ã¥ã¢ãããããªãæ¹ãã¬ã€ãã³ã·ãŒã¯è¯ããšããçµæã«ãªã£ãŠããŸããŸãã
### æ¬ ç¹: ãã£ãã·ã¥
* [cache invalidation](https://en.wikipedia.org/wiki/Cache_algorithms)ãªã©ãçšããŠãããŒã¿ããŒã¹ãªã©ã®çã®ããŒã¿ãšãã£ãã·ã¥ã®éã®äžè²«æ§ãä¿ã€å¿ èŠããããŸãã
* Redisãmemcachedãè¿œå ããããšã§ã¢ããªã±ãŒã·ã§ã³æ§æãå€æŽããå¿ èŠããããŸãã
* Cache invalidationãé£ããã§ããããã«å ããŠããã€ãã£ãã·ã¥ãæŽæ°ããããšããè€éãªåé¡ã«ãæ©ãŸãããããšã«ãªããŸãã### ãã®ä»ã®åèè³æãããŒãž
* [From cache to in-memory data grid](http://www.slideshare.net/tmatyashovsky/from-cache-to-in-memory-data-grid-introduction-to-hazelcast)
* [ã¹ã±ãŒã©ãã«ãªã·ã¹ãã ãã¶ã€ã³ãã¿ãŒã³](http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html)
* [ã¹ã±ãŒã«ã§ããã·ã¹ãã ãèšèšããããã®ã€ã³ãããã¯ã·ã§ã³](http://lethain.com/introduction-to-architecting-systems-for-scale/)
* [ã¹ã±ãŒã©ããªãã£ãå¯çšæ§ãå®å®æ§ããã¿ãŒã³](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/)
* [ã¹ã±ãŒã©ããªãã£](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache)
* [AWS ElastiCacheã®ã¹ãã©ããžãŒ](http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/Strategies.html)
* [Wikipedia](https://en.wikipedia.org/wiki/Cache_(computing))## éåæåŠç
Source: Intro to architecting systems for scaleéåæã®ã¯ãŒã¯ãããŒã¯ãããé£ç¶çã«è¡ããããšãªã¯ãšã¹ãæéãå§è¿«ããŠããŸããããªéãåŠçãå¥ã§åŠçããææ³ã§ãããŸããå®æçã«ããŒã¿ãéåããããªã©ã®æéãããããããªåŠçãåãã£ãŠåŠçããŠããããšã«ã圹ç«ã¡ãŸãã
### ã¡ãã»ãŒãžãã¥ãŒ
ã¡ãã»ãŒãžãã¥ãŒã¯ã¡ãã»ãŒãžãåãåããä¿åããé ä¿¡ããŸãããããåŠçãã€ã³ã©ã€ã³ã§è¡ãã«ã¯é ãããå Žåã以äžã®ãããªã¯ãŒã¯ãããŒã§ã¡ãã»ãŒãžãã¥ãŒãçšãããšããã§ããã:
* ã¢ããªã±ãŒã·ã§ã³ã¯ãžã§ãããã¥ãŒã«é ä¿¡ãããŠãŒã¶ãŒã«ãžã§ãã¹ããŒã¿ã¹ãäŒããŸãã
* ã¯ãŒã«ãŒããžã§ããã¥ãŒããåãåã£ãŠãåŠçãè¡ããçµäºããããã®ã·ã°ãã«ãè¿ããŸãããŠãŒã¶ãŒã®åŠçãæ¢ãŸãããšã¯ãªãããžã§ãã¯ããã¯ã°ã©ãŠã³ãã§åŠçãããŸãããã®éã«ãã¯ã©ã€ã¢ã³ãã¯ãªãã·ã§ã³ãšããŠãã¿ã¹ã¯ãå®äºãããã®ããã«èŠããããã«å°èŠæš¡ã®åŠçãè¡ããŸããäŸãã°ããã€ãŒããæçš¿ãããšãã«ããã€ãŒãã¯ããã«ããªãã®ã¿ã€ã ã©ã€ã³ã«åæ ãããããã«èŠããŸããããã®ãã€ãŒããå®éã«å šãŠã®ãã©ãã¯ãŒã«é ä¿¡ããããŸã§ã«ã¯ããå°ãæéãããã£ãŠããã§ãããã
**Redis** ã¯ã·ã³ãã«ãªã¡ãã»ãŒãžä»²ä»ãšããŠã¯ããã§ãããã¡ãã»ãŒãžã倱ãããŠããŸãå¯èœæ§ããããŸãã
**RabbitMQ** ã¯ãã䜿ãããŠããŸããã'AMQP'ãããã³ã«ã«å¯Ÿå¿ããŠãèªåã®ããŒããç«ãŠãå¿ èŠããããŸãã
**Amazon SQS** ãšããéžæè¢ããããŸãããã¬ã€ãã³ã·ãŒãé«ããã¡ãã»ãŒãžãéè€ããŠé ä¿¡ãããŠããŸãå¯èœæ§ããããŸãã
### ã¿ã¹ã¯ãã¥ãŒ
ã¿ã¹ã¯ãã¥ãŒã¯ã¿ã¹ã¯ãšãã®é¢é£ããããŒã¿ãåãåããåŠçããäžã§ãã®çµæãè¿ããŸããã¹ã±ãžã¥ãŒã«ç®¡çãã§ããã»ããããã¯ã°ã©ãŠã³ãã§ãšãŠãéããžã§ããããªãããšãã§ããŸãã
**Celery** ã¯ã¹ã±ãžã¥ãŒãªã³ã°ãšpythonã®ãµããŒãããããŸãã
### ããã¯ãã¬ãã·ã£ãŒ
ããããã¥ãŒãæ¡å€§ãããããšãã¡ã¢ãªãŒããããã¥ãŒã®æ¹ã倧ãããªããã£ãã·ã¥ãã¹ãèµ·ããããã£ã¹ã¯èªã¿åºãã«ã€ãªãããããã©ãŒãã³ã¹ãäœäžããããšã«ã€ãªãããŸãã[ããã¯ãã¬ãã·ã£ãŒ](http://mechanical-sympathy.blogspot.com/2012/05/apply-back-pressure-when-overloaded.html)ã¯ãã¥ãŒãµã€ãºãå¶éããããšã§åé¿ããããšãã§ããé«ãã¹ã«ãŒãããã確ä¿ããã¥ãŒã«ãã§ã«ãããžã§ãã«ã€ããŠã®ã¬ã¹ãã³ã¹æéãççž®ã§ããŸãããã¥ãŒããã£ã±ãã«ãªããšãã¯ã©ã€ã¢ã³ãã¯ãµãŒããŒããžãŒãããã¯HTTP 503ãã¬ã¹ãã³ã¹ãšããŠåãåããŸãåŸã§æéããããŠã¢ã¯ã»ã¹ããããã«ã¡ãã»ãŒãžãåãåããŸããã¯ã©ã€ã¢ã³ãã¯[exponential backoff](https://en.wikipedia.org/wiki/Exponential_backoff)ãªã©ã«ãã£ãŠåŸã»ã©å床æéã眮ããŠãªã¯ãšã¹ãããããšãã§ããŸãã
### æ¬ ç¹: éåæåŠç
* ãã¥ãŒãçšããããšã§é 延ãèµ·ãããè€éããå¢ããããããŸãéããªãèšç®åŠçããªã¢ã«ã¿ã€ã ã¯ãŒã¯ãããŒã«ãããŠã¯åæåŠçã®æ¹ãããã§ãããã
### ãã®ä»ã®åèè³æãããŒãž
* [It's all a numbers game](https://www.youtube.com/watch?v=1KRYH75wgy4)
* [ãªãŒããŒããŒãããæã«ããã¯ãã¬ãã·ã£ãŒãé©çšãã](http://mechanical-sympathy.blogspot.com/2012/05/apply-back-pressure-when-overloaded.html)
* [Little's law](https://en.wikipedia.org/wiki/Little%27s_law)
* [ã¡ãã»ãŒãžãã¥ãŒãšã¿ã¹ã¯ãã¥ãŒã®éããšã¯ïŒ](https://www.quora.com/What-is-the-difference-between-a-message-queue-and-a-task-queue-Why-would-a-task-queue-require-a-message-broker-like-RabbitMQ-Redis-Celery-or-IronMQ-to-function)## éä¿¡
### Hypertext transfer protocol (HTTP)
HTTP ã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã§ã®ããŒã¿ããšã³ã³ãŒãããŠè»¢éããããã®ææ³ã§ãããªã¯ãšã¹ãã»ã¬ã¹ãã³ã¹ã«é¢ãããããã³ã«ã§ããã¯ã©ã€ã¢ã³ãããªã¯ãšã¹ãããµãŒããŒã«æãããµãŒããŒããªã¯ãšã¹ãã«é¢ä¿ããã³ã³ãã³ããšå®äºã¹ããŒã¿ã¹æ å ±ãã¬ã¹ãã³ã¹ãšããŠè¿ããŸããHTTPã¯èªå·±å®çµããã®ã§ãéã«ããŒããã©ã³ãµãŒããã£ãã·ã¥ããšã³ã¯ãªãã·ã§ã³ãå§çž®ãªã©ã®ã©ããªäžéã«ãŒã¿ãŒãå ¥ã£ãŠãåãããã«ã§ããŠããŸãã
åºæ¬çãªHTTPãªã¯ãšã¹ãã¯HTTPåè©(ã¡ãœãã)ãšãªãœãŒã¹(ãšã³ããã€ã³ã)ã§æãç«ã£ãŠããŸãã以äžãããããHTTPåè©ã§ãã:
| åè© | 詳现 | åªçæ§* | ã»ãŒã | ãã£ãã·ã¥ã§ããã |
|---|---|---|---|---|
| GET | ãªãœãŒã¹ãèªã¿åã | Yes | Yes | Yes |
| POST | ãªãœãŒã¹ãäœæãããããã¯ããŒã¿ãåŠçããããªã¬ãŒ | No | No | Yes ã¬ã¹ãã³ã¹ãæ°ããæ å ±ãå«ãå Žå |
| PUT | ãªãœãŒã¹ãäœæãããã¯å ¥ãæ¿ãã | Yes | No | No |
| PATCH | ãªãœãŒã¹ãéšåçã«æŽæ°ãã | No | No | Yes ã¬ã¹ãã³ã¹ãæ°ããæ å ±ãå«ãå Žå |
| DELETE | ãªãœãŒã¹ãåé€ãã | Yes | No | No |*äœåºŠåŒãã§ãåãçµæãè¿ã£ãŠããããš*
HTTPã¯**TCP** ã **UDP** ãªã©ã®äœçŽãããã³ã«ã«äŸåããŠããã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒã®ãããã³ã«ã§ããã
#### ãã®ä»ã®åèè³æãããŒãž: HTTP
* [HTTPã£ãŠãªã«?](https://www.nginx.com/resources/glossary/http/)
* [HTTP ãš TCPã®éã](https://www.quora.com/What-is-the-difference-between-HTTP-protocol-and-TCP-protocol)
* [PUT ãš PATCHã®éã](https://laracasts.com/discuss/channels/general-discussion/whats-the-differences-between-put-and-patch?page=1)### äŒéå¶åŸ¡ãããã³ã« (TCP)
Source: How to make a multiplayer gameTCPã¯[IP network](https://en.wikipedia.org/wiki/Internet_Protocol)ã®äžã§æãç«ã€æ¥ç¶ãããã³ã«ã§ããæ¥ç¶ã¯[handshake](https://en.wikipedia.org/wiki/Handshaking)ã«ãã£ãŠéå§ã解é€ãããŸããå šãŠã®éä¿¡ããããã±ããã¯æ¬ æãªãã§éä¿¡å ã«éä¿¡ãããé çªã§å°éããããã«ä»¥äžã®æ¹æ³ã§ä¿èšŒãããŠããŸã:
* ã·ãŒã±ã³ã¹çªå·ãš[checksum fields](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Checksum_computation)ãå šãŠã®ãã±ããã«çšæãããŠãã
* [Acknowledgement](https://en.wikipedia.org/wiki/Acknowledgement_(data_networks))ãã±ãããšèªååéä¿¡ããéä¿¡è ãæ£ããã¬ã¹ãã³ã¹ãåãåããªãã£ããšãããã±ãããåéä¿¡ããŸããè€æ°ã®ã¿ã€ã ã¢ãŠãããã£ããšããæ¥ç¶ã¯è§£é€ãããŸããTCP ã¯[ãããŒå¶åŸ¡](https://en.wikipedia.org/wiki/Flow_control_(data)) ãš [茻茳å¶åŸ¡](https://en.wikipedia.org/wiki/Network_congestion#Congestion_control)ãå®è£ ããŠããŸãããããã®æ©èœã«ãã£ãŠé床ã¯äœäžããäžè¬çã«UDPãããéå¹çãªè»¢éæ段ã«ãªã£ãŠããŸãã
ãã€ã¹ã«ãŒããããå®çŸããããã«ããŠã§ããµãŒããŒã¯ããªã倧ããªæ°ã®TCPæ¥ç¶ãéããŠããããšãããããã®ããšã§ã¡ã¢ãªãŒäœ¿çšãå§è¿«ãããŸãããŠã§ããµãŒãã¹ã¬ãããšäŸãã°[memcached](#memcached) ãµãŒããŒã®éã§å€æ°ã®ã³ãã¯ã·ã§ã³ãä¿ã£ãŠããããšã¯é«ãã€ããããããŸãããå¯èœãªãšããã§ã¯UDPã«åãæ¿ããã ãã§ãªã[ã³ãã¯ã·ã§ã³ããŒãªã³ã°](https://en.wikipedia.org/wiki/Connection_pool)ãªã©ã圹ç«ã€ãããããŸããã
TCPã¯é«ãäŸåæ§ãèŠããæéå¶çŽãå³ãããªããã®ã«é©ããŠããã§ãããããŠã§ããµãŒããŒãããŒã¿ããŒã¹æ å ±ãSMTPãFTPãSSHãªã©ã®äŸã«é©çšãããŸãã
以äžã®æã«UDPãããTCPã䜿ããšããã§ããã:
* å šãŠã®ããŒã¿ãæ¬ æããããšãªãã«å±ããŠã»ãã
* ãããã¯ãŒã¯ã¹ã«ãŒãããã®æé©ãªèªåæšæž¬ãããŠãªãã¬ãŒã·ã§ã³ããã### ãŠãŒã¶ããŒã¿ã°ã©ã ãããã³ã« (UDP)
Source: How to make a multiplayer gameUDPã¯ã³ãã¯ã·ã§ã³ã¬ã¹ã§ããããŒã¿ã°ã©ã ïŒãã±ããã®ãããªãã®ïŒã¯ããŒã¿ã°ã©ã ã¬ãã«ã§ã®ä¿èšŒãããããŸãããããŒã¿ã°ã©ã ã¯é äžåã§åãåãå ã«å°çãããããããçããªãã£ããããŸããUDPã¯èŒ»èŒ³å¶åŸ¡ããµããŒãããŸãããTCPã«ãããŠã¯ãµããŒããããŠãããããã®ä¿èšŒããªããããUDPã¯äžè¬çã«ãTCPãããå¹ççã§ãã
UDPã¯ãµããããäžã®ãã¹ãŠã®æ©åšã«ããŒã¿ã°ã©ã ãéä¿¡ããããšãã§ããŸããããã¯[DHCP](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol) ã«ãããŠåœ¹ã«ç«ã¡ãŸãããšããã®ããã¯ã©ã€ã¢ã³ãã¯ãŸã IPã¢ãã¬ã¹ãååŸããŠããªãã®ã§ãIPã¢ãã¬ã¹ãå¿ èŠãšããTCPã«ããã¹ããªãŒã ãã§ããªãããã§ãã
UDPã¯ä¿¡é Œæ§ã®é¢ã§ã¯å£ããŸãããVoIPããããªãã£ãããã¹ããªãŒãã³ã°ãåæéä¿¡ãã«ããã¬ã€ã€ãŒã²ãŒã ãªã©ã®ãªã¢ã«ã¿ã€ã æ§ãéèŠãããæã«ã¯ãšãŠãå¹æçã§ãã
TCPãããUDPã䜿ãã®ã¯:
* ã¬ã€ãã³ã·ãŒãæäœéã«æãããæ
* ããŒã¿æ¬ æããããããŒã¿é 延ãéèŠãããšã
* ãšã©ãŒä¿®æ£ãèªåã§å®è£ ããããšã#### ãã®ä»ã®åèè³æãããŒãž: TCP ãš UDP
* [ã²ãŒã ããã°ã©ãã³ã°ã®ããã®ãããã¯ãŒã¯](http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/)
* [TCP ãš UDP ãããã³ã«ã®äž»ãªéã](http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/)
* [TCP ãš UDPã®éã](http://stackoverflow.com/questions/5970383/difference-between-tcp-and-udp)
* [Transmission control protocol](https://en.wikipedia.org/wiki/Transmission_Control_Protocol)
* [User datagram protocol](https://en.wikipedia.org/wiki/User_Datagram_Protocol)
* [Facebookã®ã¡ã ãã£ãã·ã¥ã¹ã±ãŒãªã³ã°](http://www.cs.bu.edu/~jappavoo/jappavoo.github.com/451/papers/memcache-fb.pdf)### é éæç¶åŒåº (RPC)
Source: Crack the system design interviewRPCã§ã¯ã¯ã©ã€ã¢ã³ãããªã¢ãŒããµãŒããŒãªã©ã®ç°ãªãã¢ãã¬ã¹ç©ºéã§ããã·ãŒãžã£ãŒãåŠçãããããã«ããŸããããã·ãŒãžã£ãŒã¯ããŒã«ã«ã§ã®ã³ãŒã«ã®ããã«ãã¯ã©ã€ã¢ã³ããããµãŒããŒã«ã©ã®ããã«éä¿¡ããããšãã詳现ãçããç¶æ ã§ã³ãŒããæžãããŸãããªã¢ãŒãã®ã³ãŒã«ã¯æ®éãããŒã«ã«ã®ã³ãŒã«ãããé ããä¿¡é Œæ§ã«æ¬ ãããããRPCã³ãŒã«ãããŒã«ã«ã³ãŒã«ãšåºå¥ãããŠããããšã奜ãŸããã§ãããã人æ°ã®RPCãã¬ãŒã ã¯ãŒã¯ã¯ä»¥äžã§ãã[Protobuf](https://developers.google.com/protocol-buffers/)ã [Thrift](https://thrift.apache.org/)ã[Avro](https://avro.apache.org/docs/current/)
RPC 㯠ãªã¯ãšã¹ãã¬ã¹ãã³ã¹ãããã³ã«:
* **ã¯ã©ã€ã¢ã³ãããã°ã©ã ** - ã¯ã©ã€ã¢ã³ãã¹ã¿ãããã·ãŒãžã£ãŒãåŒã³åºããŸãããã©ã¡ãŒã¿ã¯ããŒã«ã«ã§ã®ããã·ãŒãžã£ãŒã³ãŒã«ã®ããã«ã¹ã¿ãã¯ãžãšããã·ã¥ãããŠãããŸãã
* **ã¯ã©ã€ã¢ã³ãã¹ã¿ãããã·ãŒãžã£ãŒ** - ããã·ãŒãžã£IDãšã¢ãŒã®ã¥ã¡ã³ããããã¯ããŠãªã¯ãšã¹ãã¡ãã»ãŒãžã«ããŸãã
* **ã¯ã©ã€ã¢ã³ãéä¿¡ã¢ãžã¥ãŒã«** - OSãã¯ã©ã€ã¢ã³ããããµãŒããŒãžãšã¡ãã»ãŒãžãéããŸãã
* **ãµãŒããŒéä¿¡ã¢ãžã¥ãŒã«** - OSãåãåã£ããã±ããããµãŒããŒã¹ã¿ãããã·ãŒãžã£ãŒã«åãæž¡ããŸãã
* **ãµãŒããŒã¹ã¿ãããã·ãŒãžã£ãŒ** - çµæãå±éããããã·ãŒãžã£ãŒIDã«ããããããµãŒããŒããã·ãŒãžã£ãŒãåŒã³åºããçµæãè¿ããŸãã
* ãµãŒããŒã¬ã¹ãã³ã¹ã¯äžèšã®ã¹ããããéé ã§ç¹°ãè¿ããŸããSample RPC calls:
```
GET /someoperation?data=anIdPOST /anotheroperation
{
"data":"anId";
"anotherdata": "another value"
}
```RPCã¯æ¯ãèããå ¬éããããšã«çŠç¹ãåœãŠãŠããŸããRPCã¯å éšéä¿¡ããã©ãŒãã³ã¹ãçç±ãšããŠäœ¿ãããããšãå€ãã§ãããšããã®ãã䜿çšããç¶æ³ã«åãããŠãã€ãã£ãã³ãŒã«ãèªäœããããšãã§ããããã§ãã
ãã€ãã£ãã©ã€ãã©ãªãŒ (aka SDK) ãåŒã¶ã®ã¯ä»¥äžã®æ:
* ã¿ãŒã²ããã®ãã©ãããã©ãŒã ãç¥ã£ãŠããæ
* ããžãã¯ãã©ã®ããã«ã¢ã¯ã»ã¹ãããã®ãã管çããããšã
* ã©ã€ãã©ãªãŒå€ã§ãšã©ãŒãã©ã®ããã«ã³ã³ãããŒã«ããããã管çãããæ
* ããã©ãŒãã³ã¹ãšãšã³ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæåªå ã®æ**REST** ãããã³ã«ã«åŸãHTTP APIã¯ãããªãã¯APIã«ãããŠããçšããããŸãã
#### æ¬ ç¹: RPC
* RPCã¯ã©ã€ã¢ã³ããšã¯ãµãŒãã¹å®è£ ã«ããå³å¯ã«å·Šå³ãããããšã«ãªããŸãã
* æ°ãããªãã¬ãŒã·ã§ã³ã䜿çšäŸããããã³ã«æ°ããAPIãå®çŸ©ãããªããã°ãªããŸããã
* RPCããããã°ããã®ã¯é£ããå¯èœæ§ããããŸãã
* æ¢åã®ãã¯ãããžãŒããã®ãŸãŸäœ¿ã£ãŠãµãŒãã¹ãæ§ç¯ããããšã¯ã§ããªããããããŸãããäŸãã°ã[Squid](http://www.squid-cache.org/)ãªã©ã®ãµãŒããŒã«[RPCã³ãŒã«ãæ£ãããã£ãã·ã¥](http://etherealbits.com/2012/12/debunking-the-myths-of-rpc-rest/) ãããããã«è¿œå ã§éªšãæãå¿ èŠããããããããŸããã### Representational state transfer (REST)
RESTã¯ãã¯ã©ã€ã¢ã³ãããµãŒããŒã«ãã£ãŠãããŒãžããããªãœãŒã¹ã«å¯ŸããŠåŠçãè¡ãã¯ã©ã€ã¢ã³ãã»ãµãŒããŒã¢ãã«ãæ¯æããã¢ãŒããããã£ã¹ã¿ã€ã«ã§ãããµãŒããŒã¯æäœã§ãããããã¯æ°ãããªãœãŒã¹ã¬ãã¬ãŒã³ããŒã·ã§ã³ãåãåãããšãã§ãããããªãªãœãŒã¹ãã¢ã¯ã·ã§ã³ã®ã¬ãã¬ãŒã³ããŒã·ã§ã³ãæäŸããŸãããã¹ãŠã®éä¿¡ã¯ã¹ããŒãã¬ã¹ã§ãã£ãã·ã¥å¯èœã§ãªããã°ãªããŸããã
RESTful ãªã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯æ¬¡ã®åã€ã®ç¹åŸŽããããŸã:
* **ç¹åŸŽçãªãªãœãŒã¹ (URI in HTTP)** - ã©ã®ãªãã¬ãŒã·ã§ã³ã§ãã£ãŠãåãURIã䜿ãã
* **HTTPåè©ã«ãã£ãŠå€ãã (Verbs in HTTP)** - åè©ãããããŒãããã£ã䜿ã
* **èªå·±èª¬æçãªãšã©ãŒã¡ãã»ãŒãž (status response in HTTP)** - ã¹ããŒã¿ã¹ã³ãŒãã䜿ããæ°ããäœã£ããããªãããšã
* **[HATEOAS](http://restcookbook.com/Basics/hateoas/) (HTML interface for HTTP)** - èªåã®webãµãŒãã¹ããã©ãŠã¶ã§å®å šã«ã¢ã¯ã»ã¹ã§ããããšããµã³ãã« REST ã³ãŒã«:
```
GET /someresources/anIdPUT /someresources/anId
{"anotherdata": "another value"}
```RESTã¯ããŒã¿ãå ¬éããããšã«çŠç¹ãåœãŠãŠããŸããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®ã«ãããªã³ã°ãæå°éã«ãããã®ã§ããããªãã¯APIãªã©ã«ããçšããããŸããRESTã¯URIã [representation through headers](https://github.com/for-GET/know-your-http-well/blob/master/headers.md)ããããŠãGETãPOSTãPUTã DELETEãPATCHãªã©ã®HTTPåè©çã®ãããžã§ããªãã¯ã§çµ±äžãããã¡ãœãããçšããŸããã¹ããŒãã¬ã¹ã§ããã®ã§RESTã¯æ°Žå¹³ã¹ã±ãŒãªã³ã°ãããŒãã£ã·ã§ãã³ã°ã«æé©ã§ãã
#### æ¬ ç¹: REST
* RESTã¯ããŒã¿å ¬éã«çŠç¹ãåœãŠãŠããã®ã§ããªãœãŒã¹ãèªç¶ã«æŽçãããŠããªãã£ãããã·ã³ãã«ãªããšã©ã«ããŒã§è¡šããããªãæã«ã¯ããéžæè¢ãšã¯èšããªããããããŸãããäŸãã°ããšããã€ãã³ãã®ã»ããã«ããããããã¹ãŠã®æŽæ°æ å ±ãè¿ããšèšã£ãåŠçã¯ç°¡åã«ã¯ãã¹ã§è¡šçŸããããšãã§ããŸãããRESTã§ã¯ãURIãã¹ãã¯ãšãªãã©ã¡ãŒã¿ããããŠå Žåã«ãã£ãŠã¯ãªã¯ãšã¹ãããã£ãªã©ã«ãã£ãŠå®è£ ãããããšãå€ãã§ãããã
* RESTã¯å°æ°ã®åè©ã«äŸåããŠããŸã(GETãPOSTãPUTãDELETEããã㊠PATCH) ãæã«ã¯äœ¿ãããäºäŸã«åããªãããšããããŸããäŸãã°ãæéã®åããããã¥ã¡ã³ããã¢ãŒã«ã€ãã«ç§»ãããå Žåãªã©ã¯ãããã®åè©ã®äžã«ã¯ç¶ºéºã«ã¯ãã£ããããŸããã
* ãã¹ããããããšã©ã«ããŒã®äžã«ãããªãœãŒã¹ããšã£ãŠããã®ã¯ã·ã³ã°ã«ãã¥ãŒãæç»ããã®ã«ã¯ã©ã€ã¢ã³ããšãµãŒããŒéã§æ°åãããšãããªããã°ãªããŸãããäŸãšããŠãããã°ãšã³ããªãŒã®ã³ã³ãã³ããšããã«å¯Ÿããã³ã¡ã³ãã衚瀺ããå Žåãªã©ã§ããæ§ã ãªãããã¯ãŒã¯ç°å¢ã§åäœããå¯èœæ§ãèããããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«ãããŠã¯ãã®ãããªè€æ°ã®ããåãã¯å¥œãŸãããããŸããã
* æãçµã€ã«ã€ããŠãAPIã¬ã¹ãã³ã¹ã«ããå€ãã®ãã£ãŒã«ããäžããããŠãå€ãã¯ã©ã€ã¢ã³ãã¯ãã§ã«ãããªããã®ãå«ããŠãã¹ãŠã®ããŒã¿ãã£ãŒã«ããåãåãããšã«ãªããŸãããã®ããšã§ããã€ããŒãã倧ãããªããããŠãã¬ã€ãã³ã·ãŒãæ¡å€§ããããšã«ãªããŸãã### RPCãšRESTæ¯èŒ
| Operation | RPC | REST |
|---|---|---|
| ãµã€ã³ã¢ãã | **POST** /signup | **POST** /persons |
| ãªã¶ã€ã³ | **POST** /resign
{
"personid": "1234"
} | **DELETE** /persons/1234 |
| Personèªã¿èŸŒã¿ | **GET** /readPerson?personid=1234 | **GET** /persons/1234 |
| Personã®ã¢ã€ãã ãªã¹ãèªã¿èŸŒã¿ | **GET** /readUsersItemsList?personid=1234 | **GET** /persons/1234/items |
| Personã®ã¢ã€ãã ãžã®ã¢ã€ãã è¿œå | **POST** /addItemToUsersItemsList
{
"personid": "1234";
"itemid": "456"
} | **POST** /persons/1234/items
{
"itemid": "456"
} |
| ã¢ã€ãã æŽæ° | **POST** /modifyItem
{
"itemid": "456";
"key": "value"
} | **PUT** /items/456
{
"key": "value"
} |
| ã¢ã€ãã åé€ | **POST** /removeItem
{
"itemid": "456"
} | **DELETE** /items/456 |
Source: Do you really know why you prefer REST over RPC#### ãã®ä»ã®åèè³æãããŒãž: REST ãš RPC
* [Do you really know why you prefer REST over RPC](https://apihandyman.io/do-you-really-know-why-you-prefer-rest-over-rpc/)
* [When are RPC-ish approaches more appropriate than REST?](http://programmers.stackexchange.com/a/181186)
* [REST vs JSON-RPC](http://stackoverflow.com/questions/15056878/rest-vs-json-rpc)
* [Debunking the myths of RPC and REST](http://etherealbits.com/2012/12/debunking-the-myths-of-rpc-rest/)
* [What are the drawbacks of using REST](https://www.quora.com/What-are-the-drawbacks-of-using-RESTful-APIs)
* [Crack the system design interview](http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview)
* [Thrift](https://code.facebook.com/posts/1468950976659943/)
* [Why REST for internal use and not RPC](http://arstechnica.com/civis/viewtopic.php?t=1190508)## ã»ãã¥ãªãã£
ãã®ã»ã¯ã·ã§ã³ã¯æŽæ°ãå¿ èŠã§ãã[contributing](#contributing)ããŠãã ããïŒ
ã»ãã¥ãªãã£ã¯å¹ åºããããã¯ã§ããååãªçµéšãã»ãã¥ãªãã£åéã®ããã¯ã°ã©ãŠã³ãããªããŠããã»ãã¥ãªãã£ã®ç¥èãèŠããè·ã«å¿åããã®ã§ãªãéããåºæ¬ä»¥äžã®ããšãç¥ãå¿ èŠã¯ãªãã§ãããã
* æ å ±äŒéãä¿åã«ãããæå·å
* [XSS](https://en.wikipedia.org/wiki/Cross-site_scripting) ã [SQL injection](https://en.wikipedia.org/wiki/SQL_injection)ãé²ãããã«ãå šãŠã®ãŠãŒã¶ãŒå ¥åãããã¯ãŠãŒã¶ãŒã«é²åºãããå ¥åãã©ã¡ãŒã¿ãŒããµãã¿ã€ãºãã
* SQL injectionãé²ãããã«ãã©ã¡ãŒã¿åãããã¯ãšãªãçšããã
* [least privilege](https://en.wikipedia.org/wiki/Principle_of_least_privilege)ã®åçãçšãã### ãã®ä»ã®åèè³æãããŒãž:
* [éçºè ã®ããã®ã»ãã¥ãªãã£ã¬ã€ã](https://github.com/FallibleInc/security-guide-for-developers)
* [OWASP top ten](https://www.owasp.org/index.php/OWASP_Top_Ten_Cheat_Sheet)## è£éº
æç®ã§ãæšèšå€ãæ±ããå¿ èŠãããããšãæã«ã¯ãããŸããäŸãã°ããã£ã¹ã¯ãã100æã€ã¡ãŒãžåã®ãµã ãã€ã«ãäœãæéãæ±ãããããã®æã«ã©ãã ããã£ã¹ã¯ã¡ã¢ãªãŒãæ¶è²»ãããããªã©ã®å€ã§ãã**2ã®ä¹æ°è¡š** ãš **å šãŠã®ããã°ã©ããŒãç¥ãã¹ãã¬ã€ãã³ã·ãŒå€** ã¯è¯ãåèã«ãªãã§ãããã
### 2ã®ä¹æ°è¡š
```
ä¹æ° å³å¯ãªå€ çŽ Bytes
---------------------------------------------------------------
7 128
8 256
10 1024 1 thousand 1 KB
16 65,536 64 KB
20 1,048,576 1 million 1 MB
30 1,073,741,824 1 billion 1 GB
32 4,294,967,296 4 GB
40 1,099,511,627,776 1 trillion 1 TB
```#### ãã®ä»ã®åèè³æãããŒãž:
* [2ã®ä¹æ°è¡š](https://en.wikipedia.org/wiki/Power_of_two)
### å šãŠã®ããã°ã©ããŒãç¥ãã¹ãã¬ã€ãã³ã·ãŒå€
```
Latency Comparison Numbers
--------------------------
L1 cache reference 0.5 ns
Branch mispredict 5 ns
L2 cache reference 7 ns 14x L1 cache
Mutex lock/unlock 25 ns
Main memory reference 100 ns 20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy 10,000 ns 10 us
Send 1 KB bytes over 1 Gbps network 10,000 ns 10 us
Read 4 KB randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD
Read 1 MB sequentially from memory 250,000 ns 250 us
Round trip within same datacenter 500,000 ns 500 us
Read 1 MB sequentially from SSD* 1,000,000 ns 1,000 us 1 ms ~1GB/sec SSD, 4X memory
Disk seek 10,000,000 ns 10,000 us 10 ms 20x datacenter roundtrip
Read 1 MB sequentially from 1 Gbps 10,000,000 ns 10,000 us 10 ms 40x memory, 10X SSD
Read 1 MB sequentially from disk 30,000,000 ns 30,000 us 30 ms 120x memory, 30X SSD
Send packet CA->Netherlands->CA 150,000,000 ns 150,000 us 150 msNotes
-----
1 ns = 10^-9 seconds
1 us = 10^-6 seconds = 1,000 ns
1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns
```äžèšè¡šã«åºã¥ãã圹ã«ç«ã€æ°å€:
* ãã£ã¹ã¯ããã®é£ç¶èªã¿åãé床 30 MB/s
* 1 Gbps Ethernetããã®é£ç¶èªã¿åãé床ã100 MB/s
* SSDããã®é£ç¶èªã¿åãé床 1 GB/s
* main memoryããã®é£ç¶èªã¿åãé床 4 GB/s
* 1ç§ã§å°ç6-7åšã§ãã
* 1ç§ã§ããŒã¿ã»ã³ã¿ãŒãš2000åšãããšãã§ãã#### ã¬ã€ãã³ã·ãŒã®èŠèŠçè¡š
![](https://camo.githubusercontent.com/77f72259e1eb58596b564d1ad823af1853bc60a3/687474703a2f2f692e696d6775722e636f6d2f6b307431652e706e67)
#### ãã®ä»ã®åèè³æãããŒãž:
* [å šãŠã®ããã°ã©ããŒãç¥ãã¹ãã¬ã€ãã³ã·ãŒå€ - 1](https://gist.github.com/jboner/2841832)
* [å šãŠã®ããã°ã©ããŒãç¥ãã¹ãã¬ã€ãã³ã·ãŒå€ - 2](https://gist.github.com/hellerbarde/2843375)
* [Designs, lessons, and advice from building large distributed systems](http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf)
* [Software Engineering Advice from Building Large-Scale Distributed Systems](https://static.googleusercontent.com/media/research.google.com/en//people/jeff/stanford-295-talk.pdf)### ä»ã®ã·ã¹ãã èšèšé¢æ¥äŸé¡
> é »åºã®ã·ã¹ãã èšèšé¢æ¥èª²é¡ãšãã®è§£çãžã®ãªã³ã¯
| 質å | 解ç |
|---|---|
| Dropboxã®ãããªãã¡ã€ã«åæãµãŒãã¹ãèšèšãã | [youtube.com](https://www.youtube.com/watch?v=PE4gwstWhmc) |
| Googleã®ãããªæ€çŽ¢ãšã³ãžã³ã®èšèš | [queue.acm.org](http://queue.acm.org/detail.cfm?id=988407)
[stackexchange.com](http://programmers.stackexchange.com/questions/38324/interview-question-how-would-you-implement-google-search)
[ardendertat.com](http://www.ardendertat.com/2012/01/11/implementing-search-engines/)
[stanford.edu](http://infolab.stanford.edu/~backrub/google.html) |
| Googleã®ãããªã¹ã±ãŒã©ãã«ãªwebã¯ããŒã©ãŒã®èšèš | [quora.com](https://www.quora.com/How-can-I-build-a-web-crawler-from-scratch) |
| Google docsã®èšèš | [code.google.com](https://code.google.com/p/google-mobwrite/)
[neil.fraser.name](https://neil.fraser.name/writing/sync/) |
| Redisã®ãããªããŒããªã¥ãŒã¹ãã¢ã®èšèš | [slideshare.net](http://www.slideshare.net/dvirsky/introduction-to-redis) |
| Memcachedã®ãããªãã£ãã·ã¥ã·ã¹ãã ã®èšèš | [slideshare.net](http://www.slideshare.net/oemebamo/introduction-to-memcached) |
| Amazonã®ãããªã¬ã³ã¡ã³ããŒã·ã§ã³ã·ã¹ãã ã®èšèš | [hulu.com](http://tech.hulu.com/blog/2011/09/19/recommendation-system.html)
[ijcai13.org](http://ijcai13.org/files/tutorial_slides/td3.pdf) |
| Bitlyã®ãããªURLççž®ãµãŒãã¹ã®èšèš | [n00tc0d3r.blogspot.com](http://n00tc0d3r.blogspot.com/) |
| WhatsAppã®ãããªãã£ããã¢ããªã®èšèš | [highscalability.com](http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html)
| Instagramã®ãããªåçå ±æãµãŒãã¹ã®èšèš | [highscalability.com](http://highscalability.com/flickr-architecture)
[highscalability.com](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html) |
| Facebookãã¥ãŒã¹ãã£ãŒãã®èšèš | [quora.com](http://www.quora.com/What-are-best-practices-for-building-something-like-a-News-Feed)
[quora.com](http://www.quora.com/Activity-Streams/What-are-the-scaling-issues-to-keep-in-mind-while-developing-a-social-network-feed)
[slideshare.net](http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture) |
| Facebookã¿ã€ã ã©ã€ã³ã®èšèš | [facebook.com](https://www.facebook.com/note.php?note_id=10150468255628920)
[highscalability.com](http://highscalability.com/blog/2012/1/23/facebook-timeline-brought-to-you-by-the-power-of-denormaliza.html) |
| Facebookãã£ããã®èšèš | [erlang-factory.com](http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf)
[facebook.com](https://www.facebook.com/note.php?note_id=14218138919&id=9445547199&index=0) |
| Facebookã®ãããªgraphæ€çŽ¢ã®èšèš | [facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-building-out-the-infrastructure-for-graph-search/10151347573598920)
[facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-indexing-and-ranking-in-graph-search/10151361720763920)
[facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-the-natural-language-interface-of-graph-search/10151432733048920) |
| CloudFlareã®ãããªCDNã®èšèš | [cmu.edu](http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci) |
| Twitterã®ãã¬ã³ãæ©èœã®èšèš | [michael-noll.com](http://www.michael-noll.com/blog/2013/01/18/implementing-real-time-trending-topics-in-storm/)
[snikolov .wordpress.com](http://snikolov.wordpress.com/2012/11/14/early-detection-of-twitter-trends/) |
| ã©ã³ãã IDçºè¡ã·ã¹ãã ã®èšèš | [blog.twitter.com](https://blog.twitter.com/2010/announcing-snowflake)
[github.com](https://github.com/twitter/snowflake/) |
| äžå®ã®ã€ã³ã¿ãŒãã«æéã§ã®äžäœk件ãè¿ã | [ucsb.edu](https://icmi.cs.ucsb.edu/research/tech_reports/reports/2005-23.pdf)
[wpi.edu](http://davis.wpi.edu/xmdv/docs/EDBT11-diyang.pdf) |
| è€æ°ã®ããŒã¿ã»ã³ã¿ãŒããããŒã¿ãé ä¿¡ãããµãŒãã¹ã®èšèš | [highscalability.com](http://highscalability.com/blog/2009/8/24/how-google-serves-data-from-multiple-datacenters.html) |
| ãªã³ã©ã€ã³ã®è€æ°ãã¬ã€ã€ãŒã«ãŒãã²ãŒã ã®èšèš | [indieflashblog.com](https://web.archive.org/web/20180929181117/http://www.indieflashblog.com/how-to-create-an-asynchronous-multiplayer-game.html)
[buildnewgames.com](http://buildnewgames.com/real-time-multiplayer/) |
| ã¬ãŒãããžã³ã¬ã¯ã·ã§ã³ã·ã¹ãã ã®èšèš | [stuffwithstuff.com](http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/)
[washington.edu](http://courses.cs.washington.edu/courses/csep521/07wi/prj/rick.pdf) |
| ã·ã¹ãã èšèšäŸé¡ãè¿œå ãã | [Contribute](#contributing) |### å®äžçã®ã¢ãŒããã¯ãã£
> äžã®äžã®ã·ã¹ãã ãã©ã®ããã«èšèšãããŠãããã«ã€ããŠã®èšäº
Source: Twitter timelines at scale**以äžã®èšäºã®éç®±ã®é ãã€ã€ããããªçŽ°ãã詳现ã«ãã ãããªãããšãããã**
* å ±éã®åçãæè¡ããã¿ãŒã³ãæ¢ãããš
* ããããã®ã³ã³ããŒãã³ãã§ã©ããªåé¡ã解決ãããã³ã³ããŒãã³ãã¯ã©ãã§ããŸã䜿ããããã¯äœ¿ããªãããç¥ãããš
* åŠãã ããšã埩ç¿ããããš|çš®é¡ | ã·ã¹ãã | åèããŒãž |
|---|---|---|
| ããŒã¿åŠç | **MapReduce** - Googleã®åæ£ããŒã¿åŠçã·ã¹ãã | [research.google.com](http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/mapreduce-osdi04.pdf) |
| ããŒã¿åŠç | **Spark** - Databricksã®åæ£ããŒã¿åŠçã·ã¹ãã | [slideshare.net](http://www.slideshare.net/AGrishchenko/apache-spark-architecture) |
| ããŒã¿åŠç | **Storm** - Twitterã®åæ£ããŒã¿åŠçã·ã¹ãã | [slideshare.net](http://www.slideshare.net/previa/storm-16094009) |
| | | |
| ããŒã¿ã¹ã㢠| **Bigtable** - Googleã®ã«ã©ã æååæ£ããŒã¿ããŒã¹ | [harvard.edu](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf) |
| ããŒã¿ã¹ã㢠| **HBase** - Bigtableã®ãªãŒãã³ãœãŒã¹å®è£ | [slideshare.net](http://www.slideshare.net/alexbaranau/intro-to-hbase) |
| ããŒã¿ã¹ã㢠| **Cassandra** - Facebookã®ã«ã©ã æååæ£ããŒã¿ããŒã¹ | [slideshare.net](http://www.slideshare.net/planetcassandra/cassandra-introduction-features-30103666)
| ããŒã¿ã¹ã㢠| **DynamoDB** - Amazonã®ããã¥ã¡ã³ãæååæ£ããŒã¿ããŒã¹ | [harvard.edu](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf) |
| ããŒã¿ã¹ã㢠| **MongoDB** - ããã¥ã¡ã³ãæååæ£ããŒã¿ããŒã¹ | [slideshare.net](http://www.slideshare.net/mdirolf/introduction-to-mongodb) |
| ããŒã¿ã¹ã㢠| **Spanner** - Googleã®ã°ããŒãã«åæ£ããŒã¿ããŒã¹ | [research.google.com](http://research.google.com/archive/spanner-osdi2012.pdf) |
| ããŒã¿ã¹ã㢠| **Memcached** - åæ£ã¡ã¢ãªãŒãã£ãã·ã³ã°ã·ã¹ãã | [slideshare.net](http://www.slideshare.net/oemebamo/introduction-to-memcached) |
| ããŒã¿ã¹ã㢠| **Redis** - æ°žç¶æ§ãšããªã¥ãŒã¿ã€ããå Œãåããåæ£ã¡ã¢ãªãŒãã£ãã·ã³ã°ã·ã¹ãã | [slideshare.net](http://www.slideshare.net/dvirsky/introduction-to-redis) |
| | | |
| ãã¡ã€ã«ã·ã¹ãã | **Google File System (GFS)** - åæ£ãã¡ã€ã«ã·ã¹ãã | [research.google.com](http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/gfs-sosp2003.pdf) |
| ãã¡ã€ã«ã·ã¹ãã | **Hadoop File System (HDFS)** - GFSã®ãªãŒãã³ãœãŒã¹å®è£ | [apache.org](https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html) |
| | | |
| Misc | **Chubby** - ççµåã®åæ£ã·ã¹ãã ãããã¯ããGoogleã®ãµãŒãã¹ | [research.google.com](http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/archive/chubby-osdi06.pdf) |
| Misc | **Dapper** - åæ£ã·ã¹ãã ã远跡ããã€ã³ãã© | [research.google.com](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/36356.pdf)
| Misc | **Kafka** - LinkedInã«ããPub/subã¡ãã»ãŒãžãã¥ãŒ | [slideshare.net](http://www.slideshare.net/mumrah/kafka-talk-tri-hug) |
| Misc | **Zookeeper** - åæãå¯èœã«ããäžå€®éæš©ã€ã³ãã©ãšãµãŒãã¹ | [slideshare.net](http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) |
| | ã¢ãŒããã¯ãã£ãè¿œå ãã | [Contribute](#contributing) |### åäŒæ¥ã®ã¢ãŒããã¯ãã£
| äŒæ¥ | åèããŒãž |
|---|---|
| Amazon | [Amazon architecture](http://highscalability.com/amazon-architecture) |
| Cinchcast | [Producing 1,500 hours of audio every day](http://highscalability.com/blog/2012/7/16/cinchcast-architecture-producing-1500-hours-of-audio-every-d.html) |
| DataSift | [Realtime datamining At 120,000 tweets per second](http://highscalability.com/blog/2011/11/29/datasift-architecture-realtime-datamining-at-120000-tweets-p.html) |
| DropBox | [How we've scaled Dropbox](https://www.youtube.com/watch?v=PE4gwstWhmc) |
| ESPN | [Operating At 100,000 duh nuh nuhs per second](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html) |
| Google | [Google architecture](http://highscalability.com/google-architecture) |
| Instagram | [14 million users, terabytes of photos](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html)
[What powers Instagram](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances) |
| Justin.tv | [Justin.Tv's live video broadcasting architecture](http://highscalability.com/blog/2010/3/16/justintvs-live-video-broadcasting-architecture.html) |
| Facebook | [Scaling memcached at Facebook](https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/key-value/fb-memcached-nsdi-2013.pdf)
[TAO: Facebookâs distributed data store for the social graph](https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/data-store/tao-facebook-distributed-datastore-atc-2013.pdf)
[Facebookâs photo storage](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf) |
| Flickr | [Flickr architecture](http://highscalability.com/flickr-architecture) |
| Mailbox | [From 0 to one million users in 6 weeks](http://highscalability.com/blog/2013/6/18/scaling-mailbox-from-0-to-one-million-users-in-6-weeks-and-1.html) |
| Pinterest | [From 0 To 10s of billions of page views a month](http://highscalability.com/blog/2013/4/15/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a.html)
[18 million visitors, 10x growth, 12 employees](http://highscalability.com/blog/2012/5/21/pinterest-architecture-update-18-million-visitors-10x-growth.html) |
| Playfish | [50 million monthly users and growing](http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html) |
| PlentyOfFish | [PlentyOfFish architecture](http://highscalability.com/plentyoffish-architecture) |
| Salesforce | [How they handle 1.3 billion transactions a day](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html) |
| Stack Overflow | [Stack Overflow architecture](http://highscalability.com/blog/2009/8/5/stack-overflow-architecture.html) |
| TripAdvisor | [40M visitors, 200M dynamic page views, 30TB data](http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view.html) |
| Tumblr | [15 billion page views a month](http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html) |
| Twitter | [Making Twitter 10000 percent faster](http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster)
[Storing 250 million tweets a day using MySQL](http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html)
[150M active users, 300K QPS, a 22 MB/S firehose](http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html)
[Timelines at scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)
[Big and small data at Twitter](https://www.youtube.com/watch?v=5cKTP36HVgI)
[Operations at Twitter: scaling beyond 100 million users](https://www.youtube.com/watch?v=z8LU0Cj6BOU) |
| Uber | [How Uber scales their real-time market platform](http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html) |
| WhatsApp | [The WhatsApp architecture Facebook bought for $19 billion](http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html) |
| YouTube | [YouTube scalability](https://www.youtube.com/watch?v=w5WVu624fY8)
[YouTube architecture](http://highscalability.com/youtube-architecture) |### äŒæ¥ã®ãšã³ãžãã¢ããã°
> é¢æ¥ãåããäŒæ¥ã®ã¢ãŒããã¯ãã£
>
> æãããã質åã¯åãåéããæ¥ãããšãããã§ããã* [Airbnb Engineering](http://nerds.airbnb.com/)
* [Atlassian Developers](https://developer.atlassian.com/blog/)
* [Autodesk Engineering](http://cloudengineering.autodesk.com/blog/)
* [AWS Blog](https://aws.amazon.com/blogs/aws/)
* [Bitly Engineering Blog](http://word.bitly.com/)
* [Box Blogs](https://www.box.com/blog/engineering/)
* [Cloudera Developer Blog](http://blog.cloudera.com/blog/)
* [Dropbox Tech Blog](https://tech.dropbox.com/)
* [Engineering at Quora](http://engineering.quora.com/)
* [Ebay Tech Blog](http://www.ebaytechblog.com/)
* [Evernote Tech Blog](https://blog.evernote.com/tech/)
* [Etsy Code as Craft](http://codeascraft.com/)
* [Facebook Engineering](https://www.facebook.com/Engineering)
* [Flickr Code](http://code.flickr.net/)
* [Foursquare Engineering Blog](http://engineering.foursquare.com/)
* [GitHub Engineering Blog](https://github.blog/category/engineering)
* [Google Research Blog](http://googleresearch.blogspot.com/)
* [Groupon Engineering Blog](https://engineering.groupon.com/)
* [Heroku Engineering Blog](https://engineering.heroku.com/)
* [Hubspot Engineering Blog](http://product.hubspot.com/blog/topic/engineering)
* [High Scalability](http://highscalability.com/)
* [Instagram Engineering](http://instagram-engineering.tumblr.com/)
* [Intel Software Blog](https://software.intel.com/en-us/blogs/)
* [Jane Street Tech Blog](https://blogs.janestreet.com/category/ocaml/)
* [LinkedIn Engineering](http://engineering.linkedin.com/blog)
* [Microsoft Engineering](https://engineering.microsoft.com/)
* [Microsoft Python Engineering](https://blogs.msdn.microsoft.com/pythonengineering/)
* [Netflix Tech Blog](http://techblog.netflix.com/)
* [Paypal Developer Blog](https://devblog.paypal.com/category/engineering/)
* [Pinterest Engineering Blog](http://engineering.pinterest.com/)
* [Quora Engineering](https://engineering.quora.com/)
* [Reddit Blog](http://www.redditblog.com/)
* [Salesforce Engineering Blog](https://developer.salesforce.com/blogs/engineering/)
* [Slack Engineering Blog](https://slack.engineering/)
* [Spotify Labs](https://labs.spotify.com/)
* [Twilio Engineering Blog](http://www.twilio.com/engineering)
* [Twitter Engineering](https://engineering.twitter.com/)
* [Uber Engineering Blog](http://eng.uber.com/)
* [Yahoo Engineering Blog](http://yahooeng.tumblr.com/)
* [Yelp Engineering Blog](http://engineeringblog.yelp.com/)
* [Zynga Engineering Blog](https://www.zynga.com/blogs/engineering)#### ãã®ä»ã®åèè³æãããŒãž:
* [kilimchoi/engineering-blogs](https://github.com/kilimchoi/engineering-blogs)
ããã«ãããªã¹ãã¯æ¯èŒçå°èŠæš¡ãªãã®ã«ãšã©ãã[kilimchoi/engineering-blogs](https://github.com/kilimchoi/engineering-blogs)ã«ãã詳现ã«èšãããšã§éè€ããªãããã«ããŠããããšã«ããããšã³ãžãã¢ããã°ãžã®ãªã³ã¯ãè¿œå ããå Žåã¯ããã§ã¯ãªããengineering-blogsã¬ããžããªã«è¿œå ããããšãæ€èšããŠãã ããã
## é²è¡äžã®äœæ¥
ã»ã¯ã·ã§ã³ã®è¿œå ããé²è¡äžã®äœæ¥ãæäŒã£ãŠããã ããå Žåã¯[ãã¡ã](#contributing)!
* MapReduceã«ããåæ£ã³ã³ãã¥ãŒãã£ã³ã°
* Consistent hashing
* Scatter gather
* [Contribute](#contributing)## ã¯ã¬ãžãã
ã¯ã¬ãžããåã³ãåç §ããŒãžã¯é©æãã®ãªããžããªå ã«èšèŒããŠãããŸã
Special thanks to:
* [Hired in tech](http://www.hiredintech.com/system-design/the-system-design-process/)
* [Cracking the coding interview](https://www.amazon.com/dp/0984782850/)
* [High scalability](http://highscalability.com/)
* [checkcheckzz/system-design-interview](https://github.com/checkcheckzz/system-design-interview)
* [shashank88/system_design](https://github.com/shashank88/system_design)
* [mmcgrana/services-engineering](https://github.com/mmcgrana/services-engineering)
* [System design cheat sheet](https://gist.github.com/vasanthk/485d1c25737e8e72759f)
* [A distributed systems reading list](http://dancres.github.io/Pages/)
* [Cracking the system design interview](http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview)## Contact info
Feel free to contact me to discuss any issues, questions, or comments.
My contact info can be found on my [GitHub page](https://github.com/donnemartin).
## License
*I am providing code and resources in this repository to you under an open source license. Because this is my personal repository, the license you receive to my code and resources is from me and not my employer (Facebook).*
Copyright 2017 Donne Martin
Creative Commons Attribution 4.0 International License (CC BY 4.0)
http://creativecommons.org/licenses/by/4.0/