From 7cda218787c49cfe21456a3f9cc3226f1d65ae60 Mon Sep 17 00:00:00 2001 From: Kevin Xu <kevin.xu.v@gmail.com> Date: Fri, 7 Jun 2019 09:28:27 +0800 Subject: [PATCH] Translate web crawler solution doc to simplified Chinese --- .../web_crawler/README-zh-Hans.md | 353 ++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 solutions/system_design/web_crawler/README-zh-Hans.md diff --git a/solutions/system_design/web_crawler/README-zh-Hans.md b/solutions/system_design/web_crawler/README-zh-Hans.md new file mode 100644 index 0000000..eb91ed2 --- /dev/null +++ b/solutions/system_design/web_crawler/README-zh-Hans.md @@ -0,0 +1,353 @@ +# 设计一个网页爬虫 + +**Note: 为了é¿å…é‡å¤ï¼Œå½“剿–‡æ¡£ç›´æŽ¥é“¾æŽ¥åˆ°[系统设计主题](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#系统设计主题的索引)的相关区域,请å‚考链接内容以获得综åˆçš„è®¨è®ºç‚¹ã€æƒè¡¡å’Œæ›¿ä»£æ–¹æ¡ˆã€‚** + +## 第一æ¥ï¼šæ¦‚è¿°ç”¨ä¾‹å’Œçº¦æŸ + +> 收集这个问题的需求和范畴。 +> é—®ç›¸å…³é—®é¢˜æ¥æ˜Žç¡®ç”¨ä¾‹å’Œçº¦æŸã€‚ +> 讨论一些å‡è®¾ã€‚ + +å› ä¸ºæ²¡æœ‰é¢è¯•å®˜æ¥æ˜Žç¡®è¿™äº›é—®é¢˜ï¼Œæ‰€ä»¥æˆ‘们自己将定义一些用例和约æŸã€‚ + +### 用例 + +#### 我们将问题的范畴é™å®šåœ¨å¦‚下用例 + +* **æœåŠ¡** 爬å–一个 url 列表: + * ä¸ºåŒ…å«æœç´¢é¡¹çš„页é¢ç”Ÿæˆå•è¯çš„åå‘索引 + * 生æˆé¡µé¢çš„æ ‡é¢˜å’Œæ‘˜è¦ + * æ ‡é¢˜å’Œæ‘˜è¦æ˜¯é™æ€çš„,它们ä¸ä¼šæ ¹æ®æœç´¢æŸ¥è¯¢è¿›è¡Œæ›´æ”¹ +* **用户** 输入æœç´¢è¯å¹¶æŸ¥çœ‹åŒ…å«çˆ¬ç½‘程åºç”Ÿæˆçš„æ ‡é¢˜å’Œæ‘˜è¦çš„相关页é¢åˆ—表 + * 仅为æ¤ç”¨ä¾‹ç»˜åˆ¶é«˜çº§ç»„ä»¶å’Œäº¤äº’ï¼Œæ— éœ€æ·±å…¥ç ”ç©¶ +* **æœåŠ¡** 需è¦é«˜å¯ç”¨ + +#### 超出范畴的用例 + +* æœç´¢åˆ†æž +* 个性化æœç´¢ç»“æžœ +* 网页排å + +### 约æŸå’Œå‡è®¾ + +#### 状æ€å‡è®¾ + +* æµé‡ä¸æ˜¯å‡åŒ€åˆ†å¸ƒçš„ + * 有些æœç´¢éžå¸¸é¢‘ç¹ï¼Œè€Œå…¶ä»–æœç´¢åªæ‰§è¡Œä¸€æ¬¡ +* 仅支æŒåŒ¿å用户 +* åº”è¯¥å¾ˆå¿«ç”Ÿæˆæœç´¢ç»“æžœ +* 网页爬虫ä¸åº”è¯¥é™·å…¥æ— é™å¾ªçޝ + * 如果图形包å«å¾ªçŽ¯ï¼Œæˆ‘ä»¬ä¼šé™·å…¥æ— é™å¾ªçޝ +* 10 äº¿ä¸ªé“¾æŽ¥çˆ¬å– + * 需è¦å®šæœŸçˆ¬å–页é¢ä»¥ç¡®ä¿æ–°é²œåº¦ + * å¹³å‡åˆ·æ–°çŽ‡çº¦ä¸ºæ¯å‘¨ä¸€æ¬¡ï¼Œå¯¹äºŽçƒé—¨ç½‘ç«™æ›´ä¸ºé¢‘ç¹ + * æ¯æœˆçˆ¬å– 40 亿个链接 + * æ¯ä¸ªç½‘页的平å‡å˜å‚¨å¤§å°ï¼š500 KB + * 为简å•èµ·è§ï¼Œè®¡æ•°æ›´æ”¹ä¸Žæ–°é¡µé¢ç›¸åŒ +* æ¯æœˆ 1000 亿次æœç´¢ + +ä½¿ç”¨æ›´ä¼ ç»Ÿçš„ç³»ç»Ÿ - ä¸è¦ä½¿ç”¨ [solr](http://lucene.apache.org/solr/) 或 [nutch](http://nutch.apache.org/) ç‰çŽ°æœ‰ç³»ç»Ÿã€‚ + +#### 计算使用 + +**如果您应该è¿è¡ŒèƒŒä¿¡æ¯ä½¿ç”¨è®¡ç®—,请与您的é¢è¯•官澄清。** + +* æ¯ä¸ªæœˆå˜å‚¨é¡µé¢å†…容 2 PB + * æ¯ä¸ªé¡µé¢ 500 KB * æ¯ä¸ªæœˆçˆ¬å– 40 亿个链接 + * 在3年内å˜å‚¨çš„页é¢å†…容为 72 PB +* æ¯ç§’ 1,600 次写请求 +* æ¯ç§’ 40,000 次æœç´¢è¯·æ±‚ + +æ–¹ä¾¿çš„è½¬æ¢æŒ‡å—: + +* æ¯æœˆ 250 万秒 +* æ¯ç§’1个请求=æ¯æœˆ 250 万个请求 +* æ¯ç§’40个请求=æ¯æœˆ 1 亿个请求 +* æ¯ç§’400个请求=æ¯æœˆ 10 亿个请求 + +## 第二æ¥ï¼šåˆ›å»ºä¸€ä¸ªé«˜å±‚次设计 + +> 概述一个包括所有é‡è¦çš„组件的高层次设计 + + + +## 第三æ¥ï¼šè®¾è®¡æ ¸å¿ƒç»„ä»¶ + +> 深入æ¯ä¸€ä¸ªæ ¸å¿ƒç»„件的细节 + +### 用例:æœåŠ¡çˆ¬å–一个网å€åˆ—表 + +å‡è®¾æˆ‘ä»¬æœ‰ä¸€ä¸ªæœ€åˆæ ¹æ®æ•´ä½“网站æµè¡Œåº¦æŽ’åçš„ `links_to_crawl` 列表。 å¦‚æžœè¿™ä¸æ˜¯ä¸€ä¸ªåˆç†çš„å‡è®¾ï¼Œæˆ‘们å¯ä»¥ä½¿ç”¨é“¾æŽ¥åˆ°å¤–部内容(如 [Yahoo](https://www.yahoo.com/),[DMOZ](http://www.dmoz.org/) ç‰ï¼‰çš„çƒé—¨ç½‘站为爬虫æ’ç§ã€‚ + +我们将使用表 `crawled_links` æ¥å˜å‚¨å·²å¤„ç†çš„链接åŠå…¶é¡µé¢ç¾å。 + +我们å¯ä»¥å°† `links_to_crawl` å’Œ `crawled_links` å˜å‚¨åœ¨é”®å€¼ **NoSQL Database** ä¸ã€‚ 对于 `links_to_crawl` ä¸çš„æŽ’å链接,我们å¯ä»¥ä½¿ç”¨ [Redis](https://redis.io/) 和排åºé›†æ¥ç»´æŠ¤é¡µé¢é“¾æŽ¥çš„æŽ’å。我们应该讨论[选择 SQL 或 NoSQL 之间的用例和æƒè¡¡](https://github.com/donnemartin/system-design-primer#sql-or-nosql)。 + +* **爬虫æœåŠ¡**通过下é¢çš„å¾ªçŽ¯å¤„ç†æ¯ä¸€ä¸ªé¡µé¢é“¾æŽ¥ï¼š + * 采用排åé å‰çš„页é¢é“¾æŽ¥è¿›è¡Œçˆ¬å– + * 检查 **NoSQL Database** ä¸çš„ `crawled_links` 以获å–具有类似页ç¾åçš„æ¡ç›® + * 如果我们有类似的页é¢ï¼Œåˆ™é™ä½Žé¡µé¢é“¾æŽ¥çš„优先级 + * è¿™å¯ä»¥é˜²æ¢æˆ‘们进入一个循环 + * ç»§ç»æ‰§è¡Œ + * å¦åˆ™, 爬å–这个链接 + * å°†ä¸€ä¸ªä»»åŠ¡æ·»åŠ åˆ°**åå‘索引æœåŠ¡**队列以生æˆ[åå‘索引](https://en.wikipedia.org/wiki/Search_engine_indexing) + * å°†ä¸€ä¸ªä»»åŠ¡æ·»åŠ åˆ°**文档æœåŠ¡**队列以生æˆä¸€ä¸ªé™æ€æ ‡é¢˜å’Œæ‘˜è¦ + * 生æˆé¡µé¢çš„ç¾å + * 把这个链接从 **NoSQL Database** ä¸çš„ `links_to_crawl` åˆ é™¤ + * 将页é¢é“¾æŽ¥å’Œç¾åæ’å…¥ **NoSQL Database** ä¸çš„ `crawled_links` + +**å‘é¢è¯•å®˜é˜æ˜Žä½ 需è¦å†™å¤šå°‘代ç ** + +`PagesDataStore` 是**爬虫æœåŠ¡**ä¸ä½¿ç”¨ **NoSQL Database** 的抽象: + +```python +class PagesDataStore(object): + + def __init__(self, db); + self.db = db + ... + + def add_link_to_crawl(self, url): + """Add the given link to `links_to_crawl`.""" + ... + + def remove_link_to_crawl(self, url): + """Remove the given link from `links_to_crawl`.""" + ... + + def reduce_priority_link_to_crawl(self, url): + """Reduce the priority of a link in `links_to_crawl` to avoid cycles.""" + ... + + def extract_max_priority_page(self): + """Return the highest priority link in `links_to_crawl`.""" + ... + + def insert_crawled_link(self, url, signature): + """Add the given link to `crawled_links`.""" + ... + + def crawled_similar(self, signature): + """Determine if we've already crawled a page matching the given signature""" + ... +``` + +`Page` 是**爬虫æœåŠ¡**ä¸çš„一个抽象,它å°è£…了一个页é¢ï¼Œä»¥åŠå®ƒçš„内容,åURLå’Œç¾å: + +```python +class Page(object): + + def __init__(self, url, contents, child_urls, signature): + self.url = url + self.contents = contents + self.child_urls = child_urls + self.signature = signature +``` + +`Crawler` 是**爬虫æœåŠ¡**ä¸çš„主è¦ç±»ï¼Œç”± `Page` å’Œ `PagesDataStore` 组æˆã€‚ + +```python +class Crawler(object): + + def __init__(self, data_store, reverse_index_queue, doc_index_queue): + self.data_store = data_store + self.reverse_index_queue = reverse_index_queue + self.doc_index_queue = doc_index_queue + + def create_signature(self, page): + """Create signature based on url and contents.""" + ... + + def crawl_page(self, page): + for url in page.child_urls: + self.data_store.add_link_to_crawl(url) + page.signature = self.create_signature(page) + self.data_store.remove_link_to_crawl(page.url) + self.data_store.insert_crawled_link(page.url, page.signature) + + def crawl(self): + while True: + page = self.data_store.extract_max_priority_page() + if page is None: + break + if self.data_store.crawled_similar(page.signature): + self.data_store.reduce_priority_link_to_crawl(page.url) + else: + self.crawl_page(page) +``` + +### 处ç†é‡å¤ + +æˆ‘ä»¬éœ€è¦æ³¨æ„网络爬虫ä¸ä¼šé™·å…¥æ— é™å¾ªçŽ¯ï¼Œè¿™ä¼šåœ¨å½“å›¾å½¢åŒ…å«ä¸€ä¸ªå¾ªçŽ¯æ—¶å‘生。 + +**å‘é¢è¯•å®˜é˜æ˜Žä½ 需è¦å†™å¤šå°‘代ç ** + +我们è¦åˆ 除é‡å¤çš„网å€ï¼š + +* 对于较å°çš„列表,我们å¯ä»¥ä½¿ç”¨ç±»ä¼¼æŽ’åºçš„ `sort | unique` +* 有 10 亿个链接爬å–,我们å¯ä»¥ä½¿ç”¨ **MapReduce** æ¥åªè¾“出频率为 1 çš„æ¡ç›® + +```python +class RemoveDuplicateUrls(MRJob): + + def mapper(self, _, line): + yield line, 1 + + def reducer(self, key, values): + total = sum(values) + if total == 1: + yield key, total +``` + +检测é‡å¤å†…å®¹æ›´å¤æ‚。 我们å¯ä»¥æ ¹æ®é¡µé¢å†…容生æˆç¾å,并比较这两个ç¾å的相似性。 一些潜在的算法是 [雅克塿Œ‡æ•°](https://en.wikipedia.org/wiki/Jaccard_index) å’Œ[余弦相似度](https://en.wikipedia.org/wiki/Cosine_similarity)。 + +### 确定何时更新爬å–结果 + +需è¦å®šæœŸçˆ¬å–页é¢ä»¥ç¡®ä¿æ–°é²œåº¦ã€‚ 爬å–结果å¯èƒ½æœ‰ä¸€ä¸ª `timestamp` å—æ®µï¼Œè¡¨ç¤ºçˆ¬å–页é¢çš„æœ€åŽæ—¶é—´ã€‚ 在默认时间段(例如一周)之åŽï¼Œåº”刷新所有页é¢ã€‚ ç»å¸¸æ›´æ–°æˆ–æ›´å—æ¬¢è¿Žçš„网站å¯ä»¥åœ¨è¾ƒçŸçš„æ—¶é—´é—´éš”内刷新。 + +虽然我们ä¸ä¼šæ·±å…¥ç ”究分æžçš„细节,但我们å¯ä»¥è¿›è¡Œä¸€äº›æ•°æ®æŒ–æŽ˜ä»¥ç¡®å®šç‰¹å®šé¡µé¢æ›´æ–°ä¹‹å‰çš„平凿—¶é—´ï¼Œå¹¶ä½¿ç”¨è¯¥ç»Ÿè®¡ä¿¡æ¯æ¥ç¡®å®šé‡æ–°çˆ¬å–页é¢çš„频率。 + +我们也å¯èƒ½é€‰æ‹©æ”¯æŒä¸€ä¸ª `Robots.txt` 文件,该文件å¯è®©ç½‘站管ç†å‘˜æŽ§åˆ¶çˆ¬å–频率。 + +### 用例:用户输入æœç´¢è¯å¹¶æŸ¥çœ‹å¸¦æœ‰æ ‡é¢˜å’Œæ‘˜è¦çš„相关页é¢åˆ—表 + +* **客户端**å‘é€ä¸€ä¸ªè¯·æ±‚到作为一个[åå‘代ç†](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#åå‘代ç†web-æœåС噍)å¯åŠ¨çš„ **Web æœåС噍** +* **Web æœåС噍** 转å‘请求给 **查询接å£** æœåС噍 +* **查询接å£** æœåŠ¡å™¨æ‰§è¡Œå¦‚ä¸‹æ“作: + * è§£æžè¿™ä¸ªæŸ¥è¯¢ + * åˆ é™¤æ ‡è®° + * å°†æ–‡æœ¬åˆ†è§£ä¸ºæœ¯è¯ + * å¤„ç†æ‹¼å†™é”™è¯¯ + * 规范化大写 + * 将查询转æ¢ä¸ºä½¿ç”¨å¸ƒå°”è¿ç®— + * 使用**åå‘索引æœåŠ¡**查找与查询匹é…的文档 + * **åå‘索引æœåŠ¡**对匹é…结果进行排å并返回最高结果 + * 使用**文档æœåŠ¡**è¿”å›žæ ‡é¢˜å’Œæ‘˜è¦ + +我们将会用一个公开的 [**REST é£Žæ ¼æŽ¥å£**](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#表述性状æ€è½¬ç§»rest): + +```shell +$ curl https://search.com/api/v1/search?query=hello+world +``` + +Response: + +```json +{ + "title": "foo's title", + "snippet": "foo's snippet", + "link": "https://foo.com", +}, +{ + "title": "bar's title", + "snippet": "bar's snippet", + "link": "https://bar.com", +}, +{ + "title": "baz's title", + "snippet": "baz's snippet", + "link": "https://baz.com", +}, +``` + +用于内部通信,我们å¯ä»¥ç”¨ [RPC](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#远程过程调用åè®®rpc)。 + +## 第四æ¥ï¼šæ‰©å±•这个设计 + +> åŸºäºŽç»™å®šçš„çº¦æŸæ¡ä»¶ï¼Œç¡®å®šå¹¶è§£å†³ç“¶é¢ˆé—®é¢˜ã€‚ + + + +**é‡è¦æç¤º: ä¸è¦ç®€å•的从最åˆçš„设计直接跳到最终的设计** + +说明您将è¿ä»£åœ°æ‰§è¡Œè¿™æ ·çš„æ“ä½œï¼š1)**Benchmark/Load 测试**,2)**Profile** 出瓶颈,3)在评估替代方案和æƒè¡¡æ—¶è§£å†³ç“¶é¢ˆï¼Œ4)é‡å¤å‰é¢ï¼Œå¯ä»¥å‚考[在 AWS 上设计一个å¯ä»¥æ”¯æŒç™¾ä¸‡ç”¨æˆ·çš„系统](../scaling_aws/README.md)这个用æ¥è§£å†³å¦‚何è¿ä»£åœ°æ‰©å±•åˆå§‹è®¾è®¡çš„例å。 + +é‡è¦çš„æ˜¯è®¨è®ºåœ¨åˆå§‹è®¾è®¡ä¸å¯èƒ½é‡åˆ°çš„瓶颈,以åŠå¦‚何解决æ¯ä¸ªç“¶é¢ˆã€‚比如,在多个 **Web æœåС噍**ä¸Šæ·»åŠ **负载平衡器**å¯ä»¥è§£å†³å“ªäº›é—®é¢˜ï¼Ÿ**CDN** 解决哪些问题?**主从å¤åˆ¶** 解决哪些问题? 替代方案是什么和怎么对æ¯ä¸€ä¸ªæ›¿ä»£æ–¹æ¡ˆè¿›è¡Œæƒè¡¡æ¯”较? + +我们将介ç»ä¸€äº›ç»„ä»¶æ¥å®Œæˆè®¾è®¡ï¼Œå¹¶è§£å†³å¯ä¼¸ç¼©æ€§é—®é¢˜ã€‚内部的负载平衡器并ä¸èƒ½å‡å°‘æ‚乱。 + +**为了é¿å…é‡å¤çš„讨论**, å‚考以下[系统设计主题](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#系统设计主题的索引)获å–主è¦è®¨è®ºè¦ç‚¹ã€æƒè¡¡å’Œæ›¿ä»£æ–¹æ¡ˆï¼š + +* [DNS](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#域å系统) +* [è´Ÿè½½å‡è¡¡å™¨](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#è´Ÿè½½å‡è¡¡å™¨) +* [水平扩展](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#水平扩展) +* [åå‘代ç†ï¼ˆweb æœåŠ¡å™¨ï¼‰](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#åå‘代ç†web-æœåС噍) +* [应用层](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#应用层) +* [缓å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#缓å˜) +* [NoSQL](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#nosql) +* [一致性模å¼](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#一致性模å¼) +* [å¯ç”¨æ€§æ¨¡å¼](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#å¯ç”¨æ€§æ¨¡å¼) + +有些æœç´¢éžå¸¸å—欢迎,而其他æœç´¢åªæ‰§è¡Œä¸€æ¬¡ã€‚ æµè¡ŒæŸ¥è¯¢å¯ä»¥ä»Žå†…å˜ç¼“å˜**(例如 Redis 或 Memcached)æä¾›ï¼Œä»¥å‡å°‘å“应时间并é¿å…é‡è½½**åå‘索引æœåŠ¡**å’Œ**文档æœåŠ¡**。**内å˜ç¼“å˜**对于处ç†ä¸å‡åŒ€åˆ†å¸ƒçš„æµé‡å’Œæµé‡å³°å€¼ä¹Ÿå¾ˆæœ‰ç”¨ã€‚ 从内å˜é¡ºåºè¯»å– 1 MB å¤§çº¦éœ€è¦ 250 微秒,而从 SSD 读å–éœ€è¦ 4 å€ï¼Œè€Œä»Žç£ç›˜è¯»å–éœ€è¦ 80 å€ã€‚<sup><a href=https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#æ¯ä¸ªç¨‹åºå‘˜éƒ½åº”该知é“的延迟数>1</a></sup> + +以下是对**çˆ¬å–æœåŠ¡**的一些其他优化: + +* 为了è¦å¤„ç†æ•°æ®å¤§å°å’Œè¯·æ±‚负载,**åå‘索引æœåŠ¡**å’Œ**文档æœåŠ¡**å¯èƒ½éœ€è¦å¤§é‡ä½¿ç”¨åˆ†ç‰‡å’Œå¤åˆ¶ +* DNS 查找å¯èƒ½æ˜¯ä¸€ä¸ªç“¶é¢ˆï¼Œ**爬虫æœåŠ¡**å¯ä»¥ä¿ç•™è‡ªå·±å®šæœŸåˆ·æ–°çš„ DNS 查找 +* **爬虫æœåŠ¡**å¯ä»¥é€šè¿‡ä¸€æ¬¡ä¿æŒå¤šä¸ªå¼€æ”¾è¿žæŽ¥æ¥æé«˜æ€§èƒ½å¹¶å‡å°‘内å˜ä½¿ç”¨ï¼Œç§°ä¸º[è¿žæŽ¥æ± ](https://en.wikipedia.org/wiki/Connection_pool) + * 切æ¢åˆ° [UDP](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#ç”¨æˆ·æ•°æ®æŠ¥åè®®udp) 也å¯ä»¥æé«˜æ€§èƒ½ +* ç½‘é¡µçˆ¬å–æ˜¯å¸¦å®½å¯†é›†åž‹çš„ï¼Œç¡®ä¿æœ‰è¶³å¤Ÿçš„带宽æ¥ç»´æŒé«˜åžåé‡ + +## é¢å¤–çš„è¯é¢˜ + +> æ˜¯å¦æ›´æ·±å…¥æŽ¢è®¨é¢å¤–主题,å–决于问题的范围和é¢è¯•剩余的时间。 + +### SQL æ‰©å±•æ¨¡å¼ + +* [读副本](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#主从å¤åˆ¶) +* [è”åˆ](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#è”åˆ) +* [分片](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#分片) +* [éžè§„范化](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#éžè§„范化) +* [SQL调优](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#sql-调优) + +### NoSQL + +* [键值å˜å‚¨](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#é”®-值å˜å‚¨) +* [文档å˜å‚¨](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#文档类型å˜å‚¨) +* [列型å˜å‚¨](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#列型å˜å‚¨) +* [图数æ®åº“](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#图数æ®åº“) +* [sql 还是 nosql](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#sql-还是-nosql) + +### ç¼“å˜ + +* åœ¨å“ªç¼“å˜ + * [客户端缓å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#客户端缓å˜) + * [CDN 缓å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#cdn-缓å˜) + * [Web æœåŠ¡å™¨ç¼“å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#web-æœåŠ¡å™¨ç¼“å˜) + * [æ•°æ®åº“缓å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#æ•°æ®åº“缓å˜) + * [应用缓å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#应用缓å˜) +* 缓å˜ä»€ä¹ˆ + * [æ•°æ®åº“查询级别的缓å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#æ•°æ®åº“查询级别的缓å˜) + * [对象级别的缓å˜](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#对象级别的缓å˜) +* ä½•æ—¶æ›´æ–°ç¼“å˜ + * [ç¼“å˜æ¨¡å¼](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#ç¼“å˜æ¨¡å¼) + * [直写模å¼](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#直写模å¼) + * [回写模å¼](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#回写模å¼) + * [刷新](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#刷新) + +### 异æ¥å’Œå¾®æœåŠ¡ + +* [消æ¯é˜Ÿåˆ—](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#消æ¯é˜Ÿåˆ—) +* [任务队列](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#任务队列) +* [背压](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#背压) +* [å¾®æœåŠ¡](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#å¾®æœåŠ¡) + +### 通信 + +* 讨论æƒè¡¡: + * 跟客户端之间的外部通信 - [HTTP APIs following REST](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#表述性状æ€è½¬ç§»rest) + * 内部通信 - [RPC](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#远程过程调用åè®®rpc) +* [æœåŠ¡å‘现](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#æœåŠ¡å‘现) + +### 安全 + +å‚考[安全](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#安全)。 + +### å»¶è¿Ÿæ•°å— + +è§[æ¯ä¸ªç¨‹åºå‘˜éƒ½åº”该知é“的延迟数](https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md#æ¯ä¸ªç¨‹åºå‘˜éƒ½åº”该知é“的延迟数)。 + +### æŒç»è¿›è¡Œ + +* ç»§ç»å¯¹ç³»ç»Ÿè¿›è¡ŒåŸºå‡†æµ‹è¯•和监控,以在瓶颈出现时解决它们 +* 扩展是一个è¿ä»£çš„过程 -- GitLab