这是我参与「第四届青训营 」笔记创作活动的第9天
1. 响应
面试常问问题之——如果一个人在网页输入www.google.com会发生什么?
www.google.com → DNS
面试的时候可以从sign in, sign out角度讲:这样sign in的时候header会多一个token (authorization_bearer)
通常:新的browser会去DNS寻址,DNS解析域名, 返回ip地址。之后再发get请求,之后返回200 ok和html. 如果有cache了,则不用去寻址了。
HTTP Request 如何传参:
1. URL Regrex: eg: courses/OOD
2. Get Request: ?key=value (重要信息不从url传)
3. body传(通常是post request): 用于传的文件比较大的时候
API key:
google map api为什么要让你设置api key:
通常是看谁在用api,避免过度使用,对使用者进行权限控制(比如看谁在疯狂call,导致服务坏掉:)
Djangle流程:
先去views里查routing table(查api对应哪个function处理它)
读token验证身份,查database,拿到object,序列化返回数据(key-value pair)
2. 单机系统如何处理更多的请求:
1. 前端避免不必要渲染:
- state放在minimal position,而不是更大的component
- 存cache: eg:render时closealert是function的话就有可能一直开变量closealert,通常函数在定义后函数就不会改变了,所以没必要
2. 解决大量图片渲染:
- 渲染小图
- progressive loading
- lazy loading
3. 缓存
- 这样下次client call api,就能直接返回给client,client端自查,就不需要call api了
4. database设计好
- 遵循normal form,避免频繁跨表查询,可以做indexing,这样查起来会比较快
5. 提高硬件(买更好的机器)-> 提高memory
6. 减少对硬盘读写:检查从硬盘读出的数据是否可以放在memory里
7. 写好代码:)
8. 多线程(分开做不同的task)
3. 分布式系统优化
1. 一个机器放database,一个机器前端/后端
2. 两个机器跑相同的代码,用load balancer分配任务
sharding概念:
eg: instance A装了100万数据 0
instance B 装了100万数据 1
这两个instance是会平均分配的
和indexing区别:indexing只是为了提高读query的速度