From f733e5970e9e65239e5dbdce077b8c984ff553d2 Mon Sep 17 00:00:00 2001
From: Rick Calixte <10281587+rcalixte@users.noreply.github.com>
Date: Sun, 26 Dec 2021 02:00:40 -0500
Subject: [PATCH] Add pandoc for PDF creation and GitHub Actions for
auto-generation
---
.github/workflows/main.yml | 46 +
.gitignore | 3 +-
README-ja.md | 2 +-
README-zh-Hans.md | 4 +-
README-zh-TW.md | 2 +-
README.md | 206 ++---
deeplists.tex | 24 +
images/3X8nmdL.png | Bin 0 -> 183630 bytes
images/48tEA2j.png | Bin 0 -> 189132 bytes
images/B8LDKD7.png | Bin 0 -> 23123 bytes
images/BKsBnmG.png | Bin 0 -> 93874 bytes
images/E8klrBh.png | Bin 0 -> 121053 bytes
images/KqZ3dSx.png | Bin 0 -> 60434 bytes
images/OZCxJr0.png | Bin 0 -> 177089 bytes
images/raoFTXM.png | Bin 0 -> 119054 bytes
images/rrfjMXB.png | Bin 0 -> 43887 bytes
images/vwMa1Qu.png | Bin 0 -> 79603 bytes
images/wxXyq2J.png | Bin 0 -> 60189 bytes
images/xjdAAUv.png | Bin 0 -> 109629 bytes
pandoc-docker.sh | 16 +
pandoc-en-US.yaml | 39 +
pandoc-zh-Hans.yaml | 34 +
pandoc.sh | 31 +
solutions/system_design/mint/README.md | 4 +-
solutions/system_design/pastebin/README.md | 4 +-
solutions/system_design/query_cache/README.md | 4 +-
solutions/system_design/sales_rank/README.md | 4 +-
solutions/system_design/scaling_aws/README.md | 12 +-
.../system_design/social_graph/README.md | 4 +-
solutions/system_design/twitter/README.md | 4 +-
solutions/system_design/web_crawler/README.md | 4 +-
unicode.latex | 814 ++++++++++++++++++
32 files changed, 1092 insertions(+), 169 deletions(-)
create mode 100644 .github/workflows/main.yml
create mode 100644 deeplists.tex
create mode 100644 images/3X8nmdL.png
create mode 100644 images/48tEA2j.png
create mode 100644 images/B8LDKD7.png
create mode 100644 images/BKsBnmG.png
create mode 100644 images/E8klrBh.png
create mode 100644 images/KqZ3dSx.png
create mode 100644 images/OZCxJr0.png
create mode 100644 images/raoFTXM.png
create mode 100644 images/rrfjMXB.png
create mode 100644 images/vwMa1Qu.png
create mode 100644 images/wxXyq2J.png
create mode 100644 images/xjdAAUv.png
create mode 100755 pandoc-docker.sh
create mode 100644 pandoc-en-US.yaml
create mode 100644 pandoc-zh-Hans.yaml
create mode 100755 pandoc.sh
create mode 100644 unicode.latex
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 00000000..dea43e63
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,46 @@
+---
+name: Generate PDF using Pandoc
+
+# Controls when the workflow will run
+on:
+ # Triggers the workflow on push or pull request events but only for the master branch
+ push:
+ branches: [ master ]
+
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ # This workflow contains a single job called "create_pdf"
+ create_pdf:
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+
+ # Pandoc Docker image v3.2.1.0
+ container:
+ image: pandoc/latex:3.2.1.0
+
+ # Steps represent a sequence of tasks that will be executed as part of the job
+ steps:
+ # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - uses: actions/checkout@v4
+
+ # Run the PDF creation script in the container
+ - uses: docker://pandoc/latex:3.2.1.0
+ with:
+ entrypoint: './pandoc-docker.sh'
+
+ # Create an output with the shortened version of the commit SHA
+ - id: short_sha
+ env:
+ GITHUB_SHA: ${{ github.sha }}
+ run: echo "::set-output name=short_sha::$(echo ${GITHUB_SHA::7})"
+
+ # Create a release with the PDFs as assets and the shortened SHA as the tag name
+ - uses: softprops/action-gh-release@v2
+ with:
+ tag_name: v${{ steps.short_sha.outputs.short_sha }}
+ draft: false
+ files: |
+ *.pdf
diff --git a/.gitignore b/.gitignore
index 5ca2fa24..77c14a88 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
# Byte-compiled / optimized / DLL files
*.epub
+*.pdf
__pycache__/
*.py[cod]
@@ -61,4 +62,4 @@ target/
scratch/
# IPython Notebook templates
-template.ipynb
\ No newline at end of file
+template.ipynb
diff --git a/README-ja.md b/README-ja.md
index c5e58a00..3f0060dc 100644
--- a/README-ja.md
+++ b/README-ja.md
@@ -1,4 +1,4 @@
-*[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)*
+*[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)*
# システム設計入門
diff --git a/README-zh-Hans.md b/README-zh-Hans.md
index 65dbe23c..bb547f6f 100644
--- a/README-zh-Hans.md
+++ b/README-zh-Hans.md
@@ -3,7 +3,7 @@
> * 译者:[XatMassacrE](https://github.com/XatMassacrE)、[L9m](https://github.com/L9m)、[Airmacho](https://github.com/Airmacho)、[xiaoyusilen](https://github.com/xiaoyusilen)、[jifaxu](https://github.com/jifaxu)、[根号三](https://github.com/sqrthree)
> * 这个 [链接](https://github.com/xitu/system-design-primer/compare/master...donnemartin:master) 用来查看本翻译与英文版是否有差别(如果你没有看到 README.md 发生变化,那就意味着这份翻译文档是最新的)。
-*[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)*
+*[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)*
# 系统设计入门
@@ -1193,7 +1193,7 @@ def get_user(self, user_id):
##### 缓存的缺点:
- 请求的数据如果不在缓存中就需要经过三个步骤来获取数据,这会导致明显的延迟。
-- 如果数据库中的数据更新了会导致缓存中的数据过时。这个问题需要通过设置 TTL 强制更新缓存或者直写模式来缓解这种情况。
+- 如果数据库中的数据更新了会导致缓存中的数据过时。这个问题需要通过设置 TTL 强制更新缓存或者直写模式来缓解这种情况。
- 当一个节点出现故障的时候,它将会被一个新的节点替代,这增加了延迟的时间。
#### 直写模式
diff --git a/README-zh-TW.md b/README-zh-TW.md
index 70449a75..27fcaf3b 100644
--- a/README-zh-TW.md
+++ b/README-zh-TW.md
@@ -1,4 +1,4 @@
-*[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)*
+*[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)*
# 系統設計入門
diff --git a/README.md b/README.md
index f2285f36..fe0118f9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-*[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)*
+*[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)*
**Help [translate](TRANSLATIONS.md) this guide!**
@@ -45,10 +45,7 @@ Additional topics for interview prep:
## Anki flashcards
-
-
-
-
+![Anki flashcards](images/zdCAkB3.png)
The provided [Anki flashcard decks](https://apps.ankiweb.net/) use spaced repetition to help you retain key system design concepts.
@@ -62,10 +59,7 @@ Great for use while on-the-go.
Looking for resources to help you prep for the [**Coding Interview**](https://github.com/donnemartin/interactive-coding-challenges)?
-
-
-
-
+![Interactive Coding Challenges](images/b4YtAEN.png)
Check out the sister repo [**Interactive Coding Challenges**](https://github.com/donnemartin/interactive-coding-challenges), which contains an additional Anki deck:
@@ -183,7 +177,7 @@ Review the [Contributing Guidelines](CONTRIBUTING.md).
> Suggested topics to review based on your interview timeline (short, medium, long).
-![Imgur](images/OfVllex.png)
+![Study Guide](images/OfVllex.png)
**Q: For interviews, do I need to know everything here?**
@@ -306,49 +300,49 @@ Check out the following links to get a better idea of what to expect:
[View exercise and solution](solutions/system_design/pastebin/README.md)
-![Imgur](images/4edXG0T.png)
+![Scaled design of Pastebin.com (or Bit.ly)](images/4edXG0T.png)
### Design the Twitter timeline and search (or Facebook feed and search)
[View exercise and solution](solutions/system_design/twitter/README.md)
-![Imgur](images/jrUBAF7.png)
+![Scaled design of the Twitter timeline and search (or Facebook feed and search)](images/jrUBAF7.png)
### Design a web crawler
[View exercise and solution](solutions/system_design/web_crawler/README.md)
-![Imgur](images/bWxPtQA.png)
+![Scaled design of a web crawler](images/bWxPtQA.png)
### Design Mint.com
[View exercise and solution](solutions/system_design/mint/README.md)
-![Imgur](images/V5q57vU.png)
+![Scaled design of Mint.com](images/V5q57vU.png)
### Design the data structures for a social network
[View exercise and solution](solutions/system_design/social_graph/README.md)
-![Imgur](images/cdCv5g7.png)
+![Scaled design of the data structures for a social network](images/cdCv5g7.png)
### Design a key-value store for a search engine
[View exercise and solution](solutions/system_design/query_cache/README.md)
-![Imgur](images/4j99mhe.png)
+![Scaled design of a key-value store for a search engine](images/4j99mhe.png)
### Design Amazon's sales ranking by category feature
[View exercise and solution](solutions/system_design/sales_rank/README.md)
-![Imgur](images/MzExP06.png)
+![Scaled design of Amazon's sales ranking by category feature](images/MzExP06.png)
### Design a system that scales to millions of users on AWS
[View exercise and solution](solutions/system_design/scaling_aws/README.md)
-![Imgur](images/jj3A5N8.png)
+![Scaled design of a system that scales to millions of users on AWS](images/jj3A5N8.png)
## Object-oriented design interview questions with solutions
@@ -439,11 +433,8 @@ Generally, you should aim for **maximal throughput** with **acceptable latency**
### CAP theorem
-
-
-
- Source: CAP theorem revisited
-
+![CAP theorem](images/bgLMI2u.png)
+[Source: CAP theorem revisited](https://robertgreiner.com/cap-theorem-revisited)
In a distributed computer system, you can only support two of the following guarantees:
@@ -580,11 +571,8 @@ If both `Foo` and `Bar` each had 99.9% availability, their total availability in
## Domain name system
-
-
-
- Source: DNS security presentation
-
+![Simple DNS lookup](images/IOyLj4i.jpg)
+[Source: DNS security presentation](https://www.slideshare.net/srikrupa5/dns-security-presentation-issa)
A Domain Name System (DNS) translates a domain name such as www.example.com to an IP address.
@@ -618,11 +606,8 @@ Services such as [CloudFlare](https://www.cloudflare.com/dns/) and [Route 53](ht
## Content delivery network
-
-
-
- Source: Why use a CDN
-
+![Content delivery network](images/h9TAuGI.jpg)
+[Source: Why use a CDN](https://www.creative-artworks.eu/why-use-a-content-delivery-network-cdn/)
A content delivery network (CDN) is a globally distributed network of proxy servers, serving content from locations closer to the user. Generally, static files such as HTML/CSS/JS, photos, and videos are served from CDN, although some CDNs such as Amazon's CloudFront support dynamic content. The site's DNS resolution will tell clients which server to contact.
@@ -659,11 +644,8 @@ Sites with heavy traffic work well with pull CDNs, as traffic is spread out more
## Load balancer
-
-
-
- Source: Scalable system design patterns
-
+![Load balancer pattern](images/h81n9iK.png)
+[Source: Scalable system design patterns](https://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html)
Load balancers distribute incoming client requests to computing resources such as application servers and databases. In each case, the load balancer returns the response from the computing resource to the appropriate client. Load balancers are effective at:
@@ -729,12 +711,8 @@ Load balancers can also help with horizontal scaling, improving performance and
## Reverse proxy (web server)
-
-
-
- Source: Wikipedia
-
-
+![Reverse proxy (web server)](images/n41Azff.png)
+[Source: Wikipedia](https://upload.wikimedia.org/wikipedia/commons/6/67/Reverse_proxy_h2g2bob.svg)
A reverse proxy is a web server that centralizes internal services and provides unified interfaces to the public. Requests from clients are forwarded to a server that can fulfill it before the reverse proxy returns the server's response to the client.
@@ -772,11 +750,8 @@ Additional benefits include:
## Application layer
-
-
-
- Source: Intro to architecting systems for scale
-
+![Load balancing requests](images/yB5SYwm.png)
+[Source: Intro to architecting systems for scale](https://lethain.com/introduction-to-architecting-systems-for-scale/#platform_layer)
Separating out the web layer from the application layer (also known as platform layer) allows you to scale and configure both layers independently. Adding a new API results in adding application servers without necessarily adding additional web servers. The **single responsibility principle** advocates for small and autonomous services that work together. Small teams with small services can plan more aggressively for rapid growth.
@@ -807,11 +782,8 @@ Systems such as [Consul](https://www.consul.io/docs/index.html), [Etcd](https://
## Database
-
-
-
- Source: Scaling up to your first 10 million users
-
+![Scaled database serving traffic](images/Xkm5CXz.png)
+[Source: Scaling up to your first 10 million users](https://www.youtube.com/watch?v=kKjm4ehYiMs)
### Relational database management system (RDBMS)
@@ -830,11 +802,8 @@ There are many techniques to scale a relational database: **master-slave replica
The master serves reads and writes, replicating writes to one or more slaves, which serve only reads. Slaves can also replicate to additional slaves in a tree-like fashion. If the master goes offline, the system can continue to operate in read-only mode until a slave is promoted to a master or a new master is provisioned.
-
-
-
- Source: Scalability, availability, stability, patterns
-
+![Master-slave replication](images/C9ioGtn.png)
+[Source: Scalability, availability, stability, patterns](https://www.slideshare.net/jboner/scalability-availability-stability-patterns)
##### Disadvantage(s): master-slave replication
@@ -845,11 +814,8 @@ The master serves reads and writes, replicating writes to one or more slaves, wh
Both masters serve reads and writes and coordinate with each other on writes. If either master goes down, the system can continue to operate with both reads and writes.
-
-
-
- Source: Scalability, availability, stability, patterns
-
+![Master-master replication](images/krAHLGg.png)
+[Source: Scalability, availability, stability, patterns](https://www.slideshare.net/jboner/scalability-availability-stability-patterns)
##### Disadvantage(s): master-master replication
@@ -873,11 +839,8 @@ Both masters serve reads and writes and coordinate with each other on writes. I
#### Federation
-
-
-
- Source: Scaling up to your first 10 million users
-
+![Functional partitioning (federation)](images/U3qV33e.png)
+[Source: Scaling up to your first 10 million users](https://www.youtube.com/watch?v=kKjm4ehYiMs)
Federation (or functional partitioning) splits up databases by function. For example, instead of a single, monolithic database, you could have three databases: **forums**, **users**, and **products**, resulting in less read and write traffic to each database and therefore less replication lag. Smaller databases result in more data that can fit in memory, which in turn results in more cache hits due to improved cache locality. With no single central master serializing writes you can write in parallel, increasing throughput.
@@ -894,11 +857,8 @@ Federation (or functional partitioning) splits up databases by function. For ex
#### Sharding
-
-
-
- Source: Scalability, availability, stability, patterns
-
+![Sharding](images/wU8x5Id.png)
+[Source: Scalability, availability, stability, patterns](https://www.slideshare.net/jboner/scalability-availability-stability-patterns)
Sharding distributes data across different databases such that each database can only manage a subset of the data. Taking a users database as an example, as the number of users increases, more shards are added to the cluster.
@@ -1038,11 +998,8 @@ Document stores provide high flexibility and are often used for working with occ
#### Wide column store
-
-
-
- Source: SQL & NoSQL, a brief history
-
+![Wide column store](images/n16iOGk.png)
+[Source: SQL & NoSQL, a brief history](https://blog.grio.com/2015/11/sql-nosql-a-brief-history.html)
> Abstraction: nested map `ColumnFamily>`
@@ -1061,11 +1018,8 @@ Wide column stores offer high availability and high scalability. They are often
#### Graph database
-
-
-
- Source: Graph database
-
+![Graph database](images/fNcl65g.png)
+[Source: Graph database](https://en.wikipedia.org/wiki/File:GraphDatabase_PropertyGraph.png)
> Abstraction: graph
@@ -1089,11 +1043,8 @@ Graphs databases offer high performance for data models with complex relationshi
### SQL or NoSQL
-
-
-
- Source: Transitioning from RDBMS to NoSQL
-
+![SQL or NoSQL](images/wXGqG5f.png)
+[Source: Transitioning from RDBMS to NoSQL](https://www.infoq.com/articles/Transition-RDBMS-NoSQL)
Reasons for **SQL**:
@@ -1131,11 +1082,8 @@ Sample data well-suited for NoSQL:
## Cache
-
-
-
- Source: Scalable system design patterns
-
+![Cache](images/Q6z24La.png)
+[Source: Scalable system design patterns](https://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html)
Caching improves page load times and can reduce the load on your servers and databases. In this model, the dispatcher will first lookup if the request has been made before and try to find the previous result to return, in order to save the actual execution.
@@ -1202,11 +1150,8 @@ Since you can only store a limited amount of data in cache, you'll need to deter
#### Cache-aside
-
-
-
- Source: From cache to in-memory data grid
-
+![Cache-aside](images/ONjORqk.png)
+[Source: From cache to in-memory data grid](https://www.slideshare.net/tmatyashovsky/from-cache-to-in-memory-data-grid-introduction-to-hazelcast)
The application is responsible for reading and writing from storage. The cache does not interact with storage directly. The application does the following:
@@ -1238,11 +1183,8 @@ Subsequent reads of data added to cache are fast. Cache-aside is also referred
#### Write-through
-
-
-
- Source: Scalability, availability, stability, patterns
-
+![Write-through](images/0vBc0hN.png)
+[Source: Scalability, availability, stability, patterns](https://www.slideshare.net/jboner/scalability-availability-stability-patterns)
The application uses the cache as the main data store, reading and writing data to it, while the cache is responsible for reading and writing to the database:
@@ -1273,11 +1215,8 @@ Write-through is a slow overall operation due to the write operation, but subseq
#### Write-behind (write-back)
-
-
-
- Source: Scalability, availability, stability, patterns
-
+![Write-behind (write-back)](images/rgSrvjG.png)
+[Source: Scalability, availability, stability, patterns](https://www.slideshare.net/jboner/scalability-availability-stability-patterns)
In write-behind, the application does the following:
@@ -1291,11 +1230,8 @@ In write-behind, the application does the following:
#### Refresh-ahead
-
-
-
- Source: From cache to in-memory data grid
-
+![Refresh-ahead](images/kxtjqgE.png)
+[Source: From cache to in-memory data grid](https://www.slideshare.net/tmatyashovsky/from-cache-to-in-memory-data-grid-introduction-to-hazelcast)
You can configure the cache to automatically refresh any recently accessed cache entry prior to its expiration.
@@ -1323,11 +1259,8 @@ Refresh-ahead can result in reduced latency vs read-through if the cache can acc
## Asynchronism
-
-
-
- Source: Intro to architecting systems for scale
-
+![Asynchronism](images/54GYsSx.png)
+[Source: Intro to architecting systems for scale](https://lethain.com/introduction-to-architecting-systems-for-scale/#platform_layer)
Asynchronous workflows help reduce request times for expensive operations that would otherwise be performed in-line. They can also help by doing time-consuming work in advance, such as periodic aggregation of data.
@@ -1369,11 +1302,8 @@ If queues start to grow significantly, the queue size can become larger than mem
## Communication
-
-
-
- Source: OSI 7 layer model
-
+![OSI 7 Layer Model](images/5KeocQs.jpg)
+[Source: OSI 7 layer model](https://www.escotal.com/osilayer.html)
### Hypertext transfer protocol (HTTP)
@@ -1401,11 +1331,8 @@ HTTP is an application layer protocol relying on lower-level protocols such as *
### Transmission control protocol (TCP)
-
-
-
- Source: How to make a multiplayer game
-
+![TCP](images/JdAsdvG.jpg)
+[Source: How to make a multiplayer game](http://www.wildbunny.co.uk/blog/2012/10/09/how-to-make-a-multi-player-game-part-1)
TCP is a connection-oriented protocol over an [IP network](https://en.wikipedia.org/wiki/Internet_Protocol). Connection is established and terminated using a [handshake](https://en.wikipedia.org/wiki/Handshaking). All packets sent are guaranteed to reach the destination in the original order and without corruption through:
@@ -1425,11 +1352,8 @@ Use TCP over UDP when:
### User datagram protocol (UDP)
-
-
-
- Source: How to make a multiplayer game
-
+![UDP](images/yzDrJtA.jpg)
+[Source: How to make a multiplayer game](http://www.wildbunny.co.uk/blog/2012/10/09/how-to-make-a-multi-player-game-part-1)
UDP is connectionless. Datagrams (analogous to packets) are guaranteed only at the datagram level. Datagrams might reach their destination out of order or not at all. UDP does not support congestion control. Without the guarantees that TCP support, UDP is generally more efficient.
@@ -1454,11 +1378,8 @@ Use UDP over TCP when:
### Remote procedure call (RPC)
-
-
-
- Source: Crack the system design interview
-
+![RPC](images/iF4Mkb5.png)
+[Source: Crack the system design interview](https://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview)
In an RPC, a client causes a procedure to execute on a different address space, usually a remote server. The procedure is coded as if it were a local procedure call, abstracting away the details of how to communicate with the server from the client program. Remote calls are usually slower and less reliable than local calls so it is helpful to distinguish RPC calls from local calls. Popular RPC frameworks include [Protobuf](https://developers.google.com/protocol-buffers/), [Thrift](https://thrift.apache.org/), and [Avro](https://avro.apache.org/docs/current/).
@@ -1680,11 +1601,8 @@ Handy metrics based on numbers above:
> Articles on how real world systems are designed.
-
-
-
- Source: Twitter timelines at scale
-
+![Twitter timeline scalability](images/TcUo2fw.png)
+[Source: Twitter timelines at scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)
**Don't focus on nitty gritty details for the following articles, instead:**
diff --git a/deeplists.tex b/deeplists.tex
new file mode 100644
index 00000000..a35480a6
--- /dev/null
+++ b/deeplists.tex
@@ -0,0 +1,24 @@
+ \usepackage{enumitem}
+ \setlistdepth{9}
+
+ \setlist[itemize,1]{label=$\bullet$}
+ \setlist[itemize,2]{label=$\bullet$}
+ \setlist[itemize,3]{label=$\bullet$}
+ \setlist[itemize,4]{label=$\bullet$}
+ \setlist[itemize,5]{label=$\bullet$}
+ \setlist[itemize,6]{label=$\bullet$}
+ \setlist[itemize,7]{label=$\bullet$}
+ \setlist[itemize,8]{label=$\bullet$}
+ \setlist[itemize,9]{label=$\bullet$}
+ \renewlist{itemize}{itemize}{9}
+
+ \setlist[enumerate,1]{label=$\arabic*.$}
+ \setlist[enumerate,2]{label=$\alph*.$}
+ \setlist[enumerate,3]{label=$\roman*.$}
+ \setlist[enumerate,4]{label=$\arabic*.$}
+ \setlist[enumerate,5]{label=$\alpha*$}
+ \setlist[enumerate,6]{label=$\roman*.$}
+ \setlist[enumerate,7]{label=$\arabic*.$}
+ \setlist[enumerate,8]{label=$\alph*.$}
+ \setlist[enumerate,9]{label=$\roman*.$}
+ \renewlist{enumerate}{enumerate}{9}
diff --git a/images/3X8nmdL.png b/images/3X8nmdL.png
new file mode 100644
index 0000000000000000000000000000000000000000..121363731d1d682a89145684677ae83e8db0446d
GIT binary patch
literal 183630
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