├── .nojekyll ├── 99~参考资料 ├── ByteByteGo │ ├── ByteByteGo~OS Illustrations.md │ ├── ByteByteGo~CDN Illustrations.md │ ├── ByteByteGo~Kafka Illustrations.md │ ├── ByteByteGo~UX Illustrations.md │ ├── ByteByteGo~Mobile Illustrations.md │ ├── ByteByteGo~DevSecOps Illustrations.md │ ├── ByteByteGo~IP Illustrations.md │ ├── ByteByteGo~RPC Illustrations.md │ ├── ByteByteGo~AWS Illustrations.md │ ├── ByteByteGo~Teamwork Illustrations.md │ ├── ByteByteGo~Performance Illustrations.md │ ├── ByteByteGo~Dev Illustrations.md │ ├── ByteByteGo~API Security Illustrations.md │ ├── ByteByteGo~GraphQL Illustrations.md │ ├── ByteByteGo~Data Structure Illustrations.md │ ├── ByteByteGo~Distributed Lock Illustrations.md │ ├── ByteByteGo~GenAI Illustrations.md │ ├── ByteByteGo~InfoSecurity Illustrations.md │ ├── ByteByteGo~Web Performance Illustrations.md │ ├── ByteByteGo~Distributed Unique ID Illustrations.md │ ├── ByteByteGo~VectorDB Illustrations.md │ ├── ByteByteGo~Web Security Illustrations.md │ ├── ByteByteGo~Webhook Illustrations.md │ ├── ByteByteGo~Infrastructure Illustrations.md │ ├── ByteByteGo~FE Illustrations.md │ ├── ByteByteGo~K8s Illustrations.md │ ├── ByteByteGo~API Gateway Illustrations.md │ ├── ByteByteGo~Concurrency Illustrations.md │ ├── ByteByteGo~DDD Illustrations.md │ ├── ByteByteGo~Data Pipeline Illustrations.md │ ├── ByteByteGo~SearchEngine Illustrations.md │ ├── ByteByteGo~Distributed System Illustrations.md │ ├── ByteByteGo~Server Illustrations.md │ ├── ByteByteGo~Network Illustrations.md │ ├── ByteByteGo~Algorithm Illustrations.md │ ├── ByteByteGo~Git Illustrations.md │ ├── ByteByteGo~Auth Illustrations.md │ ├── ByteByteGo~SQL Illustrations.md │ ├── ByteByteGo~Cloud Native Illustrations.md │ ├── ByteByteGo~Browser Illustrations.md │ ├── ByteByteGo~Diagram Illustrations.md │ ├── ByteByteGo~Test Illustrations.md │ ├── ByteByteGo~Cache Illustrations.md │ ├── ByteByteGo~Message Queue Illustrations.md │ ├── ByteByteGo~Data Storage Illustrations.md │ ├── ByteByteGo~Programming Language Illustrations.md │ ├── ByteByteGo~Dokcer Illustrations.md │ ├── ByteByteGo~MicroService Illustrations.md │ ├── ByteByteGo~DevOps Illustrations.md │ ├── ByteByteGo~IAM Illustrations.md │ ├── ByteByteGo~API Illustrations.md │ ├── ByteByteGo~Linux Illustrations.md │ ├── ByteByteGo~Coding Illustrations.md │ ├── ByteByteGo~Software Architecture Illustrations.md │ ├── ByteByteGo~HTTP Illustrations.md │ └── ByteByteGo~Database Illustrations.md ├── The New Stack │ ├── 2019-CI CD with Kubernetes.md │ ├── 2016-Use Cases For Kubernetes.md │ ├── 2019-Guide To Cloud Native DevOps.md │ ├── 2019-Kubernetes Solutions Directory.md │ ├── 2016-The Docker and Container Ecosystem.md │ ├── 2019-Guide To Serverless Technologies.md │ ├── 2019~Guide To Cloud Native Microservices.md │ ├── 2016-The State Of The Kubernetes Ecosystem.md │ ├── 2019-Kubernetes Deployment And Security Patterns.md │ ├── 2016-Monitoring and Management with Docker and Containers.md │ ├── 2016~Automation and Orchestration with Docker and Containers.md │ ├── 2016-Networking Security and Storage with Docker and Containers.md │ └── 2016~Applications and Microservices with Docker and Containers.md ├── InfoQ │ └── 2017~架构师.md ├── System Design Primer │ ├── 网页爬虫.md │ ├── Mint.md │ ├── 社交网络设计数据结构.md │ ├── 搜索引擎的 KV 存储.md │ ├── AWS 上设计一个百万用户级别的系统.md │ ├── 按类别分类的 Amazon 销售排名.md │ ├── 设计 Pastebin.com (或者 Bit.ly).md │ ├── Twitter 时间线和搜索.md │ └── README.md ├── Awesome Low-level Design │ └── README.md └── README.md ├── 88~实践案例 └── Bluesky │ └── README.md ├── 01~国内大厂 ├── 美团 │ └── README.md ├── 阿里巴巴 │ ├── 2020~SOFAStack.md │ ├── README.md │ └── 淘宝 │ │ └── 99~参考资料 │ │ └── 2012~赵超~淘宝技术发展.md ├── 知乎 │ └── README.md ├── 字节跳动 │ └── README.md ├── 小米 │ └── README.md ├── 微信 │ └── README.md ├── 腾讯 │ └── README.md └── 蚂蚁金服 │ └── README.md ├── 01~海外大厂 ├── Github │ └── 2024~Why GitHub Actually Won.md ├── Google │ ├── 2008~Google Architecture.md │ └── README.md ├── YouTube │ └── 2008~YouTube Architecture.md ├── Netflix │ ├── 2024~Evolution of Java Usage at Netflix.md │ ├── README.md │ └── 2022~Netflix Tech Stack - Databases.md ├── Facebook │ └── 2010~Scale at Facebook.md ├── Twitter │ ├── 2009~Scaling Twitter: Making Twitter 10000 Percent Faster.md │ ├── 2013~The Architecture Twitter Uses to Deal with 150M Active Users.md │ └── 2021~Twitter just open-sourced its recommendation algorithm.md ├── Figma │ └── 2024~Figma’s journey to TypeScript: Compiling away our custom programming language.md ├── Amazon │ ├── AWS │ │ └── 2022~AWS Services Evolution.md │ ├── 2022~Discover Amazon's innovative build system - Brazil..md │ └── 2022~Amazon Prime Video Monitoring Service.md ├── McDonald │ └── 2022~McDonald’s event-driven architecture.md ├── Slack │ └── 2022~What is the journey of a Slack message?.md ├── Shopify │ └── 2022~10 principles for building resilient payment systems (by Shopify).md ├── Uber │ └── 2022~Uber Tech Stack - CI │ │ └── CD.md └── Reddit │ └── ByteByteGo~Reddit’s Core Architecture.md ├── .gitattributes ├── INTRODUCTION.md ├── .gitignore ├── README.md ├── index.html ├── 02~编程大师 ├── Robert C. Martin.md └── Martin Fowler.md ├── header.svg └── LICENSE /.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~OS Illustrations.md: -------------------------------------------------------------------------------- 1 | # OS 2 | -------------------------------------------------------------------------------- /88~实践案例/Bluesky/README.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://substack.com/home/post/p-114113498) 2 | -------------------------------------------------------------------------------- /01~国内大厂/美团/README.md: -------------------------------------------------------------------------------- 1 | - [晓明-美团点评技术团队-常见性能优化策略的总结](http://tech.meituan.com/performance_tunning.html) 2 | -------------------------------------------------------------------------------- /01~国内大厂/阿里巴巴/2020~SOFAStack.md: -------------------------------------------------------------------------------- 1 | # 阿里 2 | 3 | ![中间件技术架构](https://s2.ax1x.com/2019/10/08/uhmjlF.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2019-CI CD with Kubernetes.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /01~国内大厂/阿里巴巴/README.md: -------------------------------------------------------------------------------- 1 | # 阿里巴巴 2 | 3 | - [阿里数据库十年变迁,那些你不知道的二三事](https://developer.aliyun.com/article/665075) 4 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2016-Use Cases For Kubernetes.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2019-Guide To Cloud Native DevOps.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2019-Kubernetes Solutions Directory.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/InfoQ/2017~架构师.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/d8a0b7742e8943 2 | 3 | # 架构师 4 | 5 | # 探索 Service 本源 6 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2016-The Docker and Container Ecosystem.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/f1375f6565554d 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2019-Guide To Serverless Technologies.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2019~Guide To Cloud Native Microservices.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/网页爬虫.md: -------------------------------------------------------------------------------- 1 | # 设计一个网页爬虫 2 | 3 | ![设计一个网页爬虫](https://pic.imgdb.cn/item/605951e68322e6675c000b90.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2016-The State Of The Kubernetes Ecosystem.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /01~海外大厂/Github/2024~Why GitHub Actually Won.md: -------------------------------------------------------------------------------- 1 | # [Why GitHub Actually Won](https://blog.gitbutler.com/why-github-actually-won/) 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2019-Kubernetes Deployment And Security Patterns.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /01~海外大厂/Google/2008~Google Architecture.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://highscalability.com/google-architecture/?ref=blog.pragmaticengineer.com) 2 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/Mint.md: -------------------------------------------------------------------------------- 1 | # 设计 Mint.com 2 | 3 | ![设计 Mint.com](https://pic.imgdb.cn/item/6059522e8322e6675c0040d7.png) 4 | -------------------------------------------------------------------------------- /01~海外大厂/YouTube/2008~YouTube Architecture.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://highscalability.com/youtube-architecture/?ref=blog.pragmaticengineer.com) 2 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/社交网络设计数据结构.md: -------------------------------------------------------------------------------- 1 | # 为一个社交网络设计数据结构 2 | 3 | ![社交网络设计数据结构](https://pic.imgdb.cn/item/6059523f8322e6675c004a4c.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2016-Monitoring and Management with Docker and Containers.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2016~Automation and Orchestration with Docker and Containers.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2016-Networking Security and Storage with Docker and Containers.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/The New Stack/2016~Applications and Microservices with Docker and Containers.md: -------------------------------------------------------------------------------- 1 | > 参考地址:https://ngte.cowtransfer.com/s/60ddf702e3ce4f 2 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/搜索引擎的 KV 存储.md: -------------------------------------------------------------------------------- 1 | # 为搜索引擎设计一个 key-value 储存 2 | 3 | ![搜索引擎 KV 存储](https://pic.imgdb.cn/item/605952598322e6675c0057c1.png) 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.xmind filter=lfs diff=lfs merge=lfs -text 2 | *.zip filter=lfs diff=lfs merge=lfs -text 3 | *.pdf filter=lfs diff=lfs merge=lfs -text 4 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/AWS 上设计一个百万用户级别的系统.md: -------------------------------------------------------------------------------- 1 | # 在 AWS 上设计一个百万用户级别的系统 2 | 3 | ![百万用户级别的系统](https://pic.imgdb.cn/item/605950b68322e6675cff5e81.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/按类别分类的 Amazon 销售排名.md: -------------------------------------------------------------------------------- 1 | # 设计按类别分类的 Amazon 销售排名 2 | 3 | ![Amazon 销售排名](https://pic.imgdb.cn/item/6059526f8322e6675c00699d.png) 4 | -------------------------------------------------------------------------------- /01~海外大厂/Netflix/2024~Evolution of Java Usage at Netflix.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://substack.com/inbox/post/143071215) 2 | 3 | # Evolution of Java Usage at Netflix 4 | -------------------------------------------------------------------------------- /01~海外大厂/Facebook/2010~Scale at Facebook.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://www.infoq.com/presentations/Scale-at-Facebook/?ref=blog.pragmaticengineer.com) 2 | 3 | # Scale at Facebook 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~CDN Illustrations.md: -------------------------------------------------------------------------------- 1 | # CDN 2 | 3 | ![EP115~CDN Best Practices](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/1gDTjceUYprc.webp) 4 | -------------------------------------------------------------------------------- /01~国内大厂/知乎/README.md: -------------------------------------------------------------------------------- 1 | # 知乎 2 | 3 | - [2019~知乎已读服务的前生今世与未来](https://zhuanlan.zhihu.com/p/68383301): 为了避免给用户推荐重复的内容,已读服务会将所有知乎站上用户深入阅读或快速掠过的内容长期保存,并将这些数据应用于首页推荐信息流和个性化推送的已读过滤。 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Kafka Illustrations.md: -------------------------------------------------------------------------------- 1 | # Kafka 2 | 3 | ![EP76~Top 5 Kafka use cases](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/LiCq8k7ylOCZ.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~UX Illustrations.md: -------------------------------------------------------------------------------- 1 | # UX 2 | 3 | ![What makes a good error message?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/nXV0DXJ7nYLU.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/设计 Pastebin.com (或者 Bit.ly).md: -------------------------------------------------------------------------------- 1 | # 设计 Pastebin.com (或者 Bit.ly) 2 | 3 | ![Pastebin.com](https://pic.imgdb.cn/item/605952178322e6675c002ef3.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Mobile Illustrations.md: -------------------------------------------------------------------------------- 1 | # Mobile 2 | 3 | ![How To Release A Mobile App](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/o0n3rI00uift.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/Twitter 时间线和搜索.md: -------------------------------------------------------------------------------- 1 | # 设计 Twitter 时间线和搜索 (或者 Facebook feed 和搜索) 2 | 3 | ![设计 Twitter 时间线和搜索](https://pic.imgdb.cn/item/605951188322e6675cff98f6.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~DevSecOps Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo DevSecOps 2 | 3 | ![What is DevSecOps](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Rt9q5Ap60Afe.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~IP Illustrations.md: -------------------------------------------------------------------------------- 1 | # IP 2 | 3 | ![IPv4 vs. IPv6, what are the differences?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/RjWXA7UtDdRJ.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~RPC Illustrations.md: -------------------------------------------------------------------------------- 1 | # RPC 2 | 3 | ![EP59~How to choose between RPC and RESTful?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/SgVDXXTi8XV0.webp) 4 | -------------------------------------------------------------------------------- /01~国内大厂/字节跳动/README.md: -------------------------------------------------------------------------------- 1 | # 字节跳动 2 | 3 | - [今日头条算法原理](https://mp.weixin.qq.com/s/DC_hJUbTnLhuCwYVOgVlVw): 今日头条委托资深算法架构师曹欢欢博士,公开今日头条的算法原理,以期推动整个行业问诊算法、建言算法;通过让算法透明,来消除各界对算法的误解,并逐步推动整个行业让算法更好的造福社会。 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~AWS Illustrations.md: -------------------------------------------------------------------------------- 1 | # AWS Illustrations 2 | 3 | ![EP132~What makes AWS Lambda so fast?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/CQKpnAXq2SMT.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Teamwork Illustrations.md: -------------------------------------------------------------------------------- 1 | # Teamwork 2 | 3 | ![EP72~Leadership Styles Around The World](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/MuPVWmKpJsc0.webp) 4 | -------------------------------------------------------------------------------- /01~国内大厂/小米/README.md: -------------------------------------------------------------------------------- 1 | # 小米 2 | 3 | - [2019~雷军:创办小米前后我的一些思考](https://mp.weixin.qq.com/s/bTL2GmCjZaDIFYcjI-M8dg): 眨眼间又过去 5 年,小米即将迎来创业第 10 年,回头看看,小米的 10 年之路,一直坚持践行着这些思考。我把这次分享重新增补修订,作为小米创业前十年思路的一个总结。 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Performance Illustrations.md: -------------------------------------------------------------------------------- 1 | # Performance 2 | 3 | ![2024~Top 9 Cases Behind 100% CPU Usage](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/zXPIJksEtN61.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Dev Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo Dev Illustrations 2 | 3 | ![EP120~What do version numbers mean?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/BsDP7cAdeZBo.png) 4 | -------------------------------------------------------------------------------- /01~国内大厂/微信/README.md: -------------------------------------------------------------------------------- 1 | # 微信 2 | 3 | - [2017~ 微信高并发资金交易系统设计方案:百亿红包背后的技术支撑](http://mp.weixin.qq.com/s/suBAJrP6uN2kFgHtGz16mw):本文将为读者介绍百亿级别红包背后的系统高并发设计方案,包括微信红包的两大业务特点、微信红包系统的技术难点、解决高并发问题通常使用的方案,以及微信红包系统的高并发解决方案。 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~API Security Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo API Security 2 | 3 | ![EP84~Top 12 Tips for API Security](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/y0iWE3TAoJTA.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~GraphQL Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo Cache 2 | 3 | ![EP61~How does GraphQL work in the real world?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Td8EGpqvT22x.webp) 4 | -------------------------------------------------------------------------------- /01~国内大厂/腾讯/README.md: -------------------------------------------------------------------------------- 1 | - [2019~腾讯基础设施 20 年演进之路](https://mp.weixin.qq.com/s/hTQJH6ljwO3B_1s8qN4H4A): 腾讯 20 年,业务发展几经变革。今天,在腾讯 Techo 开发者大会上,腾讯云副总裁、云架构平台部总经理谢明博士与我们分享了腾讯过往二十年在基础设施上的总体演进与创新,这是腾讯首次全面披露腾讯 20 年来在基础设施方面的技术积累。 2 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Data Structure Illustrations.md: -------------------------------------------------------------------------------- 1 | # Data Structure 2 | 3 | ![EP55~What are the data structures used in daily life?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/MzpdMbZWL5AP.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Distributed Lock Illustrations.md: -------------------------------------------------------------------------------- 1 | # Distributed Lock 2 | 3 | ![EP132~Why do we need to use a distributed lock?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Syg6akTJWa1F.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~GenAI Illustrations.md: -------------------------------------------------------------------------------- 1 | # GenAI Illustrations 2 | 3 | ![The Ultimate Walkthrough of the Generative AI Landscape](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/bq9QAAHTOeRL.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~InfoSecurity Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo Info Security 2 | 3 | ![EP68~Firewall explained to Kids… and Adults](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/UnnWo0yXuSYV.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Web Performance Illustrations.md: -------------------------------------------------------------------------------- 1 | # Web Performance 2 | 3 | ![EP115~How to load your websites at lightning speed?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/E3CawaHzNojl.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Distributed Unique ID Illustrations.md: -------------------------------------------------------------------------------- 1 | # Unique ID 2 | 3 | ![Explaining 5 unique ID generators in distributed systems](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/03PmWmA5ovgu.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~VectorDB Illustrations.md: -------------------------------------------------------------------------------- 1 | # VectorDB 2 | 3 | ![EP63~Vector databases are so hot right now, but what is a Vector DB?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/g8kRAihGoqK5.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Web Security Illustrations.md: -------------------------------------------------------------------------------- 1 | # Web Security 2 | 3 | ![Everything You Need to Know About Cross-Site Scripting (XSS)](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ut4GzZMXy4gl.png) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Webhook Illustrations.md: -------------------------------------------------------------------------------- 1 | # Web Hook 2 | 3 | ![EP65~The diagram below shows a comparison between polling and webhook.](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/IsZ87iiYeY5f.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Infrastructure Illustrations.md: -------------------------------------------------------------------------------- 1 | # Infrastructure Illustrations 2 | 3 | ![EP129~A CheatSheet on Scaling Infrastructure Provisioning and Management](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/qZPe3gqEynYO.png) 4 | -------------------------------------------------------------------------------- /01~海外大厂/Twitter/2009~Scaling Twitter: Making Twitter 10000 Percent Faster.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster/?ref=blog.pragmaticengineer.com) 2 | 3 | # Scaling Twitter: Making Twitter 10000 Percent Faster 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~FE Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo FE Illustrations 2 | 3 | ![EP118~What distinguishes MVC, MVP, MVVM, MVVM-C, and VIPER architecture patterns from each other?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/JW3T3I3UXiRa.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~K8s Illustrations.md: -------------------------------------------------------------------------------- 1 | # K8s 2 | 3 | ![EP67~Kubernetes Periodic Table](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/zo47vT1xVbd8.webp) 4 | 5 | ![EP78~Kubernetes Tools Ecosystem](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/6LF4wnJIiLlM.webp) 6 | -------------------------------------------------------------------------------- /01~国内大厂/蚂蚁金服/README.md: -------------------------------------------------------------------------------- 1 | # 蚂蚁金服 2 | 3 | - [2018~从“被动挖光缆”到“主动剪网线”,蚂蚁金服异地多活的微服务体系](https://mp.weixin.qq.com/s/opfjmihtEWMT2zVC5lffCg): 蚂蚁金服(当时还是支付宝)从 2013 年起就运行在单元化架构上,除了具备异地容灾能力外,还能做到异地多活,可随时在多城市、多数据中心调配流量。基于单元流量调配机制,可实现大规模集群的蓝绿发布、灰度仿真环境,为充分验证业务正确性、降低故障提供了基础条件。相应地,微服务体系也必须具备单元内收敛、单元间可控路由等能力,来支撑单元化技术架构的落地。 4 | -------------------------------------------------------------------------------- /01~海外大厂/Figma/2024~Figma’s journey to TypeScript: Compiling away our custom programming language.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://www.figma.com/blog/figmas-journey-to-typescript-compiling-away-our-custom-programming-language/) 2 | 3 | # Figma’s journey to TypeScript: Compiling away our custom programming language 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~API Gateway Illustrations.md: -------------------------------------------------------------------------------- 1 | # API Gateway 2 | 3 | ![EP71~What does API gateway do?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/VfoWOFuppOyd.webp) 4 | 5 | ![EP81~Top 3 API Gateway Use Cases](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/P6l2uWKKGWxg.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Concurrency Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo Concurrency 2 | 3 | ![Concurrency is NOT parallelism](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/wihji5OfZ5fj.webp) 4 | 5 | ![What is a deadlock?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/plzBoUIo7Z8x.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~DDD Illustrations.md: -------------------------------------------------------------------------------- 1 | # DDD Illustrations 2 | 3 | ![2024~A Crash Course on Domain-Driven Design](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/omr9142Sr6gO.png) 4 | 5 | ![EP132~8 Key Concepts in DDD](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/dzLrcgCpWhgd.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Data Pipeline Illustrations.md: -------------------------------------------------------------------------------- 1 | # Stream Processing 2 | 3 | ![EP54~Batch v.s. Stream Processing](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/S8O0Dif9xAqQ.webp) 4 | 5 | ![EP86~Data Pipelines Overview](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/SF1ZLnfAgox2.webp) 6 | -------------------------------------------------------------------------------- /INTRODUCTION.md: -------------------------------------------------------------------------------- 1 | # 本篇导读 2 | 3 | 当然,AwesomeList 包含了笔者正在使用的,或者关注到的技术,自然无法做到没有遗漏,也是仅代表笔者的个人看法。此外为了便于知识归纳,AwesomeList 在 [Specials](./Specials) 目录中准备了多个专题的集锦,它们包括: 4 | 5 | - [Awesome CS Collections](./Specials/Awesome-CS-Collections.md) 6 | - [Build Your Own X From Scratch](./Specials/Build-Your-Own-X-From-Scratch.md) 7 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~SearchEngine Illustrations.md: -------------------------------------------------------------------------------- 1 | # ElasticSearch 2 | 3 | ![2024~Top 6 ElasticSearch Use Cases](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/KLnwVFjy2MlS.png) 4 | 5 | ![EP129~How Do Search Engines Really Work?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/qfGCR1zDKOtR.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Distributed System Illustrations.md: -------------------------------------------------------------------------------- 1 | # Distributed System 2 | 3 | ![Top 6 Cases to Apply Idempotency](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/CX9UtvmwgUXE.png) 4 | 5 | ![EP120~A Crash Course on Distributed Systems](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Vt4OiqmZ8k3Z.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Server Illustrations.md: -------------------------------------------------------------------------------- 1 | # Server 2 | 3 | ![EP69~Top 6 most commonly used Server Types](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/LmWx5ZUFjwYC.webp) 4 | 5 | ![EP115~10 Essential Components of a Production Web Application](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/lhQu00PBk0FT.webp) 6 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Network Illustrations.md: -------------------------------------------------------------------------------- 1 | # Network 2 | 3 | ![EP76~How is data transmitted between applications?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/tJHlogmsKYn2.webp) 4 | 5 | ![EP80~Explaining 8 Popular Network Protocols in 1 Diagram](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/MepntbfdOaFo.png) 6 | -------------------------------------------------------------------------------- /01~海外大厂/Twitter/2013~The Architecture Twitter Uses to Deal with 150M Active Users.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://highscalability.com/the-architecture-twitter-uses-to-deal-with-150m-active-users/?ref=blog.pragmaticengineer.com) 2 | 3 | # The Architecture Twitter Uses to Deal with 150M Active Users, 300K QPS, a 22 MB/S Firehose, and Send Tweets in Under 5 Seconds 4 | -------------------------------------------------------------------------------- /01~海外大厂/Netflix/README.md: -------------------------------------------------------------------------------- 1 | # Netflix List 2 | 3 | - [LinkedIn 架构这十年](http://colobu.com/2015/07/24/brief-history-scaling-linkedin/) 4 | 5 | - https://dev.to/karanpratapsingh/system-design-netflix-3d9g 6 | 7 | - [2020~全面解析 Netflix 的微服务架构设计](https://mp.weixin.qq.com/s/6BDCuZU_GDIvdLtLR9HzKg): 本文描绘了 Netflix 流媒体服务的整体云架构图景,并从可用性、延迟、可扩展性和对网络系统或系统中断的适应性方面分析了系统的设计。 8 | -------------------------------------------------------------------------------- /01~海外大厂/Twitter/2021~Twitter just open-sourced its recommendation algorithm.md: -------------------------------------------------------------------------------- 1 | ![Twitter just open-sourced its recommendation algorithm.](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/YQduTn09Zy9L.webp) 2 | 3 | ![EP55~How does Twitter recommend “For You” Timeline in 1.5 seconds?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/NAcMiUKIsgZF.webp) 4 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Algorithm Illustrations.md: -------------------------------------------------------------------------------- 1 | # Algorithm Illustrations 2 | 3 | ![EP60~The 10 Algorithms That Dominate Our World](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/pSnHWRivuJf0.webp) 4 | 5 | ![EP132~Big O Notation 101: The Secret to Writing Efficient Algorithms](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/zEGykGdG7U04.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Git Illustrations.md: -------------------------------------------------------------------------------- 1 | # Git 2 | 3 | ![EP64~What branching strategies does your team use?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Qox6Oo7Rshc9.webp) 4 | 5 | ![EP74~How does Git Work?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/97KzVFpK0LZb.webp) 6 | 7 | ![EP84~Git Vs Github](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/P9lxaUUaSxy0.webp) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Auth Illustrations.md: -------------------------------------------------------------------------------- 1 | # OAuth 2 | 3 | ![EP72~Oauth 2.0 Explained With Simple Terms](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/NqOuRcqzGNDQ.webp) 4 | 5 | ![EP75~OAuth 2.0 Flows](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/LYZmDKz5OXAF.webp) 6 | 7 | ![EP132~Top 4 Forms of Authentication Mechanisms](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/jNiKL8vNdtHb.png) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~SQL Illustrations.md: -------------------------------------------------------------------------------- 1 | # SQL 2 | 3 | ![EP50~Visualizing a SQL query](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/nvbGPAWoYY1h.webp) 4 | 5 | ![EP53~What is the best way to learn SQL?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/S28Yk7wNudAp.webp) 6 | 7 | ![EP129~Cheatsheet on Relational Database Design](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/2Wlvva68Cmy3.png) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Cloud Native Illustrations.md: -------------------------------------------------------------------------------- 1 | # Cloud Native 2 | 3 | ![EP71~Cloud Native Anti Patterns](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/3sDFkTFRwiyA.webp) 4 | 5 | ![EP74~IaaS, PaaS, Cloud Native… How do we get here?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/skjiipIl7OiD.webp) 6 | 7 | ![EP78~Cloud Native Landscape](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/vNwmHpqGCSf6.webp) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Browser Illustrations.md: -------------------------------------------------------------------------------- 1 | # Browser Illustrations 2 | 3 | ![EP73~How does Chrome work?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/nHRR2nVWGrVq.webp) 4 | 5 | ![EP81~What happens when you type a URL into a browser?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/BhLcrnMEy0E7.png) 6 | 7 | ![EP118~What happens when you type a URL into your browser?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/UyzYwprAyCR8.webp) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Diagram Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo Diagram 2 | 3 | ![Top 6 Tools to Turn Code into Beautiful Diagrams](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/wEXtWwcCdNqt.webp) 4 | 5 | ![EP127~Top 6 Tools to Turn Code into Beautiful Diagrams](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/u0DGC2k4BHDj.png) 6 | 7 | ![EP127~A Cheatsheet for UML Class Diagrams](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/mGPBHdEnbWnu.png) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Test Illustrations.md: -------------------------------------------------------------------------------- 1 | # Test 2 | 3 | ![EP68~Paradigm Shift: How Developer to Tester Ratio Changed From 1:1 to 100:1](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ETBemEJzeQsL.webp) 4 | 5 | ![EP82~Best ways to test system functionality](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/PhcmSfGHQ581.webp) 6 | 7 | ![EP83~Explaining 9 types of API testing](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/zLaWAL5edyuE.webp) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Cache Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo Cache 2 | 3 | ![EP77~One picture is worth a thousand words - Top 5 Caching Strategies](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/BhIyOWDpK6gs.webp) 4 | 5 | ![Top 8 Cache Eviction Strategies](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Gx2hyf2aDlS9.webp) 6 | 7 | ![EP132~How Uber Served 40 Million Reads with Integrated Redis Cache?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/xjzEmvJxmoLE.png) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Message Queue Illustrations.md: -------------------------------------------------------------------------------- 1 | # Message Queue 2 | 3 | ![EP55~Why do we need message brokers?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/H7m53uYy1Xyy.webp) 4 | 5 | ![EP77~How many message queues do you know?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/0xqhAqGy0oo0.webp) 6 | 7 | ![EP80~IBM MQ -> RabbitMQ -> Kafka ->Pulsar: How do message queue architectures evolve?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/FKD9jGyiITfu.png) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Data Storage Illustrations.md: -------------------------------------------------------------------------------- 1 | # Data Storage 2 | 3 | ![EP64~Data is used everywhere, but do you know all the commonly used data terms?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/2mVCnj6mgvZx.webp) 4 | 5 | ![EP66~What are the differences between a data warehouse and a data lake?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/2C1h1qHuvE3i.webp) 6 | 7 | ![EP83~Explain the Top 6 Use Cases of Object Stores](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/jXvGFGUOL4Cm.webp) 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Programming Language Illustrations.md: -------------------------------------------------------------------------------- 1 | # Coding 2 | 3 | ![EP50~How do programming languages evolve over the past 70 years?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/f3v6rajaaVIo.webp) 4 | 5 | ![EP76~How Do C++, Java, Python Work?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/xGzykv2b7y7B.png) 6 | 7 | ![EP81~Writing Code that Runs on All Platforms](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/tYUBjVwDMJOJ.webp) 8 | 9 | ![EP86~Imperative Vs Functional Vs Object-oriented Programming](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/BesvDWIQDTLn.webp) 10 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Dokcer Illustrations.md: -------------------------------------------------------------------------------- 1 | # Docker 2 | 3 | ![EP57~A comparison of Docker-based and non-Docker-based development is shown below.](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/CBysqRKFc1lU.webp) 4 | 5 | ![EP69~How does Docker work?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/LQQim5wE3Z8D.webp) 6 | 7 | ![EP81~Docker 101: Streamlining App Deployment](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/7Zhpr5yFbTS9.webp) 8 | 9 | ![Bare Metal VS VM VS Containerized](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/72Tt0P9c8PBK.webp) 10 | 11 | ![EP116~Top 8 must-know Docker concepts](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Yo8uKgMqpsEd.webp) 12 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~MicroService Illustrations.md: -------------------------------------------------------------------------------- 1 | # MicroService 2 | 3 | ![EP67~9 best practices for developing microservices](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/p4ewzscjA7At.webp) 4 | 5 | ![EP82~Microservice Architecture](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/XPuvDDlHOC6e.webp) 6 | 7 | ![EP116~What does a typical microservice architecture look like? 👇](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ZXrE8UaJUa3B.webp) 8 | 9 | ![EP117~A Crash Course on Microservice Communication Patterns](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/HARGPUFTVxSM.webp) 10 | 11 | ![EP129~A CheatSheet on Saga Pattern](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/N7jImjnw8uXh.png) 12 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~DevOps Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo DevOps 2 | 3 | ![EP52~DevOps vs. SRE vs. Platform Engineering. What is the difference?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/3k2P4GkiKjkX.webp) 4 | 5 | ![EP65~What tools does your team use to ship code to production and ensure code quality?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/2pv1pGdo2umb.webp) 6 | 7 | ![EP71~CI/CD Pipeline Explained in Simple Terms](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Id0xu41GMpfs.webp) 8 | 9 | ![EP85~Log Parsing Cheat Sheet](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/dRUekpdXy2vc.webp) 10 | 11 | ![EP117~Log Parsing Cheat Sheet](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/JaF5lHRwCsiK.webp) 12 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~IAM Illustrations.md: -------------------------------------------------------------------------------- 1 | # IAM 2 | 3 | ![What’s the difference between Session-based authentication and JWTs?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/KWq3yldLom7e.png) 4 | 5 | ![EP69~Explaining JSON Web Token (JWT) to a 10 year old Kid](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/eeC7rLAUxjPi.webp) 6 | 7 | ![EP72~Top 4 Forms of Authentication Mechanisms](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/IxjT7STnuImn.webp) 8 | 9 | ![EP75~How does a Password Manager such as 1Password or Lastpass work?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/we85FchMq1S2.webp) 10 | 11 | ![EP86~Single Sign-On (SSO) explained in simple terms](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/sjYLtFvAv8VF.webp) 12 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~API Illustrations.md: -------------------------------------------------------------------------------- 1 | # API 2 | 3 | ![EP53~How do we design effective and safe APIs?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/T10fqn13GEZz.webp) 4 | 5 | ![EP56~How many API architecture styles do you know?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/wtmIxWrsxRqy.webp) 6 | 7 | ![EP64~How to improve API performance](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/o88esaoplOHc.webp) 8 | 9 | ![Top 9 Most Popular API Protocols](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/EFuorBQsYmHD.png) 10 | 11 | ![EP83~API Vs SDK!](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ih8MCxR7xntX.webp) 12 | 13 | ![EP118~How do we Perform Pagination in API Design?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/77Pj9fBjD98K.webp) 14 | -------------------------------------------------------------------------------- /01~海外大厂/Google/README.md: -------------------------------------------------------------------------------- 1 | # Google 2 | 3 | - [2017~老司机独家揭秘 Google 的软件工程实践](https://parg.co/SBP): 老司机 Fergus Henderson 已在 Google 工作了 10 年以上,拥有超过 15 年的商业类软件的行业经验。本文梳理并总结了 Google 软件开发中的关键工程实践,并揭示了其成功之道,值得业界各路人马参考借鉴。 4 | 5 | - [xg2xg ![code](https://ng-tech.icu/assets/code.svg)](https://github.com/jhuangtw-dev/xg2xg): by ex-googlers, for ex-googlers - a lookup table of similar tech & services 6 | 7 | - [2019~Google Engineering Practices Documentation](https://github.com/google/eng-practices): Google has many generalized engineering practices that cover all languages and all projects. These documents represent our collective experience of various best practices that we have developed over time. It is possible that open source projects or other organizations would benefit from this knowledge, so we work to make it available publicly when possible. 8 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Linux Illustrations.md: -------------------------------------------------------------------------------- 1 | # Linux 2 | 3 | ![EP50~The Linux Storage Stack Diagram shows the layout of the Linux storage stack.](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/bzA6KJdOJ0F2.webp) 4 | 5 | ![EP55~what happens when you type “ssh hostname”?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/NEWYKdAulgEl.webp) 6 | 7 | ![EP58~18 Most-used Linux Commands You Should Know](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/0sil49S0v0j4.webp) 8 | 9 | ![EP63~Linux file system explained](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/03VXShdmfsOT.webp) 10 | 11 | ![EP69~Learning Linux system](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/0AB9fGkq8MFf.webp) 12 | 13 | ![EP70~How do processes talk to each other on Linux?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/4tP8DApWIraY.webp) 14 | -------------------------------------------------------------------------------- /99~参考资料/Awesome Low-level Design/README.md: -------------------------------------------------------------------------------- 1 | # Awesome Low-level Design 2 | 3 | 这个仓库 [awesome-low-level-design](https://github.com/ashishps1/awesome-low-level-design) 是一个非常全面的低级设计(LLD)和面向对象设计(OOD)学习资源集合。它主要包含以下内容: 4 | 5 | 1. 基础概念: 6 | 7 | - 面向对象编程的基本概念 8 | - SOLID 原则(配有图片和代码示例) 9 | - DRY、YAGNI、KISS 等设计原则 10 | 11 | 2. 设计模式: 12 | 13 | - 创建型模式:单例、工厂方法、抽象工厂、建造者、原型 14 | - 结构型模式:适配器、外观、装饰器、组合 15 | - 行为型模式:策略、迭代器、观察者、模板方法、命令、状态 16 | 17 | 3. UML 图: 18 | 19 | - 类图、用例图、序列图、活动图、状态机图 20 | 21 | 4. 低级设计面试问题: 22 | 23 | - 分为简单、中等和困难三个级别 24 | - 包括停车场、自动售货机、Stack Overflow、日志框架等多个实际系统的设计 25 | 26 | 5. 书籍推荐: 27 | 28 | - 《Head First 设计模式》 29 | - 《Clean Code》 30 | - 《重构:改善既有代码的设计》 31 | 32 | 6. 其他资源: 33 | - Coursera 上的设计模式课程 34 | - GitHub 上的其他优秀设计模式资源 35 | 36 | 这个仓库不仅提供了理论知识,还包含了大量实际的设计问题,非常适合准备技术面试或想深入学习软件设计的开发者。它的内容涵盖了从基础概念到复杂系统设计的各个方面,是一个全面的低级设计学习指南。 37 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Coding Illustrations.md: -------------------------------------------------------------------------------- 1 | # Coding 2 | 3 | ![EP62~Do you believe that Google, Meta, Uber, and Airbnb put almost all of their code in one repository?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ug5Xky7NUl4P.webp) 4 | 5 | ![EP67~The Code Review Pyramid](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/xEMrXy1cWS7Q.webp) 6 | 7 | ![EP75~Types of Software Engineers and Their Typically Required Skills](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/em3RGcz3VeKQ.webp) 8 | 9 | ![10 Coding Principles Explained in 5 Minutes](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/sr5sBlwEPnvL.png) 10 | 11 | ![How do we retry on failures?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/wHIrFv2hc2Yl.webp) 12 | 13 | ![EP116~11 steps to go from Junior to Senior Developer](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/LiyE8epxPHdA.webp) 14 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Software Architecture Illustrations.md: -------------------------------------------------------------------------------- 1 | # ByteByteGo Software Architecture Illustrations 2 | 3 | ![EP54~Top 10 Architecture Characteristics / Non-Functional Requirements with Cheatsheet](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ANFRGQ5IxaUj.webp) 4 | 5 | ![EP56~System Design Blueprint: The Ultimate Guide](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/qPXa6KulTYpR.webp) 6 | 7 | ![EP68~Top architectural styles](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ey20zpyNlcwS.webp) 8 | 9 | ![EP86~CAP, BASE, SOLID, KISS, What do these acronyms mean?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/t1tBpIF9FGhf.webp) 10 | 11 | ![2023~The Fantastic Four of System Design](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/rWCZOpnMIE6g.webp) 12 | 13 | ![EP128~The Ultimate Software Architect Knowledge Map](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/YKHX8KkPBcGZ.png) 14 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~HTTP Illustrations.md: -------------------------------------------------------------------------------- 1 | # HTTP 2 | 3 | ![EP52~Which HTTP status codes are most common?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Hd7fbEW1R0Ny.webp) 4 | 5 | ![EP52~Do you know all the components of a URL?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ZiKDWX5XNfdm.webp) 6 | 7 | ![EP62~Important Things About HTTP Headers You May Not Know!](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/3Ojl39bvWMEe.webp) 8 | 9 | ![HTTP1 vs HTTP2 vs HTTP3](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/Ig2hnivIiXv8.png) 10 | 11 | ![EP66~URL, URI, URN - Do you know the differences?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/a452iN1OoDWm.webp) 12 | 13 | ![EP73~HTTPS, SSL Handshake, and Data Encryption Explained to Kids](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/8Fs0OMWZQnRa.webp) 14 | 15 | ![EP85~Top 9 HTTP Request Methods](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/OQf40s0QQHcy.webp) 16 | 17 | ![EP117~What makes HTTP2 faster than HTTP1?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/jFciJhgLahB4.webp) 18 | -------------------------------------------------------------------------------- /01~海外大厂/Amazon/AWS/2022~AWS Services Evolution.md: -------------------------------------------------------------------------------- 1 | # AWS Services Evolution 2 | 3 | How did AWS grow from just a few services in 2006 to over 200 fully-featured services? Let's take a look. 4 | 5 | Since 2006, it has become a cloud computing leader, offering foundational infrastructure, platforms, and advanced capabilities like serverless computing and AI. 6 | 7 | This expansion empowered innovation, allowing complex applications without extensive hardware management. AWS also explored edge and quantum computing, staying at tech's forefront. 8 | 9 | This evolution mirrors cloud computing's shift from niche to essential, benefiting global businesses with efficiency and scalability. 10 | 11 | Happy to present the curated list of AWS services introduced over the years below. 12 | 13 | ![img](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbb384f75-2fbb-4c5b-9d5e-b97557d02f33_1572x1894.png) 14 | 15 | Note: 16 | 17 | - The announcement or preview year differs from the public release year for certain services. In these cases, we've noted the service under the release year 18 | - Unreleased services noted in announcement years 19 | 20 | Over to you: Are you excited about all the new services, or do you find it overwhelming? 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore all 2 | * 3 | 4 | # Unignore all with extensions 5 | !*.* 6 | 7 | # Unignore all dirs 8 | !*/ 9 | 10 | .DS_Store 11 | 12 | # Logs 13 | logs 14 | *.log 15 | npm-debug.log* 16 | yarn-debug.log* 17 | yarn-error.log* 18 | 19 | # Runtime data 20 | pids 21 | *.pid 22 | *.seed 23 | *.pid.lock 24 | 25 | # Directory for instrumented libs generated by jscoverage/JSCover 26 | lib-cov 27 | 28 | # Coverage directory used by tools like istanbul 29 | coverage 30 | 31 | # nyc test coverage 32 | .nyc_output 33 | 34 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 35 | .grunt 36 | 37 | # Bower dependency directory (https://bower.io/) 38 | bower_components 39 | 40 | # node-waf configuration 41 | .lock-wscript 42 | 43 | # Compiled binary addons (https://nodejs.org/api/addons.html) 44 | build/Release 45 | 46 | # Dependency directories 47 | node_modules/ 48 | jspm_packages/ 49 | 50 | # TypeScript v1 declaration files 51 | typings/ 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional REPL history 60 | .node_repl_history 61 | 62 | # Output of 'npm pack' 63 | *.tgz 64 | 65 | # Yarn Integrity file 66 | .yarn-integrity 67 | 68 | # dotenv environment variables file 69 | .env 70 | 71 | # next.js build output 72 | .next 73 | -------------------------------------------------------------------------------- /01~海外大厂/McDonald/2022~McDonald’s event-driven architecture.md: -------------------------------------------------------------------------------- 1 | # McDonald’s event-driven architecture 2 | 3 | Think you know everything about McDonald's? What about its event-driven architecture? 4 | 5 | ![img](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3d67dc29-8e53-4a5f-b5ea-090f610db1f5_1400x1826.png) 6 | 7 | McDonald's standardizes events using the following components: 8 | 9 | - An event registry to define a standardized schema. 10 | - Custom software development kits (SDKs) to process events and handle errors. 11 | - An event gateway that performs identity authentication and authorization. 12 | - Utilities and tools to fix events, keep the cluster healthy, and perform administrative tasks. 13 | 14 | To scale event processing, McDonald uses a regional architecture that provides global availability based on AWS. Within a region, producers shard events by domains, and each domain is processed by an MSK cluster. The cluster auto-scales based on MSK metrics (e.g., CPU usage), and the auto-scale workflow is based on step-functions and re-assignment tasks. 15 | 16 | Reference: Behind the scenes: [McDonald’s event-driven architecture](https://medium.com/mcdonalds-technical-blog/behind-the-scenes-mcdonalds-event-driven-architecture-51a6542c0d86) 17 | -------------------------------------------------------------------------------- /99~参考资料/ByteByteGo/ByteByteGo~Database Illustrations.md: -------------------------------------------------------------------------------- 1 | # Database 2 | 3 | ![EP54~What is Serverless DB](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/5ueQD5c1crAr.webp) 4 | 5 | ![EP58~Database Selection Process](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/KWJlpZwKLPH6.webp) 6 | 7 | ![EP62~A handy Cheatsheet for SQL and NoSQL databases](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/NHx5TJ7dkDWq.webp) 8 | 9 | ![EP75~Understanding Database Types](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/exnxgIvhx2Xw.webp) 10 | 11 | ![EP78~Key Concepts to Understand Database Sharding](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/M51kIGe0z77i.webp) 12 | 13 | ![EP80~What is a database? What are some common types of databases?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/ObH64te2WEE7.webp) 14 | 15 | ![EP114~7 must-know strategies to scale your database](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/RNiKFSQke1Ig.webp) 16 | 17 | ![EP116~Top 10 Most Popular Open-Source Databases](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/huphoXC8hOMJ.webp) 18 | 19 | ![EP118~What are the differences among database locks?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/AyWHD27dK9jV.webp) 20 | 21 | ![EP118~A Crash Course in Database Sharding](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/32jJcn3R20px.webp) 22 | 23 | ![EP128~Is PostgreSQL eating the database world?](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/LYxWsTrDXaEA.png) 24 | -------------------------------------------------------------------------------- /01~海外大厂/Slack/2022~What is the journey of a Slack message?.md: -------------------------------------------------------------------------------- 1 | # What is the journey of a Slack message? 2 | 3 | In a recent technical article, Slack explains how its real-time messaging framework works. Here is my short summary: 4 | 5 | ![graphical user interface, diagram, application, Teams](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0c5a4-8d3a-4cac-8c39-6a5407d51952_1528x1536.jpeg) 6 | 7 | - Because there are too many channels, the Channel Server (CS) uses consistent hashing to allocate millions of channels to many channel servers. 8 | - Slack messages are delivered through WebApp and Admin Server to the correct Channel Server. 9 | - Through Gate Server and Envoy (a proxy), the Channel Server will push messages to message receivers. 10 | - Message receivers use WebSocket, which is a bi-directional messaging mechanism, so they are able to receive updates in real-time. 11 | 12 | A Slack message travels through five important servers: 13 | 14 | - WebApp: define the API that a Slack client could use 15 | - Admin Server (AS): find the correct Channel Server using channel ID 16 | - Channel Server (CS): maintain the history of message channel 17 | - Gateway Server (GS): deployed in each geographic region. Maintain WebSocket channel subscription 18 | - Envoy: service proxy for cloud-native applications 19 | 20 | Over to you: The Channel Servers could go down. Since they use consistent hashing, how might they recover? 21 | -------------------------------------------------------------------------------- /01~海外大厂/Netflix/2022~Netflix Tech Stack - Databases.md: -------------------------------------------------------------------------------- 1 | # Netflix Tech Stack - Databases 2 | 3 | The Netflix Engineering team selects a variety of databases to empower streaming at scale. 4 | 5 | ![diagram](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F047fe27b-162e-4633-b1cc-44a46ec3074c_1945x1536.jpeg) 6 | 7 | Relational databases: Netflix chooses MySql for billing transactions, subscriptions, taxes, and revenue. They also use CockroachDB to support a multi-region active-active architecture, global transactions, and data pipeline workflows. 8 | 9 | Columnar databases: Netflix primarily uses them for analytics purposes. They utilize Redshift and Druid for structured data storage, Spark and data pipeline processing, and Tableau for data visualization. 10 | 11 | Key-value databases: Netflix mainly uses EVCache built on top of Memcached. EVCache has been with Netflix for over 10 years and is used for most services, caching various data such as the Netflix Homepage and Personal Recommendations. 12 | 13 | Wide-column databases: Cassandra is usually the default choice at Netflix. They use it for almost everything, including Video/Actor information, User Data, Device information, and Viewing History. 14 | 15 | Time-series databases: Netflix built an open-source in-memory database called Atlas for metrics storage and aggregation. 16 | 17 | Unstructured data: S3 is the default choice and stores almost everything related to Image/Video/Metrics/Log files. Apache Iceberg is also used with S3 for big data storage. 18 | 19 | If you work for a large company and wish to discuss your company's technology stack, feel free to get in touch with me. By default, all communications will be treated as anonymous. 20 | -------------------------------------------------------------------------------- /01~海外大厂/Shopify/2022~10 principles for building resilient payment systems (by Shopify).md: -------------------------------------------------------------------------------- 1 | # 10 principles for building resilient payment systems (by Shopify) 2 | 3 | Shopify has some precious tips for building resilient payment systems. 4 | 5 | ![img](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F685c9f68-b1b9-46e1-8299-b0d409567342_1280x885.jpeg) 6 | 7 | 1. Lower the timeouts, and let the service fail early 8 | The default timeout is 60 seconds. Based on Shopify’s experiences, read timeout of 5 seconds and write timeout of 1 second are decent setups. 9 | 2. Install circuit breaks 10 | Shopify developed Semian to protect Net::HTTP, MySQL, Redis, and gRPC services with a circuit breaker in Ruby. 11 | 3. Capacity management 12 | If we have 50 requests arrive in our queue and it takes an average of 100 milliseconds to process a request, our throughput is 500 requests per second. 13 | 4. Add monitoring and alerting 14 | Google’s site reliability engineering (SRE) book lists four golden signals a user-facing system should be monitored for: latency, traffic, errors, and saturation. 15 | 5. Implement structured logging 16 | We store logs in a centralized place and make them easily searchable. 17 | 6. Use idempotency keys 18 | Use the Universally Unique Lexicographically Sortable Identifier (ULID) for these idempotency keys instead of a random version 4 UUID. 19 | 7. Be consistent with reconciliation 20 | Store the reconciliation breaks with Shopify’s financial partners in the database. 21 | 8. Incorporate load testing 22 | Shopify regularly simulates the large volume flash sales to get the benchmark results. 23 | 9. Get on top of incident management 24 | Each incident channel has 3 roles: Incident Manager on Call (IMOC), Support Response Manager (SRM), and service owners. 25 | 10. Organize incident retrospectives 26 | For each incident, 3 questions are asked at Shopify: What exactly happened? What incorrect assumptions did we hold about our systems? What we can do to prevent this from happening? 27 | -------------------------------------------------------------------------------- /01~海外大厂/Uber/2022~Uber Tech Stack - CI/CD.md: -------------------------------------------------------------------------------- 1 | # Uber Tech Stack - CI/CD 2 | 3 | Uber is one of the most innovative companies in the engineering field. Let’s take a look at their CI/CD tech stacks. 4 | 5 | ![img](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e3961a1-73b5-48a7-be54-e983ad5570e2_1280x1129.png) 6 | 7 | Note: This post is based on research on Uber engineering blogs. If you spot any inaccuracies, please let us know. 8 | 9 | Project planning: JIRA 10 | 11 | Backend services: Spring Boot to develop their backend services. And to make things even faster, they've created a nifty configuration system called Flipr that allows for speedy configuration releases. 12 | 13 | Code issues: They developed NullAway to tackle NullPointer problems and NEAL to lint the code. Plus, they built Piranha to clean out-dated feature flags. 14 | 15 | Repository: They believe in Monorepo. It uses Bazel on a large scale. 16 | 17 | Testing: They use SLATE to manage short-lived testing environments and rely on Shadower for load testing by replaying production traffic. They even developed Ballast to ensure a smooth user experience. 18 | 19 | Experiment platform: it is based on deep learning and they've generously open-sourced parts of it, like Pyro. 20 | 21 | Build: Uber packages their services into containers using uBuild. It's their go-to tool, powered by Buildkite, for all the packaging tasks. 22 | 23 | Deploying applications: Netflix Spinnaker. It's their trusted tool for getting things into production smoothly and efficiently. 24 | 25 | Monitoring: Uber built their own monitoring systems. They use the uMetric platform, built on Cassandra, to keep things consistent. 26 | 27 | Special tooling: Uber relies on Peloton for capacity planning, scheduling, and operations. Crane builds a multi-cloud infrastructure to optimize costs. And with uAct and the OnCall dashboard, they've got event tracing and on-call duty management covered. 28 | 29 | Have you ever used any of Uber's tech stack for CI/CD? What are your thoughts on their CI/CD setup? 30 | -------------------------------------------------------------------------------- /01~海外大厂/Amazon/2022~Discover Amazon's innovative build system - Brazil..md: -------------------------------------------------------------------------------- 1 | # Discover Amazon's innovative build system - Brazil. 2 | 3 | Amazon's ownership model requires each team to manage its own repositories, which allows for more rapid innovation. Amazon has created a unique build system, known as Brazil, to enhance productivity and empower Amazon’s micro-repo driven collaboration. This system is certainly worth examining! 4 | 5 | ![img](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a85023b-cd94-4bc0-a107-e34382a6868b_3182x4631.jpeg) 6 | 7 | With Brazil, developers can focus on developing the code and creating a simple-to-understand build configuration file. The build system will then process the output artifact repeatedly and consistently. The build config minimizes the build requirement, including language, versioning, dependencies, major versions, and lastly, how to resolve version conflicts. 8 | 9 | For local builds, the Brazil build tool interprets the build configuration as a Directed Acyclic Graph (DAG), retrieves packages from the myservice’s private space (VersionSet) called myservice-cpp-version-set, generates the language-specific build configuration, and employs the specific build tool to produce the output artifact. 10 | 11 | A version set is a collection of package versions that offers a private space for the package and its dependencies. When a new package dependency is introduced, it must also be merged into this private space. There is a default version set called "live," which serves as a public space where anyone can publish any version. 12 | 13 | Remotely, the package builder service provides an intuitive experience by selecting a version set and building targets. This service supports Amazon Linux on x86, x64, and ARM. Builds can be initiated manually or automatically upon a new commit to the master branch. The package builder guarantees build consistency and reproducibility, with each build process being snapshotted and the output artifact versioned. 14 | 15 | Over to you - which type of build system did you use? 16 | -------------------------------------------------------------------------------- /01~海外大厂/Reddit/ByteByteGo~Reddit’s Core Architecture.md: -------------------------------------------------------------------------------- 1 | # Reddit’s Core Architecture 2 | 3 | This information is based on research from many Reddit engineering blogs. But since architecture is ever-evolving, things might have changed in some aspects. 4 | 5 | ![Reddit’s Core Architecture](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/uPic/qcAsqIzVPGzN.png) 6 | 7 | The main points of Reddit’s architecture are as follows: 8 | 9 | 1. Reddit uses a Content Delivery Network (CDN) from Fastly as a front for the application 10 | 2. Reddit started using jQuery in early 2009. Later on, they started using Typescript and have now moved to modern Node.js frameworks. Over the years, Reddit has also built mobile apps for Android and iOS. 11 | 3. Within the application stack, the load balancer sits in front and routes incoming requests to the appropriate services. 12 | 4. Reddit started as a Python-based monolithic application but has since started moving to microservices built using Go. 13 | 5. Reddit heavily uses GraphQL for its API layer. In early 2021, they started moving to GraphQL Federation, which is a way to combine multiple smaller GraphQL APIs known as Domain Graph Services (DGS). In 2022, the GraphQL team at Reddit added several new Go subgraphs for core Reddit entities thereby splitting the GraphQL monolith. 14 | 6. From a data storage point of view, Reddit relies on Postgres for its core data model. To reduce the load on the database, they use memcached in front of Postgres. Also, they use Cassandra quite heavily for new features mainly because of its resiliency and availability properties. 15 | 7. To support data replication and maintain cache consistency, Reddit uses Debezium to run a Change Data Capture process. 16 | 8. Expensive operations such as a user voting or submitting a link are deferred to an async job queue via RabbitMQ and processed by job workers. For content safety checks and moderation, they use Kafka to transfer data in real-time to run rules over them. 17 | 9. Reddit uses AWS and Kubernetes as the hosting platform for its various apps and internal services. 18 | 10. For deployment and infrastructure, they use Spinnaker, Drone CI, and Terraform. 19 | -------------------------------------------------------------------------------- /01~海外大厂/Amazon/2022~Amazon Prime Video Monitoring Service.md: -------------------------------------------------------------------------------- 1 | # Amazon Prime Video Monitoring Service 2 | 3 | Why did Amazon Prime Video monitoring move **from serverless to monolithic**? How can it save 90% cost? 4 | 5 | The diagram below shows the architecture comparison before and after the migration. 6 | 7 | ![diagram](https://substackcdn.com/image/fetch/w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0bb81839-6937-4969-922d-9a2328ad05fe_1404x1536.jpeg) 8 | 9 | What is Amazon Prime Video Monitoring Service? 10 | 11 | Prime Video service needs to monitor the quality of thousands of live streams. The monitoring tool automatically analyzes the streams in real time and identifies quality issues like block corruption, video freeze, and sync problems. This is an important process for customer satisfaction. 12 | 13 | There are 3 steps: media converter, defect detector, and real-time notification. 14 | 15 | - What is the problem with the old architecture? 16 | 17 | The old architecture was based on Amazon Lambda, which was good for building services quickly. However, it was not cost-effective when running the architecture at a high scale. The two most expensive operations are: 18 | 19 | 1. The orchestration workflow - AWS step functions charge users by state transitions and the orchestration performs multiple state transitions every second. 20 | 21 | 2. Data passing between distributed components - the intermediate data is stored in Amazon S3 so that the next stage can download. The download can be costly when the volume is high. 22 | 23 | - Monolithic architecture saves 90% cost 24 | 25 | A monolithic architecture is designed to address the cost issues. There are still 3 components, but the media converter and defect detector are deployed in the same process, saving the cost of passing data over the network. Surprisingly, this approach to deployment architecture change led to 90% cost savings! 26 | 27 | This is an interesting and unique case study because microservices have become a go-to and fashionable choice in the tech industry. It's good to see that we are having more discussions about evolving the architecture and having more honest discussions about its pros and cons. Decomposing components into distributed microservices comes with a cost. 28 | 29 | - What did Amazon leaders say about this? 30 | Amazon CTO Werner Vogels: “Building **evolvable software systems** is a strategy, not a religion. And revisiting your architectures with an open mind is a must.” 31 | 32 | Ex Amazon VP Sustainability Adrian Cockcroft: “The Prime Video team had followed a path I call **Serverless First**…I don’t advocate **Serverless Only**”. 33 | 34 | Over to you: Does microservice architecture solve an architecture problem or an organizational problem? 35 | -------------------------------------------------------------------------------- /99~参考资料/README.md: -------------------------------------------------------------------------------- 1 | # Awesome Giants | 大厂的技术衍化资料索引 2 | 3 | 业务引导技术,技术赋能,服务于业务。 4 | 5 | # Links 6 | 7 | - https://mp.weixin.qq.com/s/esYjHTHHcY-UMmvl9JqYXw 8 | 9 | - [2017 杭州云栖大会精华 PPT](https://github.com/Alimei/hangzhouYunQi2017ppt): 杭州云栖大会是阿里集团一年一度的全生态科技盛会。此次大会包含 140 多场技术主题论坛,共计 800 多个主题分享,涵盖人工智能、金融科技、量子计算、生命科学、IoT、政务、多媒体、VR 等 20 多个前沿科技领域。 10 | 11 | - [How Netflix works: the (hugely simplified) complex stuff that happens every time you hit Play](https://parg.co/UKc): 12 | 13 | - [Software Architecture and Design](https://msdn.microsoft.com/en-us/library/ee658098.aspx) 14 | 15 | - [从无到有:微信后台系统的演进之路](https://mp.weixin.qq.com/s?__biz=MzI5MDAwOTIzOQ==&mid=402045684&idx=1&sn=5690281c941cd8eb203b6980cdae73ce) 16 | 17 | - [一系列基础架构](http://ginobefunny.com/post/reading_record_201612/) 18 | 19 | - [从开发到架构,你需要迈过这些坎](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=208471948&idx=1&sn=4146d8e1103fb655a5d042b2f7779c90&scene=21#wechat_redirect) 20 | 21 | - [务实的技术债务管理](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=400425912&idx=1&sn=937610ebed86020fdc010643728f354e&scene=21#wechat_redirect) 22 | 23 | - [干货 | 张锦懋:千亿市场背后,美团的技术团队和挑战](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=209065371&idx=1&sn=81aa9057e74e05bfc233582584224b26&scene=21#wechat_redirect) 24 | 25 | - [赵磊:从 PHP 到 Node.js,漫谈 Uber 技术架构的变迁](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=209514154&idx=1&sn=1da032d609155dc59150167c8e753a84&scene=21#wechat_redirect) 26 | 27 | - [访谈 | 当当架构部总监史海峰:架构与管理是相通的](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=209983490&idx=1&sn=66ea1d65c4f3df5c2a137a1ed312cf9f&scene=21#wechat_redirect) 28 | 29 | - [技术选型的一些思考](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=403775359&idx=1&sn=b223e0d1d77ab093bcaa6a1929768c9a&scene=21#wechat_redirect) 30 | 31 | - [访谈 | 点融网 CTO 孔令欣讲述 2 亿融资背后的技术秘籍](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=210369398&idx=1&sn=5f1b39ca5e8c94829e00ce4c62ec7225&scene=21#wechat_redirect) 32 | 33 | - [邱剑:美团在云上踩过的那些坑](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=209114583&idx=1&sn=6aea220ed07cfd229ebb6daf49886f54&scene=21#wechat_redirect) 34 | 35 | - [访谈 | 明略数据 CTO 冯是聪:把握正确技术方向,方能激发无限价值](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=403089297&idx=1&sn=7812312ec41f5a92f70af36ed9e0e05b&scene=21#wechat_redirect) 36 | 37 | - [宜人贷纽交所上市,CTO 段念谈背后的技术探索](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=402791950&idx=1&sn=6dad53415a9f4970c5fc9e6ec0763377&scene=21#wechat_redirect) 38 | 39 | - [环信首席架构师梁宇鹏谈架构、管理及成长(上)](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=211307407&idx=1&sn=9d2ab16be60f862f7e5ef9d607ac0654&scene=21#wechat_redirect) 40 | 41 | - [环信首席架构师梁宇鹏谈架构、管理及成长(下)](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=211956893&idx=1&sn=c1be86768d02b0d562229ef537293cdb&scene=21#wechat_redirect) 42 | 43 | - [高可用可伸缩架构实用经验谈](http://mp.weixin.qq.com/s?__biz=MzA4NTU2MTg3MQ==&mid=206450474&idx=1&sn=bf03ae890b2e7f07e9752715b2b7ca68&scene=21#wechat_redirect) 44 | 45 | - [异地多活设计难?其实是你陷入了这四大误区出不来! ](http://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650993345&idx=1&sn=f460c51ad3dfd1da4d41e0a408969c54&scene=0#wechat_redirect) 46 | 47 | - [一线架构师带你玩性能优化 ](http://mp.weixin.qq.com/s?__biz=MzI3MzEzMDI1OQ==&mid=2651815238&idx=1&sn=8b549dd1c6689732c892f60d00a33b70&chksm=f0dc2b3ac7aba22cbad3a7f0fc8365d2f377ca75e744907ba7fb5a296406ff4c35f888efecf0&scene=0) 48 | 49 | - [谈谈互联网后端基础设施](http://www.rowkey.me/blog/2016/08/27/server-basic-tech-stack/) 50 | 51 | - [单点系统架构的可用性与性能优化 ](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959480&idx=1&sn=337bd74410a6bef616128fd17abd08a8&scene=0#wechat_redirect) 52 | 53 | - [设计高并发下的读服务?一个电商老兵的 10 条经验](http://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&mid=2659597710&idx=1&sn=e8801d7aba68485489cfcac9ac2fd2ba&scene=0#wechat_redirect) 54 | 55 | - [今日头条架构演进之路:高压下的架构演进专题(含 PPT)](http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653547520&idx=1&sn=f303a6250eb68775e9b6dbbdea6b9f06&scene=23&srcid=0715cLKw7d65sunBdZV8Y405#rd) 56 | 57 | - [高性能高并发系统的稳定性保障](http://www.yunweipai.com/archives/10501.html) 58 | 59 | # 大规模基础架构 60 | 61 | - [2017~深度解密京东登月平台基础架构](https://parg.co/bg7):近日,京东发布登月机器学习平台,并在京东云上线,正式对外提供人工智能服务。登月机器学习平台的上线代表着京东人工智能技术从应用级服务到基础算法的全面对外开放,实践着京东 RaaS(零售即服务)的发展策略。今天我们邀请了 AI 与大数据部的工程师为大家深度解密京东登月平台基础架构。 62 | 63 | - [2016~Data Infrastructure At Airbnb](https://medium.com/airbnb-engineering/data-infrastructure-at-airbnb-8adfb34f169c#.8y91c8qmk): At Airbnb we promote a data informed culture and use data as a key input for making decisions. 64 | 65 | - [2018~Stream & Go: News Feeds for Over 300 Million End Users](https://parg.co/Uku): Stream is an API that enables developers to build news feeds and activity streams (try the API). We are used by over 500 companies and power the feeds of more than 300 million end users. 66 | 67 | - [2017~Distributed Systems-3rd edition》📚](https://parg.co/UeG): 1. Introduction 2. Architectures 3. Processes 4. Communication 5. Naming 6. Coordination 7. Replication 8. Fault tolerance 9. Security 68 | 69 | # 创业公司的基础架构 70 | 71 | - [2019~一个牛逼的创业公司后台技术栈搭建方案](https://zhuanlan.zhihu.com/p/71267807): 说到后台技术栈,脑海中是不是浮现的下面这样一幅图? 72 | 73 | # Others 74 | 75 | - [互联网风雨十年,我所经历的技术变迁](http://zhangtielei.com/posts/blog-mobile-to-ai.html) 76 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Contributors][contributors-shield]][contributors-url] 2 | [![Forks][forks-shield]][forks-url] 3 | [![Stargazers][stars-shield]][stars-url] 4 | [![Issues][issues-shield]][issues-url] 5 | [![license: CC BY-NC-SA 4.0](https://img.shields.io/badge/license-CC%20BY--NC--SA%204.0-lightgrey.svg)][license-url] 6 | 7 | 8 |
9 |

10 | 11 | Logo 12 | Logo 13 | 14 | 15 |

16 | 在线阅读 >> 17 |
18 |
19 | 速览手册 20 | · 21 | 代码实践 22 | · 23 | 参考资料 24 | 25 |

26 |

27 | 28 | 29 | 30 | # Preface | 前言 31 | 32 | Awesome-Lists 是横跨了编程语言与理论、Web 与大前端、服务端开发与基础架构、云计算与大数据、数据科学与人工智能、产品设计等多个领域的,包括了文章、书籍、课程、案例、开源项目等多种类型的**精选**资料索引(在各个系列的文章末尾会附上一些细分领域关联性较强的参考资料列表)。Awesome-Lists 记录了笔者在日常阅读、学习与实践中发掘的优秀的资料,其按照[知识图谱](https://github.com/wx-chevalier/Developer-Zero-To-Mastery)中定义的各个领域的知识体系分门别类地存放;笔者会不断更新其中链接,去芜存菁,去重留一,希望为同仁提供优秀的、有价值的、尽可能精简的资料索引。 33 | 34 | 梭罗在《瓦尔登湖》中写道:知道自己知道什么,也知道自己不知道什么,这就是真正的知识。知我所知是对于自己能力的正确认识,知我所不知则能为自己未来的路明确些方向。站在巨人的肩膀上窥探大道三千,才能触类旁通,他山之石,可以攻玉。相较于其他很多的 `Awesome-*` 项目,笔者认为 AwesomeList 更为纯粹,其中收录的文章链接都是笔者阅读、筛选之后,按照 [IT 技术图谱与知识架构](https://github.com/wx-chevalier/Developer-Zero-To-Mastery)归档留存。在碎片化学习的同时,也能够建立系统化的知识。 35 | 36 | ![awesome coder](https://user-images.githubusercontent.com/5803001/43364904-59f5bda6-9356-11e8-9ab3-ae073d08bb9e.png) 37 | 38 | # Nav | 导航 39 | 40 | ## Convention | 约定 41 | 42 | 本系列文章目录层次如下: 43 | 44 | - {Something}-List.md - 该文件包含或者分割为以下内容: 45 | 46 | - Overview 47 | 48 | - Ecosystem 49 | - Learning Path & Roadmap & Guideline 50 | - CheatSheet 51 | 52 | - Resource 53 | - Book 54 | - Collection 55 | - Course 56 | - Series 57 | - Site 58 | - Tutorial 59 | 60 | - {Something}-OpenSource-List.md 61 | 62 | - Showcase 63 | - Dev Tools 64 | - Framework 65 | - ... 66 | 67 | - @Deprecated {Something}-Syntax-List.md - 该文件包含或者分割为以下内容: 68 | 69 | - Variable & Expression 70 | - Control flow & Error Handler 71 | - Function & Functional Programming 72 | - Class & Object 73 | - MetaProgramming 74 | 75 | - @Deprecated {Something}-DataStructure-List.md - 该文件包含或者分割为以下内容: 76 | 77 | - Basic Type 78 | - Indexed Collection 79 | - Keyed Collection 80 | 81 | - @Deprecated {Something}-Functionality-List.md - 该文件包含或者分割为以下内容: 82 | 83 | - Storage 84 | - Network 85 | - System / Process 86 | 87 | - @Deprecated {Something}-DevOps-List.md - 该文件包含或者分割为以下内容: 88 | 89 | - Builder, Task runner, Bundler, dependence management 90 | - Debug 91 | - Test, unit test, integration test, e2e test 92 | - Architecture, module system, State management, 93 | - StyleGuide, coding standards for source code in the JavaScript programming language. 94 | 95 | - @Deprecated {Something}-Production-List.md - 该文件包含或者分割为以下内容: 96 | 97 | - Performance Optimization / Tunning 98 | - Release / Deploy 99 | - Accessibility / Monitor 100 | - RealTime 101 | - I18n 102 | 103 | - @Deprecated {Something}-Internals-List.md Inner mechanism under the hood, Core/Compiler/Engine 104 | 105 | 本系列文章索引类别约定如下: 106 | 107 | - #Article#:单篇文章,也是默认的引用类型 108 | - #Slide#:幻灯片 109 | - #Series#:系列文章 110 | - #Book# 📚:书籍 111 | - #Course# 🎥:视频教程 112 | - #Collection# 🗃️:资源集锦 113 | - #Code# ![code](https://ng-tech.icu/assets/code.svg): 开源的项目或者框架、库。 114 | - #Scratch#: 从零构建某些系统 115 | - #Tool#: 工具 116 | - #Paper# 117 | - #Tutorial# 118 | 119 | 目前,在知识体系中会存在多层构建的问题,对于非 #Article#、#Series# 类遵循的归纳原则就是:仅放置在最顶层与最底层,不放在中间层。 120 | 121 | # About 122 | 123 | ## Stats | 统计 124 | 125 | ```sh 126 | # 统计所有的有效链接数 127 | $ wc -l **/*.md | grep -E -v "(Weekly|total|README)" | awk '{s+=$1} END {printf "%.0f", s}' 128 | ``` 129 | 130 | ## Acknowledgements 131 | 132 | - [The book of secret knowledge](https://github.com/trimstray/the-book-of-secret-knowledge): A collection of inspiring lists, manuals, cheatsheets, blogs, hacks, one-liners, cli/web tools and more. 133 | 134 | ## 版权 135 | 136 | 笔者所有文章遵循 [知识共享 署名 - 非商业性使用 - 禁止演绎 4.0 国际许可协议](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh),欢迎转载,尊重版权。您还可以前往 [NGTE Books](https://ng-tech.icu/books-gallery/) 主页浏览包含知识体系、编程语言、软件工程、模式与架构、Web 与大前端、服务端开发实践与工程架构、分布式基础架构、人工智能与深度学习、产品运营与创业等多类目的书籍列表: 137 | 138 | [![NGTE Books](https://s2.ax1x.com/2020/01/18/19uXtI.png)](https://ng-tech.icu/books-gallery/) 139 | 140 | 141 | 142 | 143 | [contributors-shield]: https://img.shields.io/github/contributors/wx-chevalier/Awesome-Lists.svg?style=flat-square 144 | [contributors-url]: https://github.com/wx-chevalier/Awesome-Lists/graphs/contributors 145 | [forks-shield]: https://img.shields.io/github/forks/wx-chevalier/Awesome-Lists.svg?style=flat-square 146 | [forks-url]: https://github.com/wx-chevalier/Awesome-Lists/network/members 147 | [stars-shield]: https://img.shields.io/github/stars/wx-chevalier/Awesome-Lists.svg?style=flat-square 148 | [stars-url]: https://github.com/wx-chevalier/Awesome-Lists/stargazers 149 | [issues-shield]: https://img.shields.io/github/issues/wx-chevalier/Awesome-Lists.svg?style=flat-square 150 | [issues-url]: https://github.com/wx-chevalier/Awesome-Lists/issues 151 | [license-shield]: https://img.shields.io/github/license/wx-chevalier/Awesome-Lists.svg?style=flat-square 152 | [license-url]: https://github.com/wx-chevalier/Awesome-Lists/blob/master/LICENSE.txt 153 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Awesome-Lists 7 | 8 | 9 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 34 | 38 | 40 | 45 | 46 |
47 | 64 | 97 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | --> 131 | 132 | 133 | 144 | 145 | 146 | 147 | 156 | 157 | 158 | -------------------------------------------------------------------------------- /02~编程大师/Robert C. Martin.md: -------------------------------------------------------------------------------- 1 | Robert C. Martin,世界级编程大师,设计模式和敏捷开发先驱,敏捷联盟首任主席,C++ Report 前主编,被后辈程序员尊称为“Bob 大叔”。20 世纪 70 年代初成为职业程序员,后创办 Object Mentor 公司并任总裁。 2 | 3 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/iaibvmyz4605NaFjP979yjKBpyOq6zKJYvE9icRkmSEXSN7jtoMXehicB6Eaj8bibzDREd8NpCG6ZkCKcWgicic3SibWFg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 4 | 5 | Robert C. Martin 6 | 7 | Martin 还是一名多产的作家,至今已发表数百篇文章、论文和博客文章。著有《代码整洁之道》《代码整洁之道:程序员的职业素养》《敏捷软件开发:原则、模式和实践》《UML:Java 程序员指南》等。 8 | 9 | 著名的对象范型和 C++专家考帕里安(James O. Coplien)曾这样评价 Bob 大叔: 10 | 11 | 那班求索者多年来并肩奋斗,不但是为求一己之进步,更将他们的知识通过和你手上正在做的事一般的工作奉献给这个行业,使得编程世界略有改善。 12 | 13 | **天才少年 Bob 的成长之路** 14 | 15 | 1964 年,12 岁的 Bob 写下人生第一行代码。 16 | 17 | 1965 年,Bob 开启了人生中算得上专业的第一次合作,与小搭档 John Marchese 一起造电脑,Bob 思考,John 动手,两个人忙活了数百个小时,捣鼓出了不少看着相当有型的家伙,上面装着继电器、按钮、小灯,甚至还安装了一个电传打字机!虽然这些电脑没法用,但是看起来真的很棒,他们也确实很用心,这对于两个 13 岁的小朋友来说,相当了不起了! 18 | 19 | ![图片](https://mmbiz.qpic.cn/mmbiz_jpg/iaibvmyz4605NaFjP979yjKBpyOq6zKJYvqvzjm2tOFZziaRZw4UJ0pCnw9rNOK9icH883bgWJfOl9ZXXFyWHxNCbA/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 20 | 21 | 电动打字机 22 | 23 | 1968 年,在中学第一年认识了新的小伙伴 Tim Conrad,开始了新一轮的造电脑工程,这次由 Tim 思考,Bob 动手,Tim 还教给了 Bob 一些电子学知识,Tim 也是第一个给 Bob 介绍 PDP-8 的人。他们用了一些很基础的元器件,真的造出了一台可以工作的 18 位二进制计算器,能够进行加减乘除的运算,他们兴奋极了,那年他们把所有的假期都投了进去。 24 | 25 | 后来,他们还自学了计算机课程,在那个年代,这是一个相当不容易的事情,但他们做到了。他们特别找来了有关 PDP-8 汇编器、FORTRAN、COBOL、PL/1,他们就像海绵一般在书中汲取知识,并写了一堆根本根本没有可能去实际执行的程序,因为那时根本没有计算机可以供实操,但纯粹出于爱好,他们仍然孜孜不倦写了许多程序。 26 | 27 | ![图片](https://mmbiz.qpic.cn/mmbiz_jpg/iaibvmyz4605NaFjP979yjKBpyOq6zKJYvwywGcfj36VAcCQR22Hia1DZfC68HwV0j3MfuoqliaTib46blScibCrrY1A/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 28 | 29 | PDP-8 汇编器 30 | 31 | 1969 年,Tim、Bob 以及他们的伙伴 Richard Lloyd 成为了 ACS 公司的程序员,为芝加哥卡车司机工会开发实时会计系统。17 岁的他们觉得上大学是浪费时间,决定马上进入职场,在那里他们遇到了 Bill Hohri、Frank Ryder、Big Carlin 和 John Miller,他们为这些年轻人提供了学习专业编程的实战机会,Bob 在其中颇受教益。 32 | 33 | 这份工作经历也让 Bob 意识到,作为一个程序员还应该具备某些素养,例如对着你的上司,说“**YES**”和“**NO**”。 34 | 35 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/iaibvmyz4605NaFjP979yjKBpyOq6zKJYva5QvcH1x5DXqoFiafqwIMVdP4kzNtuiaFoLcsFJicsWt9v5rMff3frMPQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 36 | 37 | Bob 在 ASC 工作时,他的上司 Frank 是一位退役的空军上校,这位领导的处事风格雷厉风行:我发出指令、你们按时上线。初入职场的一众小年轻,包括 Bob,根本不敢看他的眼睛,更不敢抗议时间不够,最终的结果是系统按时上线,故障频发,无限次数的系统崩溃、系统重启。 38 | 39 | Bob 认为,程序员往往太容易说“YES”,总是在没有明确目标和期限的情况下,就第一时间草率地给出了确认的答复,任务交付时却无法实现自己的承诺。 40 | 41 | 有时候,获取正确决策的唯一途径,便是勇敢无畏地说出“不”字……我们要明白,委屈专业原则以求全,并不是问题的解决之道。舍弃这些原则,只会制造出更多的麻烦。 42 | 43 | 只要你愿意尝试,在工作中对着那些不合理的工作任务,主动说几次“NO”,之后你会逐渐发现:你只需要花三分的力气去拒绝那些无法完成的工作任务,就可以节省十分甚至二十分开发的时间;相反,如果在没有明确目标和期限的情况下,就草率给出了确认的答复,往往会非常被动,到最后,项目就落得著名的 IBM OS/360 操作系统的失败下场。 44 | 45 | 在 Bob 的经典书籍《代码整洁之道》中也提到,作为一个程序员不仅是懂得“NO”背后所蕴含的意义和责任,“YES”背后的意义和责任同样重要。 46 | 47 | (说“YES”时)你对自己将会做某件事做了清晰的事实陈述,而且还明确说明了完成期限。那不是指别人,而是指你自己。你陈述的是自己会去执行的一项行动,而且,你不是“可能”去做,或是“可能做到”,而是 “会”做到。 48 | 49 | 但“YES”背后常常跟着的是屡见不鲜的项目延期,绝大部分原因就是在这种不负责任的情况下说 “YES”导致的。 50 | 51 | 在 Bob 的学生时代、职业生涯中,直接导师并不多,因为他的成长的年代中并没有很多有经验的老师、程序员。Bob 在工作项目的摸索及读一些杰出人物的著作来汲取知识、积累经验,这些人包括 Grady Booch(《UML 用户指南》作者), Tom DeMarco(《项目百态》作者), Meilir Page-Jones(《UML 面向对象设计基础》作者), Erich Gamma(《设计模式》作者), Martin Fowler(《重构》作者), Bertrand Meyer(《面向对象软件构造》作者), Kent Beck(《测试驱动开发》作者),等等。Bob 感觉这些教导都是充满价值的。 52 | 53 | 随后 Bob 在 Teradyne 工作,他从老板、工作伙伴们的身上学到了许多他认为有价值的东西,特别是 Mike Carew,他们成为了黄金搭档,“如果你想活儿干得又快又好,就把他交给 Bob 和 Mike!“他们共事的时光充满欢乐。 54 | 55 | **糟糕的代码能让一个公司关门大吉!** 56 | 57 | 在一个项目中,某位同事花三个星期写完一串代码后离职了,在没有批注、没有规律的情况下,果然没有人能够理解这串代码,最终只能由新的同事重新撰写。这段经历让他从此对代码的整洁深感重视。 58 | 59 | 1987 年,Bob 开始和 Jim Newkirk 搭档,随后他们相继离开 Teradyne,加入了 Clear Communication。 60 | 61 | 于此同时,有家公司写了一个很流行的杀手应用,许多专业人士都买来用,包括 Bob。然后,发布周期开始拉长,缺陷总是不能修复,装载时间越来越久,崩溃的概率也越来越大,至今 Bob 还记得自己在某天沮丧地关掉那个程序,从此再不用它时的绝望心情。果不其然,在那之后不久,该公司就关门大吉了。 62 | 63 | 后来,Bob 见到那家公司的一位早期雇员,问他发生了什么事,而他的回答令 Bob 愈发恐惧起来。原来,当时他们赶着推出产品,代码写得乱七八糟,特性越加越多,代码也越来越烂,最后再也没法管理这些代码了,只好放着不管,最终,糟糕的代码毁了这家公司。这个事情更是让 Bob 确定了代码的整洁是需要引起重视的,软件质量,不但依赖架构及项目管理,而且与代码质量紧密相关,但当时的他并没有能力来改变这一切。 64 | 65 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/iaibvmyz4605NaFjP979yjKBpyOq6zKJYvehvNOyvxgJg4PAeaePeMGbkXOg7LGCmfpLGbkEpfZVYIDWY9HS8A6A/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 66 | 67 | Robert C. Martin 68 | 69 | **99%的程序员都在为糟糕代码头痛!** 70 | 71 | Bob 和 Jim 一起在 Clear Communication 拼搏了好几年后,共同创办了 Object Mentor 公司,Bob 认为,在他有幸共事过的人中,Jim 是最率直、最严谨和最专注的人,从 Jim 身上获益良多。 72 | 73 | 直到现在,Bob 仍坚持阅读这一习惯,每天花费大量的时间阅读,甚至包括博客和文章,从中紧跟科技发展。他曾坦言自己一直都在寻找值得一读的好书。 74 | 75 | 想到那个困扰了他许久的难题,也是大部分程序员都遭遇过的难题——糟糕的代码,他本能的就想迎头而上,像他的导师们一样,像 Jim 一样,给别人带来帮助。于是,他开始写作,在**《代码整洁之道》**一书中分享了自己多年编程生涯所累积的项目实践经验,将代码整洁的多种解决办法倾囊相授,受到了广大程序员的喜爱及追捧。 76 | 77 | Bob 曾在为 ASD 所写的序中写道: 78 | 79 | 最好的软件开发人员都知道一个秘密:美的东西比丑的东西创建起来更廉价,也更快捷。 80 | 81 | 而构建、维护一个美的软件系统所花费的时间、金钱都要少于丑的系统。 82 | 83 | 美的系统是灵活、易于理解的,构建、维护它们就是一种快乐。” 84 | 85 | 如果说 ASD 中更多的是设计思想和模式精髓的阐述,那么在**《代码整洁之道》**中,Bob 为程序员们提供了更为详尽的微距视角,涉及“命名”、“函数”、“代码格式”、 “异常处理”、“单元测试”等编码主题,巨细靡遗地向软件工匠们极力传授整洁编码的艺术,进一步向软件开发社区慷慨分享了他在探索“软件之美”旅途中的参证心得。 86 | 87 | Bob 还在书中提出一种观点:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、 升级奠定了良好基础。 88 | 89 | 他认为,无论是敏捷开发流派还是传统开发流派,想要保证软件质量,不仅仅依赖架构及项目管理,更与代码质量紧密相关。 90 | 91 | 《代码整洁之道》中提到 Bob 大叔认为把代码变得整洁的,就首先要了解三个注释,即: 92 | 93 | **不恰当的信息** 94 | 95 | 让注释传达本该更好地在源代码控制系统、问题追踪系统或任何其他记录系统中保存的信息,是不恰当的。 96 | 97 | 例如,修改历史记录只会用大量过时而无趣的文本搞乱源代码文件。通常,作者、最后修改时间、 SPR 数等元数据不该在注释中出现。 98 | 99 | 注释只应该描述有关代码和设计的技术性信息。 100 | 101 | **废弃的注释** 102 | 103 | 过时、无关或不正确的注释就是废弃的注释。注释会很快过时。最好别编写将被废弃的注释。 104 | 105 | 如果发现废弃的注释,最好尽快更新或删除。 106 | 107 | 废弃的注释会远离它们曾经描述的代码,变成代码中无关和误导阅 读者的浮岛。 108 | 109 | **糟糕的注释** 110 | 111 | 值得编写的注释,也值得好好写。 112 | 113 | 如果要编写一条注释,就花时间保证写出最好的注释,字斟句酌,使用正确的语法和拼写,别闲扯,别画蛇添足,要保持简洁。 114 | 115 | **糟糕的代码最终会成为吞噬人的黑洞** 116 | 117 | ![图片](https://mmbiz.qpic.cn/mmbiz_jpg/iaibvmyz4605NaFjP979yjKBpyOq6zKJYv9G65pic6uB2EcFtl5AIQJeuUOtrFYvtgohrXe5aDgTKEqFibgNPKsKgQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 118 | 119 | 上面的图片是**《代码整洁之道》**的封面,是用来自于哈勃望远镜那副著名的可见光相片和 Spitzer(斯比泽)轨道探测器最新红外影像组合而成的 M104:草帽星系,它坐落于处女座,离地球仅 3000 万光年,其核心是一个质量超大的黑洞,有 100 万个太阳那么重,仿佛经历了大爆炸之后碎片四溅的产物。 120 | 121 | 让人不禁联想到那些代码不整洁、风格各异且不可维护的项目,就像一个个的黑洞,存在着某天会定时爆发的风险,而当它真正爆发时,这个项目的所有人都会因此遭殃。 122 | 123 | 当你负责一个小型项目时,如果追求速度,力求快速出成果,这时可以率性而为。当项目逐渐扩大,规范就会逐步显出它的重要性。在软件开发中也是一样,归置到位的工具能提升生产力。软件质量,不但依赖于架构及项目管理,而且跟代码质量息息相关。代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好的基础。 124 | 125 | **世界级软件开发大师的多重身份** 126 | 127 | 如今,Bob 除了写作,还会为 cleancoders.com 制作视频,也会技术会议上讲话,从世界级软件开发大师到畅销专业书籍作家再到台前传达专业领域知识的权威人物,Bob 给我们带来一次次惊喜。 128 | 129 | 在这个过程中,他发现自己不止在编程方面颇有心得,对于站在人前传达信息这件事也颇有天赋。 130 | 131 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/iaibvmyz4605NaFjP979yjKBpyOq6zKJYvvWv8ia8mryMk5aJfrbHJXgx9DKHqCmX1S9icvDEyrpHWZa4LSKfrSfug/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 132 | 133 | Robert C. Martin 134 | 135 | 我们觉得他“变身”了,想知道他是如何从一位职业的程序员变身成为这个领域的导师,但对他来说,这是一个缓慢的成长过程:“我花了整整 20 年来积累工作经验,又花了 20 年才做到今天的成就。‘变身’从来都不是我意料之中的事,也不是我的目的;但这个过程对我来说是一种享受”。 136 | -------------------------------------------------------------------------------- /02~编程大师/Martin Fowler.md: -------------------------------------------------------------------------------- 1 | # Martin Fowler 2 | 3 | Martin Fowler,世界级软件开发大师,敏捷开发的开拓者和创始人全球知名的面向对象分析设计、UML、模式等专业领域的领头羊,首创敏捷开发方法论,被誉为软件开发“教父”,现任职于全球知名技术咨询公司 ThoughtWorks,首席科学家。 4 | 5 | ![图片](https://mmbiz.qpic.cn/mmbiz_jpg/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT4LsfVAzj1ibTRnUNoPyk1rzdnic22v3584NfaRwOiaazg1DpzpIttaQfQg/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 6 | 7 | Martin Fowler 8 | 9 | 坊间流传着这样一句话,如果有一本编程技术类书籍能够让读者在工作或实践多年后,还在反复咀嚼玩味、爱不释手、引导着读者前进着,那个必定是 Martin Fowler 的《重构》。 10 | 11 | Martin 还是 IT 领域的知名作家,他撰写的七本有关软件开发的书广受程序员们的喜爱,包括重构、企业应用程序体系结构模式和 UML Distilled 等领域。其中《重构》风靡国内外,拥有数百万读者,国内豆瓣评分高达 9.5 分。 12 | 13 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT4LLKJwRW533GErcrnM5ia2VWsYo2oVwZAEnB77o5OneQcicltLX5NvPuA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 14 | 15 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT41DrAcH2qlfFmzjxoLGtAy8VM4yNbLcgO8StzbPgbpz8buRcMnU4O3w/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 16 | 17 | Object Technology International, Inc,Erich Gamma 曾这样评价 Martin: 18 | 19 | Martin Fowler 清楚地揭示了重构过程,他为面向对象软件开发所做的贡献难以估量。他解释了重构的原理和最佳实践,并指出何时何地你应该开始挖掘你的代码以求改善。 20 | 21 | 因此,我极力推荐你试试 Martin Fowler 的重构手法,你和你的程序都将因此更美好。 22 | 23 | **软件开发“教父”的重构生涯** 24 | 25 | Martin Fowler,1963 年出生在英格兰的沃尔索耳,正是编程世界刚刚起步的年代。 26 | 27 | Martin 在 80 年代初开始接触软件行业,那时候 Smalltalk 还是一门很火的语言,大家都在学习这门语言,而 Martin 也刚开始从事软件工作——关于信息系统对象建模方面的顾问。 28 | 29 | 那个年代没有任何有关面向对象分析和设计的书籍,大家都是用一种简单的图符表示法,然后提出一个简单的建模过程,最后用几个简单的示例来加以说明。但 Martin 认为不应该把重点放在过程——即如何建模,而是把重点放在过程的结果——即模型本身,尽管这与当时大环境下的创建方式是相悖的。 30 | 31 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT4IiaiaLyvCxFMfjJOPiagPRKx3XJFov0bia2m1Bdx1Teb4kDbn4XPI1TZIw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 32 | 33 | 到了 90 年代初,Martin 发现,大多数程序员很难通过紧跟技术创新的脚步来享受软件工程领域的新成果。 34 | 35 | 身为一个信息系统对象建模顾问,Martin 从 Smalltalk 上学得的专业知识是远远超过这个职业所需要的,他觉得自己既然有了这些建模方面的理念,同时又对编程方面很感兴趣,所以他不单在建模方面帮助别人,还在编程方面进行指导——借助外力的帮助,精确地运用 UML。 36 | 37 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT4SQiaxEzDfh3nzpzzUhPk80Bhnlic6OEFJwDo8OxKaqmRKtibZfo4cjPBw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 38 | 39 | 从建模到编程语言,他把这些都看成一件完整的、而非毫无关联的事。 40 | 41 | 这样的工作持续了近十年,1999 年,Martin 迎来了他人生中意义重大的一年。 42 | 43 | 那时 Martin 造访了客户调研的开发项目时发现,该系统的核心继承体系相当凌乱,为此,他建议负责该项目的经理将这些代码进行整理,但是项目经理认为在项目面临很大的进度压力下,只要程序看上去还可以运行就算是完成。 44 | 45 | 这种情况下,《重构:改善既有代码的设计》面世了,Martin 在这本书中揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。 46 | 47 | 重构这个理念一经推出,受到了广大程序员的喜爱,他们觉得在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构是一个非常妙的事。后来,这本风靡国际 IT 行业的《重构》被引入国内,在豆瓣评分以 9.2 的高分长期霸屏程序员必读书单中。 48 | 49 | 2010 年,第五届敏捷软件开发大会“敏捷中国 2010”上,Martin 的“敏捷宣言”又一次引领了整个 IT 行业对敏捷开发的认识,从此“敏捷”二字开始风行国内 IT 领域。对程序员们来说,他就是当之无愧的先行者。 50 | 51 | ![图片](https://mmbiz.qpic.cn/mmbiz_jpg/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT4kAhSjIjPEicAcMdQbW99ibeIibGjI94VmPIBtypyxhHVDvZJIzskjITRw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 52 | 53 | Martin Fowler 54 | 55 | 就在去年,这位先行者又全面升级了《重构》,《重构:改善既有代码的设计(第 2 版)》面世了,国内外掀起一阵抢购热潮,豆瓣评分更是高达 9.5 分。 56 | 57 | **Martin 定义的重构到底是什么?** 58 | 59 | 说起重构,还要从 1999 年发生在 Martin 身上的一件事说起。面对凌乱的系统的核心继承体系,他建议负责该项目的经理将这些代码进行整理,但是被项目经理拒绝。 60 | 61 | 随后,Martin 把自己的想法第一时间告诉了在这个继承体系上工作的程序员,程序员都很敏锐,马上就看出问题的严重性,特别是在这种需要借助外力才能发现问题。他们立刻用了两天的时间整理好这个继承体系,并删掉了其中一半代码,功能毫发无损,而且发现在继承体系中加入新的类或使用系统中的其他类都更快、更容易了,他们十分感谢 Martin。 62 | 63 | 但项目经理很不高兴,他觉得这些程序员却白白耗费了两天时间,做的工作却与未来几个月要交付的大量功能毫不相干,明明原先的代码运行起来还算正常,为什么要为了可能发生的问题去花费时间提前预防呢? 64 | 65 | 不过在 6 个月之后,这个项目还是宣告失败了,原因是代码太复杂,无法调试,也无法将性能调优到可接受的水平。再后来,这个项目重新启动,唯一的解决办法就是从头开始编写整个系统,Kent Beck 受邀做了顾问。他做了几件迥异以往的事,其中最重要的一件就是听从 Martin 的建议,坚持以持续不断的重构行为来整理代码。 66 | 67 | 那时,Martin 第一次认识到重构的重要且不可替代性。 68 | 69 | “重构”这个概念最开始来自于 Smalltalk 圈子,由于重构是框架开发中不可缺少的一部分,所以当框架设计者讨论自己的工作时,这个术语就诞生了。 70 | 71 | 当他们精炼自己的类继承体系时,当他们叫喊自己可以拿掉多少多少行代码时,重构的概念慢慢浮出水面,后来重构就进入了其他编程语言阵营之中。 72 | 73 | 说得直白一点,所谓重构(refactoring)就是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。 74 | 75 | 重构是一种经千锤百炼形成的有条不紊的程序整理方法,可以最大限度地减小整理过程中引入错误的概率。本质上说,重构就是在代码写好之后改进它的设计。 76 | 77 | “在代码写好之后改进它的设计”这种说法有点儿奇怪。在软件开发的大部分历史时期,大部分人认为,应该先设计而后编码:首先得有一个良好的设计,然后才能开始编码。 78 | 79 | 但是,随着时间流逝,人们不断修改代码,于是根据原先设计所得的系统,整体结构逐渐衰弱。代码质量慢慢沉沦,编码工作从严谨的工程堕落为胡砍乱劈的随性行为。 80 | 81 | 而“重构”正好与此相反。 82 | 83 | 哪怕手上有一个糟糕的设计,甚至是一堆混乱的代码,我们也可以借由重构将它加工成设计良好的代码。重构的每个步骤都很简单,甚至显得有些过于简单:只需要把某个字段从一个类移到另一个类,把某些代码从一个函数拉出来构成另一个函数,或是在继承体系中把某些代码推上推下就行了。 84 | 85 | 但是,聚沙成塔,这些小小的修改累积起来就可以根本改善设计质量。这和一般常见的“软件会慢慢腐烂”的观点恰恰相反。 86 | 87 | 有了重构以后,Martin 发现工作的平衡点开始发生变化,例如,设计不是在一开始完成的,而是在整个开发过程中逐渐浮现出来。在系统构筑过程中,他学会了如何不断改进设计。这个“构筑-设计”的反复互动,可以让一个程序在开发过程中持续保有良好的设计。 88 | 89 | **Martin 认为,重构这东西不可能一开始就完全正确,它将随着设计者的经验成长而进化,代码被阅读和被修改的次数远远多于它被编写的次数。而保持代码易读、易修改的关键,就是重构。** 90 | 91 | ![图片](https://mmbiz.qpic.cn/mmbiz_png/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT4900WtG7iaUkiaqiafS3uqa2GmJvPpq5bYvnibInumgH6LBYdnaCx9r1RGg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 92 | 93 | 作为一本为专业程序员编写的重构指南——《重构》,Martin 的目的是告诉所有程序员如何以一种可控且高效的方式进行重构,从而减少了开发过程中的风险。 94 | 95 | 书里提出的重构准则将帮助他们学习如何有条不紊地、一次一小步地修改代码、改进程序结构,且不会引入错误的正确的重构方式,最终得到有效的、长期可运行的代码程序,而不是去遵循那句古老的工程谚语:“如果它还可以运行,就不要动它。” 96 | 97 | **重构再度升级** 98 | 99 | 《重构》自 1999 年面世以来,已经经过 21 年了。软件行业里新的编程语言不断涌现,老的编程语言也加快迭代,而函数式编程和面向对象一样成了主流编程语言的标配。不仅软件开发技术发生了很多重要的变化,各种软件开发工具也日益现代化,对开发的更好支持也已成为主流编程语言新的核心竞争力。 100 | 101 | 而现在,“重构”这一理念已被读者广泛接纳,作为一种经千锤百炼形成的有条不紊的程序整理方法,能够最大限度地减小整理过程中引入错误的概率,成为编程的词汇表中不可或缺的部分,《重构》一书至今依旧被无数程序员奉为软件开发领域的经典之作。 102 | 103 | 但重构的扎实功夫要学起来、做起来,颇不是件轻松的事,且不说详尽到近乎琐碎的重构手法,光是单元测试一事,怕是已有九成程序员无法企及,渐渐地,“重构”成了一块漂亮的招牌,大家都愿意挂上这个名号,可实际上干的却多是“刀劈斧砍”的勾当。 104 | 105 | 就国内先如今的情况而论,“重构”概念的表里分离,大有愈演愈烈之势。随着当年的一线技术人员纷纷走上领导岗位,他们乐于将“重构”这块漂亮招牌用在更宽泛的环境下,例如系统架构乃至组织结构,都可以“重构”一下。 106 | 107 | 然而基本功的欠缺,却也一路如影随形。当年在对象中的刀劈斧砍,如今被照搬到了架构、组织的调整。于是“重构”的痛苦回忆又一遍遍重演,甚而程度更深、影响更广、危害更烈。 108 | 109 | 通过重构,现在的程序员普遍通过微增量来开发系统、编写测试用例。但 Martin 认为这远远不够,重构的影响其实应该更广泛,20 年前,他和其他先行者鼓励大家都接受重构这一概念,但是,在整个行业普及重构仍需要相当长的时间。 110 | 111 | 对于 IT 领域来说,Martin 不仅仅是一个先行者,他还是一个引路者。 112 | 113 | Martin 希望看到更多人使用他们大力推广的测试法,使用持续集成和持续交付等方法。但涉及上述概念,Martin 觉得自己只能尽量在书中,从主客观上尽可能详尽地解释这些技术,并希望这会说服更多人进行尝试,“当他们尝到甜头后就会在工作中真正用上这些方法“。 114 | 115 | [![图片](https://mmbiz.qpic.cn/mmbiz_png/iaibvmyz4605PFhZ0rXuBClFSibwS4RxFRgqqCEc3QtQExlKoQYd5QIebLpULTtDcz4698XXibeHl1DdhyCzspb3uw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)](https://www.epubit.com/bookDetails?id=N42831) 116 | 117 | 针对这一现象,Martin 推出了《重构:改善既有代码的设计(第 2 版)》,他在第 1 版的基础上做了全面修订,反映了编程领域业 20 年来发生的许多变化,但 Martin 传递的理念也始终如一:**不改变外在行为,而提高代码质量**,但将基础功夫做得更扎实。让人不禁感叹于他对“微末功夫”的执着! 118 | 119 | 很多人好奇 Martin 为什么决定将《重构》再版?Martin 给出了 3 个原因: 120 | 121 | - 第 1 版里的代码已经很陈旧了,书里面还有 Java.util.Vector; 122 | - 一些重构并非是与面向对象紧耦合在一起的; 123 | - Martin 认为 Java 是一种非常严格的面向对象编程语言,而第 1 版中所有的重构都是基于面向对象的,他想通过再版来说明每个程序员都可以用任何(编程)语言、在任何环境中、遵循书中提到的范例进行重构,这也是他决定再版《重构》的源动力。 124 | 125 | **Martin 认为重构的基本机制不会发生巨大转变,即使使用面向对象语言工作也是如此。**他觉得有一等函数很好,可以尝试许多函数式的理念,例如,写软件时大部分函数都具备引用透明性,这在面向对象系统和在函数式系统中都是好事。 126 | 127 | 所以 Martin 不像许多人那样在函数式编程和面向对象编程间画出明确界限,他认为两者有很多共同的地方,未必存在巨大差异。他鼓励程序员不要有门户之见,要用综合理念来解决问题。 128 | 129 | 对于最新版《重构》,Martin 认为有一个重构手法也许值得注意,拆分阶段(split phase)。早在几年前,当 Martin 和 Ken Beck 商谈拆分阶段的时候,Martin 第一次意识到这也是重构手法。 130 | 131 | 通过这种重构手法,Martin 将大量计算合理分为两个阶段,使用中间数据结构进行通信。其中一个例子是解析拆分阶段可有效地将 token 从解析中抽离出来,这样就得到了一个可可保存在存储器种的 token 流,可处理相关字符串、文本字符串。 132 | 133 | ![图片](https://mmbiz.qpic.cn/mmbiz_jpg/AsLbj5XgHj287ibQFhQzvWiaFdhoH7owT4LO9ohGYD8h9XL4bE7CT76Me1m8AfcbIvsXIgAibwZFBLLtF2gxlfkQQ/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 134 | 135 | Martin Fowler 136 | 137 | 而说到重构工具,Martin 和 Kent 做了很多年了,但他们从来没有意识到工具的重要性;当他们意识到这一点之后,他们感觉重构工具已经无处不在,他们认为这个内容非常重要,然后 Martin 就真把这些新内容加到新版中了。 138 | 139 | **重构的关键是理念:通过进行最细微的改变,然后将这些变化串联起来,这就是重构思维核心**。将一个大变化拆分为许多小变化,又在尽可能多进行细微变化的同时,不改变系统的整体表现,然后随时间推移,反复练习并思考如何进行拆分。Martin 在《重构 2》一书中说过,他通过重构框架思考问题的体验,尝试各种高效的重构手法并做出决定,最重要的就是通过实践进行重构。 140 | 141 | 他认为在尝试了不同的重构手法后,找出能重构手法生成理想序列,继而进行尝试识别出这种重构手法,而同样的逻辑也适用于更广泛的层面。 142 | 143 | 因此,他采用了 70 多个种可行的重构,并且把每个重构都介绍了一种经过验证的代码变换手法的动机和技术。就像软件开发的大多数工作一样,重构除了动手做,别无他法,必须反复实践,必须在项目中使用重构。 144 | 145 | Martin 始终希望,重构准则能帮助大家一步步修改自己的代码,减少了开发过程中的风险。 146 | 147 | **重构=编码** 148 | 149 | 在日新月异的 IT 技术世界里,不变的东西其实还是有的——重构。 150 | 151 | 从《重构》的英文原版引进国内,到现在已经过去 20 年了。Martin Fowler 这次对本书进行的重构,体现了近年来编程领域的一些思潮变化,既有设计,又永远有改进空间。 152 | 153 | 尽管时间是最强大的重构工具,连书里的示例语言都从 Java 变成 JavaScript 了,但书中的理念和实践的价值并没有随时间流逝。 154 | 155 | 重构早就成了软件开发从业者本能的一部分,每个 IDE 都内置了重构功能,每个程序员都定期重构自己的代码。 156 | 157 | 对于软件工程师来说,重构,并不是额外的工作,它就是编码本身。切实地读懂了《重构》的软件工程师,在能力上都会获得一个数量级的提升。 158 | -------------------------------------------------------------------------------- /header.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 101 | 366 |
367 |

368 | Awesome Lists 369 |

370 |

371 | 精而全的技术开发学习与实践资料索引 372 |

373 |
374 | 375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 |
385 |
386 |
387 |
388 |
389 |
390 | 391 | 392 |
393 |
394 |
-------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International 2 | Public License 3 | 4 | By exercising the Licensed Rights (defined below), You accept and agree 5 | to be bound by the terms and conditions of this Creative Commons 6 | Attribution-NonCommercial-ShareAlike 4.0 International Public License 7 | ("Public License"). To the extent this Public License may be 8 | interpreted as a contract, You are granted the Licensed Rights in 9 | consideration of Your acceptance of these terms and conditions, and the 10 | Licensor grants You such rights in consideration of benefits the 11 | Licensor receives from making the Licensed Material available under 12 | these terms and conditions. 13 | 14 | 15 | Section 1 -- Definitions. 16 | 17 | a. Adapted Material means material subject to Copyright and Similar 18 | Rights that is derived from or based upon the Licensed Material 19 | and in which the Licensed Material is translated, altered, 20 | arranged, transformed, or otherwise modified in a manner requiring 21 | permission under the Copyright and Similar Rights held by the 22 | Licensor. For purposes of this Public License, where the Licensed 23 | Material is a musical work, performance, or sound recording, 24 | Adapted Material is always produced where the Licensed Material is 25 | synched in timed relation with a moving image. 26 | 27 | b. Adapter's License means the license You apply to Your Copyright 28 | and Similar Rights in Your contributions to Adapted Material in 29 | accordance with the terms and conditions of this Public License. 30 | 31 | c. BY-NC-SA Compatible License means a license listed at 32 | creativecommons.org/compatiblelicenses, approved by Creative 33 | Commons as essentially the equivalent of this Public License. 34 | 35 | d. Copyright and Similar Rights means copyright and/or similar rights 36 | closely related to copyright including, without limitation, 37 | performance, broadcast, sound recording, and Sui Generis Database 38 | Rights, without regard to how the rights are labeled or 39 | categorized. For purposes of this Public License, the rights 40 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 41 | Rights. 42 | 43 | e. Effective Technological Measures means those measures that, in the 44 | absence of proper authority, may not be circumvented under laws 45 | fulfilling obligations under Article 11 of the WIPO Copyright 46 | Treaty adopted on December 20, 1996, and/or similar international 47 | agreements. 48 | 49 | f. Exceptions and Limitations means fair use, fair dealing, and/or 50 | any other exception or limitation to Copyright and Similar Rights 51 | that applies to Your use of the Licensed Material. 52 | 53 | g. License Elements means the license attributes listed in the name 54 | of a Creative Commons Public License. The License Elements of this 55 | Public License are Attribution, NonCommercial, and ShareAlike. 56 | 57 | h. Licensed Material means the artistic or literary work, database, 58 | or other material to which the Licensor applied this Public 59 | License. 60 | 61 | i. Licensed Rights means the rights granted to You subject to the 62 | terms and conditions of this Public License, which are limited to 63 | all Copyright and Similar Rights that apply to Your use of the 64 | Licensed Material and that the Licensor has authority to license. 65 | 66 | j. Licensor means the individual(s) or entity(ies) granting rights 67 | under this Public License. 68 | 69 | k. NonCommercial means not primarily intended for or directed towards 70 | commercial advantage or monetary compensation. For purposes of 71 | this Public License, the exchange of the Licensed Material for 72 | other material subject to Copyright and Similar Rights by digital 73 | file-sharing or similar means is NonCommercial provided there is 74 | no payment of monetary compensation in connection with the 75 | exchange. 76 | 77 | l. Share means to provide material to the public by any means or 78 | process that requires permission under the Licensed Rights, such 79 | as reproduction, public display, public performance, distribution, 80 | dissemination, communication, or importation, and to make material 81 | available to the public including in ways that members of the 82 | public may access the material from a place and at a time 83 | individually chosen by them. 84 | 85 | m. Sui Generis Database Rights means rights other than copyright 86 | resulting from Directive 96/9/EC of the European Parliament and of 87 | the Council of 11 March 1996 on the legal protection of databases, 88 | as amended and/or succeeded, as well as other essentially 89 | equivalent rights anywhere in the world. 90 | 91 | n. You means the individual or entity exercising the Licensed Rights 92 | under this Public License. Your has a corresponding meaning. 93 | 94 | 95 | Section 2 -- Scope. 96 | 97 | a. License grant. 98 | 99 | 1. Subject to the terms and conditions of this Public License, 100 | the Licensor hereby grants You a worldwide, royalty-free, 101 | non-sublicensable, non-exclusive, irrevocable license to 102 | exercise the Licensed Rights in the Licensed Material to: 103 | 104 | a. reproduce and Share the Licensed Material, in whole or 105 | in part, for NonCommercial purposes only; and 106 | 107 | b. produce, reproduce, and Share Adapted Material for 108 | NonCommercial purposes only. 109 | 110 | 2. Exceptions and Limitations. For the avoidance of doubt, where 111 | Exceptions and Limitations apply to Your use, this Public 112 | License does not apply, and You do not need to comply with 113 | its terms and conditions. 114 | 115 | 3. Term. The term of this Public License is specified in Section 116 | 6(a). 117 | 118 | 4. Media and formats; technical modifications allowed. The 119 | Licensor authorizes You to exercise the Licensed Rights in 120 | all media and formats whether now known or hereafter created, 121 | and to make technical modifications necessary to do so. The 122 | Licensor waives and/or agrees not to assert any right or 123 | authority to forbid You from making technical modifications 124 | necessary to exercise the Licensed Rights, including 125 | technical modifications necessary to circumvent Effective 126 | Technological Measures. For purposes of this Public License, 127 | simply making modifications authorized by this Section 2(a) 128 | (4) never produces Adapted Material. 129 | 130 | 5. Downstream recipients. 131 | 132 | a. Offer from the Licensor -- Licensed Material. Every 133 | recipient of the Licensed Material automatically 134 | receives an offer from the Licensor to exercise the 135 | Licensed Rights under the terms and conditions of this 136 | Public License. 137 | 138 | b. Additional offer from the Licensor -- Adapted Material. 139 | Every recipient of Adapted Material from You 140 | automatically receives an offer from the Licensor to 141 | exercise the Licensed Rights in the Adapted Material 142 | under the conditions of the Adapter's License You apply. 143 | 144 | c. No downstream restrictions. You may not offer or impose 145 | any additional or different terms or conditions on, or 146 | apply any Effective Technological Measures to, the 147 | Licensed Material if doing so restricts exercise of the 148 | Licensed Rights by any recipient of the Licensed 149 | Material. 150 | 151 | 6. No endorsement. Nothing in this Public License constitutes or 152 | may be construed as permission to assert or imply that You 153 | are, or that Your use of the Licensed Material is, connected 154 | with, or sponsored, endorsed, or granted official status by, 155 | the Licensor or others designated to receive attribution as 156 | provided in Section 3(a)(1)(A)(i). 157 | 158 | b. Other rights. 159 | 160 | 1. Moral rights, such as the right of integrity, are not 161 | licensed under this Public License, nor are publicity, 162 | privacy, and/or other similar personality rights; however, to 163 | the extent possible, the Licensor waives and/or agrees not to 164 | assert any such rights held by the Licensor to the limited 165 | extent necessary to allow You to exercise the Licensed 166 | Rights, but not otherwise. 167 | 168 | 2. Patent and trademark rights are not licensed under this 169 | Public License. 170 | 171 | 3. To the extent possible, the Licensor waives any right to 172 | collect royalties from You for the exercise of the Licensed 173 | Rights, whether directly or through a collecting society 174 | under any voluntary or waivable statutory or compulsory 175 | licensing scheme. In all other cases the Licensor expressly 176 | reserves any right to collect such royalties, including when 177 | the Licensed Material is used other than for NonCommercial 178 | purposes. 179 | 180 | 181 | Section 3 -- License Conditions. 182 | 183 | Your exercise of the Licensed Rights is expressly made subject to the 184 | following conditions. 185 | 186 | a. Attribution. 187 | 188 | 1. If You Share the Licensed Material (including in modified 189 | form), You must: 190 | 191 | a. retain the following if it is supplied by the Licensor 192 | with the Licensed Material: 193 | 194 | i. identification of the creator(s) of the Licensed 195 | Material and any others designated to receive 196 | attribution, in any reasonable manner requested by 197 | the Licensor (including by pseudonym if 198 | designated); 199 | 200 | ii. a copyright notice; 201 | 202 | iii. a notice that refers to this Public License; 203 | 204 | iv. a notice that refers to the disclaimer of 205 | warranties; 206 | 207 | v. a URI or hyperlink to the Licensed Material to the 208 | extent reasonably practicable; 209 | 210 | b. indicate if You modified the Licensed Material and 211 | retain an indication of any previous modifications; and 212 | 213 | c. indicate the Licensed Material is licensed under this 214 | Public License, and include the text of, or the URI or 215 | hyperlink to, this Public License. 216 | 217 | 2. You may satisfy the conditions in Section 3(a)(1) in any 218 | reasonable manner based on the medium, means, and context in 219 | which You Share the Licensed Material. For example, it may be 220 | reasonable to satisfy the conditions by providing a URI or 221 | hyperlink to a resource that includes the required 222 | information. 223 | 3. If requested by the Licensor, You must remove any of the 224 | information required by Section 3(a)(1)(A) to the extent 225 | reasonably practicable. 226 | 227 | b. ShareAlike. 228 | 229 | In addition to the conditions in Section 3(a), if You Share 230 | Adapted Material You produce, the following conditions also apply. 231 | 232 | 1. The Adapter's License You apply must be a Creative Commons 233 | license with the same License Elements, this version or 234 | later, or a BY-NC-SA Compatible License. 235 | 236 | 2. You must include the text of, or the URI or hyperlink to, the 237 | Adapter's License You apply. You may satisfy this condition 238 | in any reasonable manner based on the medium, means, and 239 | context in which You Share Adapted Material. 240 | 241 | 3. You may not offer or impose any additional or different terms 242 | or conditions on, or apply any Effective Technological 243 | Measures to, Adapted Material that restrict exercise of the 244 | rights granted under the Adapter's License You apply. 245 | 246 | 247 | Section 4 -- Sui Generis Database Rights. 248 | 249 | Where the Licensed Rights include Sui Generis Database Rights that 250 | apply to Your use of the Licensed Material: 251 | 252 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 253 | to extract, reuse, reproduce, and Share all or a substantial 254 | portion of the contents of the database for NonCommercial purposes 255 | only; 256 | 257 | b. if You include all or a substantial portion of the database 258 | contents in a database in which You have Sui Generis Database 259 | Rights, then the database in which You have Sui Generis Database 260 | Rights (but not its individual contents) is Adapted Material, 261 | including for purposes of Section 3(b); and 262 | 263 | c. You must comply with the conditions in Section 3(a) if You Share 264 | all or a substantial portion of the contents of the database. 265 | 266 | For the avoidance of doubt, this Section 4 supplements and does not 267 | replace Your obligations under this Public License where the Licensed 268 | Rights include other Copyright and Similar Rights. 269 | 270 | 271 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 272 | 273 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 274 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 275 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 276 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 277 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 278 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 279 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 280 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 281 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 282 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 283 | 284 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 285 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 286 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 287 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 288 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 289 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 290 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 291 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 292 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 293 | 294 | c. The disclaimer of warranties and limitation of liability provided 295 | above shall be interpreted in a manner that, to the extent 296 | possible, most closely approximates an absolute disclaimer and 297 | waiver of all liability. 298 | 299 | 300 | Section 6 -- Term and Termination. 301 | 302 | a. This Public License applies for the term of the Copyright and 303 | Similar Rights licensed here. However, if You fail to comply with 304 | this Public License, then Your rights under this Public License 305 | terminate automatically. 306 | 307 | b. Where Your right to use the Licensed Material has terminated under 308 | Section 6(a), it reinstates: 309 | 310 | 1. automatically as of the date the violation is cured, provided 311 | it is cured within 30 days of Your discovery of the 312 | violation; or 313 | 314 | 2. upon express reinstatement by the Licensor. 315 | 316 | For the avoidance of doubt, this Section 6(b) does not affect any 317 | right the Licensor may have to seek remedies for Your violations 318 | of this Public License. 319 | 320 | c. For the avoidance of doubt, the Licensor may also offer the 321 | 322 | 323 | Licensed Material under separate terms or conditions or stop 324 | distributing the Licensed Material at any time; however, doing so 325 | will not terminate this Public License. 326 | 327 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 328 | License. 329 | 330 | 331 | Section 7 -- Other Terms and Conditions. 332 | 333 | a. The Licensor shall not be bound by any additional or different 334 | terms or conditions communicated by You unless expressly agreed. 335 | 336 | b. Any arrangements, understandings, or agreements regarding the 337 | Licensed Material not stated herein are separate from and 338 | independent of the terms and conditions of this Public License. 339 | 340 | 341 | Section 8 -- Interpretation. 342 | 343 | a. For the avoidance of doubt, this Public License does not, and 344 | shall not be interpreted to, reduce, limit, restrict, or impose 345 | conditions on any use of the Licensed Material that could lawfully 346 | be made without permission under this Public License. 347 | 348 | b. To the extent possible, if any provision of this Public License is 349 | deemed unenforceable, it shall be automatically reformed to the 350 | minimum extent necessary to make it enforceable. If the provision 351 | cannot be reformed, it shall be severed from this Public License 352 | without affecting the enforceability of the remaining terms and 353 | conditions. 354 | 355 | c. No term or condition of this Public License will be waived and no 356 | failure to comply consented to unless expressly agreed to by the 357 | Licensor. 358 | 359 | d. Nothing in this Public License constitutes or may be interpreted 360 | as a limitation upon, or waiver of, any privileges and immunities 361 | that apply to the Licensor or You, including from the legal 362 | processes of any jurisdiction or authority. -------------------------------------------------------------------------------- /01~国内大厂/阿里巴巴/淘宝/99~参考资料/2012~赵超~淘宝技术发展.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://kb.cnblogs.com/page/132724/) 2 | 3 | **一、引言** 4 | 5 | **光棍节的狂欢** 6 | 7 | “时间到,开抢!”坐在电脑前早已等待多时的小美一看时间已到 2011 年 11 月 11 日零时,便迫不及待地投身于淘宝商城一年一度的大型网购促销活动 —— “淘宝双 11 购物狂欢节”。小美打开早已收藏好的宝贝 —— 某品牌的雪地靴,飞快的点击购买,付款,一回头发现 3000 双靴子已被抢购一空。 8 | 9 | 小美跳起来,大叫一声“欧耶!” 10 | 11 | 小美不知道,就在 11 日零点过后的这一分钟内,全国有 342 万人和她一起涌入淘宝商城。当然,她更不知道,此时此刻,在淘宝杭州的一间办公室里,灯火通明,这里是“战时指挥部”,淘宝技术部的一群工程师,正在紧盯着网站的流量和交易数据。白板上是他们刚刚下的注,赌谁能最准确地猜中流量峰值和全天的交易总额。他们的手边放着充足的食物和各类提神的饮料。 12 | 13 | 一阵急促的电话声响起来,是前线部门询问数据的,工程师大声报着:“第 1 分钟,进入淘宝商城的会员有 342 万”。过一会工程师主动拿起电话:“交易额超过 1 亿了,现在是第 8 分钟。”接下来,“第 21 分钟,刚突破 2 亿”。“第 32 分钟,3 亿了”。“第 1 个小时,4.39 亿”。这些数据随后出现在微博上,引起一片惊呼。 14 | 15 | “完蛋了!”突然有人大喝一声,所有的眼睛都紧张的盯着他,只见他挠挠头,嘿嘿的笑道“我赌的少了,20 亿轻松就能过了,我再加 5 亿”,他跑去白板边上把自己的赌注擦去,写上 25,接下来有人写上 28,有人写上 30,有人跑到微博上开下盘口,同事们纷纷转载下注。接下来的这 24 个小时,战时指挥部的工程师们都不能休息,他们盯着网站的各种监控指标,适时的调整机器和增减功能。顶住第一波高峰之后,这些人开始忙里偷闲的给自己买东西,大家互相交流着哪家买的移动硬盘靠谱,哪家衣服适合自己的女朋友,不时的有人哀嚎宝贝被人抢了、信用卡额度不够了。同时,旁边白板上的赌注越下越大。 16 | 17 | ![img](https://pic001.cnblogs.com/images/2012/1/2012022511094742.jpg) 18 | 19 | 11 月 11 日,这个棍子最多的日子被网民自我调侃的变成了一个节日 —— “光棍节”。而淘宝网又用疯狂的折扣促销给它赋予了另外一个意义 —— “购物狂欢节”。2011 年 11 月 11 日这一天,淘宝商城与淘宝网交易额之和突破 52 亿,这个数字是“购物天堂”香港一天零售总额 8.5 亿的 6 倍。 20 | 21 | 网民感受到的是疯抢的喜悦,而网站的技术人员感受到的却是“压力山大”。就如同你家办酒席,宴请左邻右舍,这个办起来容易。倘若宴请十里八乡所有的人,吃饭的人自然开心,但却不是一般人家能够办得起来的。能办得起来如此盛宴者,需要强大的财力物力、组织能力、技术实力(例如做这么多菜,你的炒锅一定要是“分布式的”、“可复制的”、“可扩展的”,洗菜切菜要有“工作流引擎”,上菜的路径要用图论来计算出来,甚至连厨房的下水道都要重新设计)。 22 | 23 | 淘宝能够举办如此盛宴,网站的技术实力可见一斑。淘宝网拥有全国最大的 Hadoop 分布式计算集群之一,日新增数据 50TB,有 40PB 海量数据存储。分布在全国各地 80 多个节点的 CDN 网络,支持的流量超过 800Gbps。淘宝的搜索引擎能够对数十亿的商品数据进行实时搜索,另外还拥有自主研发的文件存储系统和缓存系统,以及 Java 中间件和消息中间件系统,这一切组成了一个庞大的电子商务操作系统。另外从商业数据上来看,Amazon 的财报显示 2011 年完成了大约 480 亿美金的交易额,eBay 2011 年财报全年完成了大约 600 亿美金的交易额(不包括其独立的汽车交易平台)。不管从交易额、商品数量、同比增速等指标上看,淘宝网均远超于此,是目前全球最大的电子商务平台。(由于淘宝非上市公司,未公布 2011 年业绩,以上内容来自淘宝网技术副总裁[@\_行癫](http://weibo.com/u/1419403675) 的微博) 24 | 25 | 以上这些技术数据可能已经让一些同学产生不适的感觉,为了让更多的人读懂这本书,我们从技术的角度来看,小美访问淘宝网的时候,网站上发生了什么事情。参考资料:《[技术普及帖:你刚才在淘宝上买了一件东西](http://kb.cnblogs.com/page/132716/)》,来自南京邮电大学孙放同学。 26 | 27 | 为了有个更直观的对比,我们说一个同行,他在 2011 年光棍节之前做促销,流量上去之后,达到 12Gbps(他们有这么大的流量,老板很高兴,在微博上面说了这个数据),这时候流量达到了极限,网站几乎挂掉,用户无法下订单。而淘宝网光棍节当天网络的流量最高达到 800 多 Gbps,带给各家银行和快递公司的流量也让他们压力山大,如临大敌(后来,他们以能够撑住淘宝带来的流量为荣而到处宣传)。另外如果你在网上购买过火车票的话,更能体会到网站能支持多大的流量有多重要。但这不是一朝一夕做出来的,也不是有钱就能办到的。 28 | 29 | 以上对比的这些网站,也许读者很容易就猜到是哪一家,这里拿出来作对比,绝对没有嘲笑人家的意思,采用通常的网站技术方案,能做到这种程度已经不错了。任何网站的发展都不是一蹴而就的,在什么样的阶段采用什么样的技术。在发展的过程中网站会遇到各种各样的问题和业务带来的压力,正是这些原因才推动着技术的进步和发展,而技术的发展又会反过来促进业务的更大提升。二者互为因果,相互促进。如今淘宝网的流量已经是全球排名第 12、国内排名第 3(美国的 eBay 全球排名 23,国内前两名是百度和腾讯)。淘宝网的系统也从使用一台服务器,到采用万台以上的服务器。本书就为大家描述淘宝网在整个发展过程中,所有的主动和被动的技术变革的前因后果,这由很多有趣的故事组成。 30 | 31 | 正如同很多人或组织成功了以后,就会为自己的出身编造一个美丽的传说。淘宝网的出身,网上也有非常多的传说,下面我们就从它的出生开始讲起。 32 | 33 | **二、个人网站** 34 | 35 | 2003 年 4 月 7 日,马云,在杭州,成立了一个神秘的组织。他叫来十位员工,要他们签了一份协议,这份协议要求他们立刻离开阿里巴巴,去做一个神秘的项目。这个项目要求绝对保密,老马戏称“连说梦话被老婆听到都不行,谁要是透漏出去,我将追杀到天涯海角”。这份协议是英文版的,匆忙之间,大多数人根本来不及看懂,但出于对老马的信任,都卷起铺盖离开了阿里巴巴。 36 | 37 | 他们去了一个神秘的据点 —— 湖畔花园小区的一套未装修的房子里,房子的主人是马云。这伙人刚进去的时候,马云给他们布置了一个任务,就是在最短的时间内做出一个个人对个人(C2C)的商品交易的网站。现在出一个问题考考读者,看你适不适合做淘宝的创业团队。亲,要是让你来做,你怎么做? 38 | 39 | 在说出这个答案之前,容我先卖个关子,介绍一下这个创业团队的成员:三个开发工程师(虚竹、三丰、多隆)、一个 UED(二当家)、三个运营(小宝、阿珂、破天)、一个经理(财神)、还有就是马云和他的秘书。当时对整个项目组来说压力最大的就是时间,怎么在最短的时间内把一个从来就没有的网站从零开始建立起来?了解淘宝历史的人知道淘宝是在 2003 年 5 月 10 日上线的,这之间只有一个月。要是你在这个团队里,你怎么做?我们的答案就是:买一个来。 40 | 41 | 买一个网站显然比做一个网站要省事一些,但是他们的梦想可不是做一个小网站而已,要做大,就不是随便买个就行的,要有比较低的维护成本,要能够方便的扩展和二次开发。那接下来就是第二个问题:买一个什么样的网站?答案是:轻量一点的,简单一点的,于是买了这样一个架构的网站:LAMP(Linux+Apache+MySQL+PHP)。这个直到现在还是一个很常用的网站架构模型。这种架构的优点是:无需编译,发布快速,PHP 功能强大,能做从页面渲染到数据访问所有的事情,而且用到的技术都是开源的,免费。 42 | 43 | 当时我们是从一个美国人那里买来的一个网站系统,这个系统的名字叫做 PHPAuction(他们的官方网站 http://www.phpauction.net,这个名字很直白,一眼就看出来这个系统是用什么语言做的、是干什么用的),PHPAuction有好几个版本,我们买的是最高版的,功能比较多,而且最重要的是对方提供了源代码。最高版比较贵,花了我们 2000 美金(貌似现在降价了,只要 946 美元)。买来之后不是直接就能用的,需要很多本地化的修改,例如页面模板改的漂亮一点,页头页脚加上自己的站点简介等,其中最有技术含量的是对数据库进行了一个修改。原来是从一个数据库进行所有的读写操作,拿过来之后多隆把它给拆分成一个主库、两个从库,读写分离。这么做的好处有几点:存储容量增加了,有了备份,使得安全性增加了,读写分离使得读写效率提升了。这样整个系统的架构就如下图所示: 44 | 45 | ![img](https://pic001.cnblogs.com/images/2012/1/2012022511225985.jpg) 46 | 47 | 其中 Pear DB 是一个 PHP 模块,负责数据访问层。另外也用开源的论坛系统 PHPBB(http://www.phpbbchina.com )搭建了一个小的论坛社区,虚竹负责机器采购、配置、架设等,三丰和多隆负责编码,他们把交易系统和论坛系统的用户信息打通,给运营人员开发出后台管理(admin 系统)的功能,把交易类型从只有拍卖这一种增加为拍卖、一口价、求购商品、海报商品(意思是还没推出的商品,先挂个海报出来)这四种。(PHPAuction 只有拍卖的交易,Auction 即拍卖的意思。@\_行癫在微博中提到:今天 eBay 所有交易中拍卖交易仍然占了 40%,而在中国,此种模式在淘宝几乎从一开始就未能占据优势,如今在主流的交易中几乎可以忽略不计。背后的原因一直令人费解。我大致可以给出其中一种解释,eBay 基本在发达国家展开业务,制造业外包后,电子商务的基本群体大多只能表现为零散的个体间交易。) 48 | 49 | 在经历了另外一些有趣的事情之后(这些有趣的事情包括“淘宝”这个名字的由来,[员工花名的由来](http://www.neweekly.com.cn/index/newsview.php?id=1263)等等,由于本书主要描述技术方面的故事,对这些有兴趣的可以去网上找),网站开始上线运行了。 50 | 51 | ![img](https://pic001.cnblogs.com/images/2012/1/2012022511260456.jpg) 52 | 53 | 在接下来的大半年时间里,这个网站迅速显示出了它的生机。这里有必要提一下当时的市场环境,非典(SARS)的肆虐使得大家都不敢出门,尤其是去商场之类人多的地方。另外在神州大地上最早出现的 C2C 网站易趣也正忙的不亦乐乎,2002 年 3 月,eBay 以 3000 万美元收购了易趣公司 33% 的股份,2003 年 6 月以 1.5 亿美元收购了易趣公司剩余 67% 的股份。当时淘宝网允许买卖双方留下联系方式,允许同城交易,整个操作过程简单轻松。而 eBay 为了收取交易佣金,是禁止这么做的,这必然增加了交易过程的难度。而且 eBay 为了全球统一,把易趣原来的系统替换成了美国 eBay 的系统,用户体验一下子全变了,操作起来非常麻烦,这等于是把积累的用户拱手送给了淘宝。为了不引起 eBay 的注意,淘宝网在 2003 年里一直声称自己是一个“个人网站”。由于这个创业团队强大的市场开拓和运营能力,淘宝网发展的非常迅猛,2003 年底就吸引了注册用户 XXX,最高每日 31 万 PV,从 5 月到年底成交额 4000 万。这没有引起 eBay 的注意,却引起了阿里巴巴内部很多员工的注意,他们觉得这个网站以后会成为阿里巴巴强劲的对手。甚至有人在内网发帖,忠告管理层要警惕这个刚刚起步的网站,但管理层似乎无动于衷。(这个团队的保密工作做的真好) 54 | 55 | 在市场和运营的后方,淘宝网的技术团队也在快速的做着系统的改进和创新。这里还有个有趣的故事,eBay 和易趣早期都有员工在论坛上响应用户的需求,eBay 的论坛用粉红色背景来区分员工的发言,易趣的员工在论坛上昵称都选各种豆豆,例如黄豆豆、蚕豆豆等。淘宝在讨论运营策略的时候提到这个问题,要求所有的员工都去论坛上回答用户的问题。最早回答问题的任务落在小宝头上,那我们用什么名字好呢?“淘淘”?“宝宝”?小宝都不满意,太女性化了。讨论了很久之后,小宝灵光乍现,干脆取个名字叫“小宝”吧,小宝带七个老婆来开店,迎接各位客官,很有故事性。于是很多武侠小说中的人物开始在论坛中行侠仗义,这些昵称下面标志着“淘宝店小二”,他们回答着各种各样的问题,快速响应着用户的各种需求。如果是技术上能解决的,几个人商量一下,马上就开发、测试、发布上线。反过来对比一下,易趣被 eBay 收购之后,系统更换成了全球通用的版本,响应用户的一个需求需要层层审批,反应速度自然慢了下来。 56 | 57 | 当时淘宝第一个版本的系统里面已经包含了商品发布、管理、搜索、商品详情、出价购买、评价投诉、我的淘宝这些功能(现在主流程中也是这些模块。在 2003 年 10 月增加了一个功能节点:“安全交易”,这个是支付宝的雏形)。随着用户需求和流量的不断增长,系统上面做了很多的日常改进,服务器由最初的一台变成了三台,一台负责发送 email、一台负责运行数据库、一台负责运行 Web App。过一段时间之后,商品搜索的功能占用数据库资源太大了(用 like 搜索的,很慢),又从阿里巴巴中文站搬过来他们的搜索引擎 iSearch,起初 iSearch 索引的文件放在硬盘上,随着数据量的增长,又采购了 NetApp 服务器放置 iSearch。 58 | 59 | 如此快节奏的工作,其实大家都累得不行,有人就提议大家随时随地的锻炼身体,可是外面 SARS 横行,在一个一百多方的房子里,怎么锻炼呢?高挑美女阿珂提议大家练习提臀操,这个建议遭到男士的一致反对,后来虚竹就教大家练习倒立,这个大家都能接受。于是这个倒立的传统一直延续至今,和花名文化、武侠文化一并传承了下来。 60 | 61 | 随着访问量和数据量的飞速上涨,问题很快就出来了,第一个问题出现在数据库上。MySQL 当时是第 4 版的,我们用的是默认的存储引擎 MyISAM,这种类型读数据的时候会把表锁住(我们知道 Oracle 在写数据的时候会有行锁,读数据的时候是没有的),尤其是主库往从库上面写数据的时候,会对主库产生大量的读操作,使得主库性能急剧下降。这样在高访问量的时候,数据库撑不住了。另外,当年的 MySQL 不比如今的 MySQL,在数据的容量和安全性方面也有很多先天的不足(和 Oracle 相比)。 62 | 63 | 三、**Oracle/支付宝/旺旺** 64 | 65 | 淘宝网作为个人网站发展的时间其实并不长,由于它太引人注目了,马云在 2003 年 7 月就宣布了这个是阿里巴巴旗下的网站,随后在市场上展开了很成功的运作。最著名的就是利用中小网站来做广告,突围 eBay 在门户网站上对淘宝的广告封锁。上网比较早的人应该还记得那些在右下角的弹窗和网站腰封上一闪一闪的广告。市场部那位到处花钱买广告的家伙,太能花钱了,一出手就是几百万,他被我们称为“大少爷”。 66 | 67 | “大少爷”们做的广告,带来的就是迅速上涨的流量和交易量。在 2003 年底,MySQL 已经撑不住了,技术的替代方案非常简单,就是换成 Oracle。换 Oracle 的原因除了它容量大、稳定、安全、性能高之外,还有人才方面的原因。在 2003 年的时候,阿里巴巴已经有一支很强大的 DBA 团队了,有冯春培、汪海(七公)这样的人物,后来还有冯大辉(@fenng)、陈吉平(拖雷)。这样的人物牛到什么程度呢?Oracle 给全球的技术专家颁发一些头衔,其中最高级别的叫 ACE(就是扑克牌的“尖儿”,够大的吧),被授予这个头衔的人目前全球也只有 300 多名(名单在这里: http://apex.oracle.com/pls/otn/f?p=19297:3 ),当年全球只有十几名。有如此强大的技术后盾,把 MySQL 换成 Oracle 是顺理成章的事情。 68 | 69 | 但更换数据库不是只换个库就可以的,访问方式,SQL 语法都要跟着变,最重要的一点是,Oracle 并发访问能力之所以如此强大,有一个关键性的设计 —— 连接池。但对于 PHP 语言来说它是放在 Apache 上的,每一个请求都会对数据库产生一个连接,它没有连接池这种功能(Java 语言有 Servlet 容器,可以存放连接池)。那如何是好呢?这帮人打探到 eBay 在 PHP 下面用了一个连接池的工具,是 BEA 卖给他们的。我们知道 BEA 的东西都很贵,我们买不起,于是多隆在网上寻寻觅觅,找到一个开源的连接池代理服务 SQLRelay( [http://sourceforge.jp/projects/freshmeat_sqlrelay](http://sourceforge.jp/projects/freshmeat_sqlrelay/) ),这个东西能够提供连接池的功能,多隆对它进行了一些功能改进之后就拿来用了。这样系统的架构就变成了如下的样子: 70 | 71 | ![img](https://pic003.cnblogs.com/2012/1/201202/2012022510245823.jpg) 72 | 73 | 数据一开始是放在本地的,DBA 们对 Oracle 做调优的工作,也对 SQL 进行调优。后来数据量变大了,本地存储不行了。买了 NAS(Network Attached Storage:网络附属存储),NetApp 的 NAS 存储作为了数据库的存储设备,加上 Oracle RAC(Real Application Clusters,实时应用集群)来实现负载均衡。七公说这实际上是走了一段弯路,NAS 的 NFS(Network File System)协议传输的延迟很严重,但那时侯不懂。后来采购了 Dell 和 EMC 合作的 SAN 低端存储,性能一下子提升了 10 几倍,这才比较稳定了。再往后来数据量更大了,存储的节点一拆二、二拆四,RAC 又出问题了。这才踏上了购买小型机的道路。在那段不稳定的时间里,七公曾经在机房住了 5 天 5 夜。 74 | 75 | 替换完数据库,时间到了 2004 年春天,俗话说“春宵一刻值千金”,但这些人的春宵却不太好过了。他们在把数据的连接放在 SQLRelay 之后就噩梦不断,这个代理服务经常会死锁,如同之前的 MySQL 死锁一样。虽然多隆做了很多修改,但当时那个版本内部处理的逻辑不对,问题很多,唯一解决的办法就是“重启”它的服务。这在白天还好,连接上机房的服务器,把进程杀掉,然后开启就可以了,但是最痛苦的是它在晚上也要死掉,于是工程师们不得不 24 小时开着手机,一旦收到“ SQLRelay 进程挂起”的短信,就从春梦中醒来,打开电脑,连上机房,重启服务。后来干脆每天睡觉之前先重启一下。做这事最多的据说是三丰,他现在是淘宝网的总裁。现在我们知道,任何牛 B 的人物,都有一段苦 B 的经历。 76 | 77 | 微博上有人说“好的架构是进化来的,不是设计来的”。的确如此,其实还可以再加上一句“好的功能也是进化来的,不是设计来的”。在架构的进化过程中,业务的进化也非常迅猛。最早的时候,买家打钱给卖家都是通过银行转账汇款,有些骗子收了钱却不发货,这是一个很严重的问题。然后这伙人研究了 PayPal 的支付方式,发现也不能解决问题。后来这几个聪明的脑袋又想到了“担保交易”这种第三方托管资金的办法。于是在 2003 年 10 月,淘宝网上面上线了一个功能,叫做“安全交易”,卖家选择支持这种功能的话,买家会把钱交给淘宝网,等他收到货之后,淘宝网再把钱给卖家。这就是现在的支付宝,在前两天(2012.2.21)年会上,支付宝公布 2011 年的交易笔数已经是 PayPal 的两倍。这个划时代的创新,其实就是在不断的思索过程中的一个灵光乍现。 78 | 79 | 当时开发“安全交易”功能的是茅十八和他的徒弟苗人凤(茅十八开发到一半去上海读 MBA 去了,苗人凤现在是支付宝的首席业务架构师),开发跟银行网关对接的功能的是多隆。当时多数银行的网站已经支持在线支付了,但多隆告诉我,他们的网关五花八门,用什么技术的都有,必须一家一家去接。而且他们不保证用户付钱了就一定扣款成功、不保证扣款成功了就一定通知淘宝、不保证通知淘宝了就一定能通知到、不保证通知到了就不重复通知。这害苦了苗人凤,他必须每天手工核对账单,对不齐的话就一定是有人的钱找不到地方了,少一分钱都睡不着觉。另外他为了测试这些功能,去杭州所有的银行都办理了一张银行卡。一堆银行卡摆在桌子上,不知道的人还以为这个家伙一定很有钱,其实里面都只是十块八块的。现在我们再一次知道,任何牛 B 的人物,都必须有一段苦 B 的经历。 80 | 81 | 有人说淘宝打败易趣(eBay 中国)是靠免费,其实这只是原因之一。如果说和易趣过招第一招是免费的话,这让用户没有门槛就愿意来,那第二招就是“安全支付”,这让用户放心付款,不必担心被骗。在武侠小说中真正的高手飞花摘叶即可伤人,他们不会局限于一招两招,一旦出手,连绵不绝。而淘宝的第三招就是“旺旺”,让用户在线沟通。其实淘宝旺旺也不是自己生出来的,是从阿里巴巴的“贸易通”复制过来的。从 2004 年 3 月开始,“叮咚、叮咚”这个经典的声音就回荡在所有淘宝买家和卖家的耳边,“亲,包邮不?”,“亲,把零头去掉行不?”,这亲切的砍价声造就了后来的“淘宝体”。有人说中国人就是爱砍价,虽然笔者体会不到砍价成功后有多少成就感,但每次我去菜市场,看到大妈们砍价砍得天昏地暗,那满足的劲头堪比捡到了钱,我就深刻的理解了淘宝旺旺在交易过程中的价值。我猜 eBay 也体会不到砍价的乐趣,他们一直不允许买卖双方在线聊天,收购了 skype 之后也没有用到电子商务中去。 82 | 83 | 旺旺在推出来没多久,就惹了一个法律方面的麻烦。有个做雪饼的厂家找上门来,说我们侵权了,他们家的雪饼很好吃,牛奶也做得不错,我们都很喜欢。然后我们就在旺旺的前面加了两个字,叫做“淘宝旺旺”。在那个野蛮生长的阶段,其实很多产品都是想到什么就做什么,例如我们还搭建过一个聊天室,但似乎淘宝网不是一个闲聊的地方,这个聊天室门可罗雀,一段时间后就关闭掉了。 84 | 85 | SQLRelay 的问题搞得三丰他们很难睡个囫囵觉,那一年开半年会的时候,公司特地给三丰颁了一个奖项,对他表示深切的安慰。但不能总这样啊,于是,2004 年的上半年开始,整个网站就开始了一个脱胎换骨的手术。 86 | 87 | **四、淘宝技术发展(Java 时代:脱胎换骨)** 88 | 89 | 我的师父黄裳@岳旭强曾经说过,“好的架构图充满美感”,一个架构好不好,从审美的角度就能看得出来。后来我看了很多系统的架构,发现这个言论基本成立。那么反观淘宝前面的两个版本的架构,你看哪个比较美? 90 | 91 | ![img](https://pic003.cnblogs.com/2012/1/201204/2012040311224715.jpg) 92 | 93 | ![img](https://pic003.cnblogs.com/2012/1/201204/2012040311231311.jpg) 94 | 95 | 显然第一个比较好看,后面那个显得头重脚轻,这也注定了它不是一个稳定的版本,只存活了不到半年的时间。2004 年初,SQL Relay 的问题解决不了,数据库必须要用 Oracle,那从哪里动刀?只有换开发语言了。换什么语言好呢?Java。Java 是当时最成熟的网站开发语言,它有比较良好的企业开发框架,被世界上主流的大规模网站普遍采用,另外有 Java 开发经验的人才也比较多,后续维护成本会比较低。 96 | 97 | 到 2004 年上半年,淘宝网已经运行了一年的时间,这一年积累了大量的用户,也快速的开发了很多功能,当时这个网站已经很庞大了,而且新的需求还在源源不断的过来。把一个庞大的网站的开发语言换掉,无异于脱胎换骨,在换的过程中还不能拖慢业务的发展,这无异于边换边跑,对时间和技术能力的要求都非常高。做这样的手术,需要请第一流的专家来主刀。现在再考一下读者,如果你在这个创业团队里面,请什么样的人来做这事?我们的答案是请 Sun 的人。没错,就是创造 Java 语言的那家公司,世界上没有比他们更懂 Java 的了。除此之外,还有一个不为人知的原因,……(此处和谐掉 200 字,完整版见 aliway) 98 | 99 | 这帮 Sun 的工程师的确很强大,在笔者 2004 年底来淘宝的时候,他们还在,有幸跟他们共事了几个月。现在摆在他们面前的问题是用什么办法把一个庞大的网站从 PHP 语言迁移到 Java?而且要求在迁移的过程中,不停止服务,原来系统的 bugfix 和功能改进不受影响。亲,你要是架构师,你怎么做?有人的答案是写一个翻译器,如同把中文翻译成英文一样,自动翻译。我只能说你这个想法太超前了,换个说法就是“too simple, sometimes naive”。当时没有,现在也没有人能做到。他们的大致方案是给业务分模块,一个模块一个模块的替换。如用户模块,老的 member.taobao.com 继续维护,不添加新功能,新的功能先在新的模块上开发,跟老的共用一个数据库,开发完毕之后放到不同的应用集群上,另开个域名 member1.taobao.com,同时替换老的功能,替换一个,把老的模块上的功能关闭一个,逐渐的把用户引导到 member1.taobao.com,等所有功能都替换完毕之后,关闭 member.taobao.com。后来很长时间里面都是在用 member1 这样奇怪的域名,两年后有另外一家互联网公司开始做电子商务了,我们发现他们的域名也叫 member1.xx.com、auction1.xx.com…… 100 | 101 | 说了开发模式,再说说用到的 Java MVC 框架,当时的 Struts 1.x 是用的比较多的框架,但是用过 WebWork 和 Struts 2 的同学可能知道,Struts 1.x 在多人协作方面有很多致命的弱点,由于没有一个轻量框架作为基础,因此很难扩展,这样架构师对于基础功能和全局功能的控制就很难做到。而阿里巴巴的 18 个创始人之中,有个架构师,在 Jakarta Turbine 的基础上,做了很多扩展,打造了一个阿里巴巴自己用的 MVC 框架 WebX (http://www.openwebx.org/docs/Webx3_Guide_Book.html),这个框架易于扩展,方便组件化开发,它的页面模板支持 JSP 和 Velocity 等、持久层支持 iBATIS 和 Hibernate 等、控制层可以用 EJB 和 Spring(Spring 是后来才有的)。项目组选择了这个强大的框架,这个框架如果当时开源了,也许就没有 WebWork 和 Struts 2 什么事了。另外,当时 Sun 在全世界大力推广他们的 EJB,虽然淘宝的架构师认为这个东东用不到,但他们还是极力坚持。在经历了很多次的技术讨论、争论和争吵之后,这个系统的架构就变成了下图的样子: 102 | 103 | ![img](https://pic003.cnblogs.com/2012/1/201204/2012040311284641.jpg) 104 | 105 | Java 应用服务器是 Weblogic,MVC 框架是 WebX、控制层用了 EJB、持久层是 iBATIS,另外为了缓解数据库的压力,商品查询和店铺查询放在搜索引擎上面。这个架构图是不是好看了一点了,亲? 106 | 107 | 这帮 Sun 的工程师开发完淘宝的网站之后,又做了一个很牛的网站,叫“支付宝”。 108 | 109 | 其实在任何时候,开发语言本身都不是系统的瓶颈,业务带来的压力更多的是压到了数据和存储上。上面一篇也说到,MySQL 撑不住了之后换 Oracle,Oracle 的存储一开始在本机上,后来在 NAS 上,NAS 撑不住了用 EMC 的 SAN 存储,再然后 Oracle 的 RAC 撑不住了,数据的存储方面就不得不考虑使用小型机了。在 2004 年的夏天,DBA 七公、测试工程师郭芙和架构师行癫,踏上了去北京测试小型机的道路。他们带着小型机回来的时候,我们像欢迎领袖一样的欢迎他们,因为那个是我们最值钱的设备了,价格表上的数字吓死人。小型机买回来之后我们争相合影,然后 Oracle 就跑在了小型机上,存储方面从 EMC 低端 cx 存储到 Sun oem hds 高端存储,再到 EMC dmx 高端存储,一级一级的往上跳。 110 | 111 | 到现在为止,我们已经用上了 IBM 的小型机、Oracle 的数据库、EMC 的存储,这些东西都是很贵的,那些年可以说是花钱如流水啊。有人说过“钱能解决的问题,就不是问题”,但随着淘宝网的发展,在不久以后,钱已经解决不了我们的问题了。花钱买豪华的配置,也许能支持 1 亿 PV 的网站,但淘宝网的发展实在是太快了,到了 10 亿怎么办?到了百亿怎么办?在 N 年以后,我们不得不创造技术,解决这些只有世界顶尖的网站才会遇到的问题。后来我们在开源软件的基础上进行自主研发,一步一步的把 IOE(IBM 小型机、Oracle、EMC 存储)这几个“神器”都去掉了。这就如同在《西游记》里面,妖怪们拿到神仙的兵器会非常厉害,连猴子都能够打败,但最牛的神仙是不用这些神器的,他们挥一挥衣袖、翻一下手掌就威力无比。去 IOE 这一部分会在最后一个章节里面讲,这里先埋个千里伏笔。 112 | 113 | 欲知后事如何,且听下回分解。 114 | 115 | **五、淘宝技术发展(Java 时代:坚若磐石)** 116 | 117 | 已经有读者在迫不及待的问怎么去掉了 IOE,别急,在去掉 IOE 之前还有很长的路要走。行癫他们买回来小型机之后,我们用上了 Oracle,七公带着一帮 DBA 在优化 SQL 和存储,行癫带着几个架构师在研究数据库的扩展性。Oracle 本身是一个封闭的系统,用 Oracle 怎么做扩展?用现在一个时髦的说法就是做“分库分表”。 118 | 119 | 我们知道一台 Oracle 的处理能力是有上限的,它的连接池有数量限制,查询速度跟容量成反比。简单的说,在数据量上亿、查询量上亿的时候,就到它的极限了。要突破这种极限,最简单的方式就是多用几个 Oracle 数据库。但一个封闭的系统做扩展,不像分布式系统那样轻松。我们把用户的信息按照 ID 来放到两个数据库里面(DB1/DB2),把商品的信息跟着卖家放在两个对应的数据库里面,把商品类目等通用信息放在第三个库里面(DBcommon)。这么做的目的除了增加了数据库的容量之外,还有一个就是做容灾,万一一个数据库挂了,整个网站上还有一半的数据能操作。 120 | 121 | 数据库这么分了之后,应用程序有麻烦了,如果我是一个买家,买的商品有 DB1 的也有 DB2 的,要查看“我已买到的宝贝”的时候,应用程序怎么办?必须到两个数据库里面分别查询出来对应的商品。要按时间排序怎么办?两个库里面“我已买到的宝贝”全部查出来在应用程序里面做合并。还有分页怎么处理?关键字查询怎么处理?这些东西交给程序员来做的话会很悲催,于是行癫在淘宝的第一个架构上的作品就来解决了这个问题,他写了一个数据库路由的框架 DBRoute,这个框架在淘宝的 Oracle 时代一直在使用。后来随着业务的发展,这种分库的第二个目的 —— 容灾的效果就没有达到。像评价、投诉、举报、收藏、我的淘宝等很多地方,都必须同时连接 DB1 和 DB2,哪个库挂了都会导致整个网站挂掉。 122 | 123 | 上一篇说过,采用 EJB 其实是和 Sun 的工程师妥协的结果,在他们走了之后,EJB 也逐渐被冷落了下来。在 2005、2006 年的时候,Spring 大放异彩,正好利用 Spring 的反射(IoC)模式替代了 EJB 的工厂模式,给整个系统精简了很多代码。 124 | 125 | 上一篇还说过,为了减少数据库的压力,提高搜索的效率,我们引入了搜索引擎。随着数据量的继续增长,到了 2005 年,商品数有 1663 万,PV 有 8931 万,注册会员有 1390 万,这给数据和存储带来的压力依然山大,数据量大,性能就慢。亲,还有什么办法能提升系统的性能?一定还有招数可以用,这就是缓存和 CDN(内容分发网络)。 126 | 127 | 你可以想象,九千万的访问量,有多少是在商品详情页面?访问这个页面的时候,数据全都是只读的(全部从数据库里面读出来,不写入数据库),如果把这些读操作从数据库里面移到内存里,数据库将会多么的感激涕零。在那个时候我们的架构师多隆大神,找到了一个基于 Berkeley DB 的开源的缓存系统,把很多不太变动的只读信息放了进去。其实最初这个缓存系统还比较弱,我们并没有把整个商品详情都放在里面,一开始把卖家的信息放里面,然后把商品属性放里面,商品详情这个字段太大,放进去受不了。说到商品详情,这个字段比较恐怖,有人统计过,淘宝商品详情打印出来平均有 5 米长,在系统里面其实放在哪里都不招人待见。笔者清楚的记得,我来淘宝之后担任项目经理做的第一个项目就是把商品详情从商品表里面给移出来。这个字段太大了,查询商品信息的时候很多都不需要查看详情,它跟商品的价格、运费这些放在一个表里面,拖慢了整个表的查询速度。在 2005 年的时候,我把商品详情放在数据库的另外一张表里面,再往后这个大字段被从数据库里面请了出来,这也让数据库再一次感激涕零。 128 | 129 | 到现在为止,整个商品详情的页面都在缓存里面了,眼尖的读者可能会发现现在的商品详情不全是“只读”的信息了,这个页面上有个信息叫“浏览量”,这个数字每刷新一次页面就要“写入”数据库一次,这种高频度实时更新的数据能用缓存吗?如果不用缓存,一天几十亿的写入,数据库会怎么样?一定会挂掉。那怎么办?亲……先不回答你(下图不是广告,让你看看浏览量这个数据在哪里) 130 | 131 | ![img](https://pic003.cnblogs.com/2012/1/201204/2012040311503357.jpg) 132 | 133 | CDN 这个工作相对比较独立,跟别的系统一样,一开始我们也是采用的商用系统。后来随着流量的增加,商用的系统已经撑不住了,LVS 的创始人章文嵩博士带人搭建了淘宝自己的 CDN 网络。在本文的引言中我说过淘宝的 CDN 系统支撑了 800Gbps 以上的流量,作为对比我们可以看一下国内专业做 CDN 的上市公司 ChinaCache 的介绍 —— “ChinaCache……是中国第一的专业 CDN 服务提供商,向客户提供全方位网络内容快速分布解决方案。作为首家获信产部许可的 CDN 服务提供商,目前 ChinaCache 在全国 50 多个大中城市拥有近 300 个节点,全网处理能力超过 500Gbps,其 CDN 网络覆盖中国电信、中国网通、中国移动、中国联通、中国铁通和中国教育科研网等各大运营商。” —— 这样你可以看得出淘宝在 CDN 上面的实力,这在全世界都是数一数二的。另外因为 CDN 需要大量的服务器,要消耗很多能源(消耗多少?在前两年我们算过一笔帐,淘宝上产生一个交易,消耗的电足以煮熟 4 个鸡蛋)。这两年章文嵩的团队又在研究低功耗的服务器,在绿色计算领域也做了很多开创性的工作。淘宝 CDN 的发展需要专门一个章节来讲,想先睹为快的可以看一下笔者[对章文嵩的专访](http://qing.weibo.com/1866752224/6f4460e033000jme.html)。 134 | 135 | 回想起刚用缓存那段时间,笔者还是个小菜鸟,有一个经典的错误常常犯,就是数据库的内容更新的时候,忘记通知缓存系统,结果在测试的时候就发现我改过的数据怎么在页面上没变化呢。后来做了一些页面上的代码,修改 CSS 和 JS 的时候,用户本地缓存的信息没有更新,页面上也会乱掉,在论坛上被人说的时候,我告诉他用 Ctrl+F5 刷新页面,然后赶紧修改脚本文件的名称,重新发布页面。学会用 Ctrl+F5 的会员对我佩服的五体投地,我却惭愧的无地自容。 136 | 137 | 有些技术的发展是顺其自然的,有些却是突如其来的。到 2007 年的时候,我们已经有几百台应用服务器了,这上面的 Java 应用服务器是 WebLogic,而 WebLogic 是非常贵的,比这些服务器本身都贵。有一段时间多隆研究了一下 JBoss,说我们换掉 WebLogic 吧,于是又省下了不少银两。那一年,老马举办了第一届的“网侠大会”,会上来的大侠中有一位是上文提到的章文嵩,还有一位曾经在 JBoss 团队工作,我们也把这位大侠留下了,这样我们用起 JBoss 更加有底气了。 138 | 139 | 这些杂七杂八的修改,我们对**数据分库、放弃 EJB、引入 Spring、加入缓存、加入 CDN、采用开源的 JBoss**,看起来没有章法可循,其实都是围绕着提高容量、提高性能、节约成本来做的,由于这些不算大的版本变迁,我们姑且叫它 2.1 版吧,这个版本从构图上来看有 3 只脚,是不是稳定了很多? 140 | 141 | 架构图如下: 142 | 143 | ![img](https://pic003.cnblogs.com/2012/1/201204/2012040311562659.jpg) 144 | 145 | **六、淘宝技术发展(Java 时代:创造技术-TFS)** 146 | 147 | 在讲淘宝文件系统 TFS 之前,先回顾一下上面几个版本。1.0 版的 PHP 系统运行了将近一年的时间(2003.05~2004.01);后来数据库变成 Oracle 之后(2004.01~2004.05,叫 1.1 版本吧),不到半年就把开发语言转换为 Java 系统了(2004.02~2005.03,叫 2.0 版本);进行分库、加入缓存、CDN 之后我们叫它 2.1 版本(2004.10~2007.01)。这中间有些时间的重合,因为很多架构的演化并没有明显的时间点,它是逐步进化而来的。 148 | 149 | 在描述 2.1 版本的时候我写的副标题是“坚若磐石”,这个“坚若磐石”是因为这个版本终于稳定下来了,在这个版本的系统上,淘宝网运行了两年多的时间。这期间有很多优秀的人才加入,也开发了很多优秀的产品,例如支付宝认证系统、招财进宝项目、淘宝旅行、淘宝彩票、淘宝论坛等等。甚至在团购网站风起云涌之前,淘宝网在 2006 年就推出了团购的功能,只是淘宝网最初的团购功能是买家发起的,达到卖家指定的数量之后,享受比一口价更低的价格,这个功能看起来是结合了淘宝一口价和荷兰拍的另一种交易模式,但不幸没有支撑下去。 150 | 151 | 在这些产品和功能的最底层,其实还是商品的管理和交易的管理这两大功能。这两大功能在 2.1 版本里面都有很大的变化。商品的管理起初是要求卖家选择 7 天到期还是 14 天到期,到期之后就要下架,必须重新发布才能上架,上架之后就变成了新的商品信息(ID 变过了)。另外如果这个期间内成交了,之后再有新货,必须发布一个新的商品信息。这么做有几个原因,一是参照拍卖商品的时间设置,要在某日期前结束挂牌;二是搜索引擎不知道同样的商品哪个排前面,那就把挂牌时间长的排前面,这样就必须在某个时间把老的商品下架掉,不然它老排在前面;第三是成交信息和商品 ID 关联,这个商品如果多次编辑还是同一个 ID 的话,成交记录里面的商品信息会变来变去;还有一个不为人知的原因,我们的存储有限,不能让所有的商品老存放在主库里面。这种处理方式简单粗暴,但还算是公平。不过这样很多需求都无法满足,例如同样的商品,我上一次销售的时候很多好评都没法在下一个商品上体现出来;再例如我买过的商品结束后只看到交易的信息,不知道卖家还有没有再卖了。后来基于这些需求,我们在 2006 年下半年把商品和交易拆开。一个商家的一种商品有个唯一的 ID,上下架都是同一个商品。那么如果卖家改价格、库存什么的话,已成交的信息怎么处理?那就在买家每交易一次的时候,都记录下商品的快照信息,有多少次交易就有多少个快照。这样买卖双方比较爽了,给系统带来了什么?存储的成本大幅度上升了! 152 | 153 | 存储的成本高到什么程度呢?数据库方面提到过用了 IOE,一套下来就是千万级别的,那几套下来就是 ⋯⋯。另外淘宝网还有很多文件需要存储,我们有哪些文件呢?最主要的就是图片、商品描述、交易快照,一个商品要包含几张图片和一长串的描述信息,而每一张图片都要生成几张规格不同的缩略图。在 2010 年,淘宝网的后端系统上保存着 286 亿个图片文件。图片在交易系统中非常重要,俗话说“一张好图胜千言”、“无图无真相”,淘宝网的商品照片,尤其是热门商品,图片的访问流量是非常大的。淘宝网整体流量中,图片的访问流量要占到 90% 以上。且这些图片平均大小为 17.45 KB,小于 8K 的图片占整体图片数量 61%,占整体系统容量的 11%。这么多的图片数据、这么大的访问流量,给淘宝网的系统带来了巨大的挑战。众所周知,对于大多数系统来说,最头疼的就是大规模的小文件存储与读取,因为磁头需要频繁的寻道和换道,因此在读取上容易带来较长的延时。在大量高并发访问量的情况下,简直就是系统的噩梦。我们该怎么办? 154 | 155 | 同样的套路,在某个规模以下,采用现有的商业解决方案,达到某种规模之后,商业的解决方案无法满足,只有自己创造解决方案了。对于淘宝的图片存储来说,转折点在 2007 年。这之前,一直采用的商用存储系统,应用 NetApp 公司的文件存储系统。随着淘宝网的图片文件数量以每年 2 倍(即原来 3 倍)的速度增长,淘宝网后端 NetApp 公司的存储系统也从低端到高端不断迁移,直至 2006 年,即使是 NetApp 公司最高端的产品也不能满足淘宝网存储的要求。从 2006 年开始,淘宝网决定自己开发一套针对海量小文件存储的文件系统,用于解决自身图片存储的难题。这标志着淘宝网从使用技术到了创造技术的阶段。 156 | 157 | 2007 年之前的图片存储架构如下图: 158 | 159 | ![img](https://pic001.cnblogs.com/images/2012/1/2012042521361474.png) 160 | 161 | 章文嵩博士总结了几点商用存储系统的局限和不足: 162 | 163 | 首先是商用的存储系统没有对小文件存储和读取的环境进行有针对性的优化;其次,文件数量大,网络存储设备无法支撑;另外,整个系统所连接的服务器也越来越多,网络连接数已经到达了网络存储设备的极限。此外,商用存储系统扩容成本高,10T 的存储容量需要几百万,而且存在单点故障,容灾和安全性无法得到很好的保证。 164 | 165 | 谈到在商用系统和自主研发之间的经济效益对比,章文嵩博士列举了以下几点经验: 166 | 167 | 1. 商用软件很难满足大规模系统的应用需求,无论存储还是 CDN 还是负载均衡,因为在厂商实验室端,很难实现如此大的数据规模测试。 168 | 169 | 2. 研发过程中,将开源和自主开发相结合,会有更好的可控性,系统出问题了,完全可以从底层解决问题,系统扩展性也更高。 170 | 171 | ![img](https://pic001.cnblogs.com/images/2012/1/2012042521381649.png) 172 | 173 | 3. 在一定规模效应基础上,研发的投入都是值得的。上图是一个自主研发和购买商用系统的投入产出比对比,实际上,在上图的交叉点左边,购买商用系统都是更加实际和经济性更好的选择,只有在规模超过交叉点的情况下,自主研发才能收到较好的经济效果。实际上,规模化达到如此程度的公司其实并不多,不过淘宝网已经远远超过了交叉点。 174 | 175 | 4. 自主研发的系统可在软件和硬件多个层次不断的优化。 176 | 177 | 历史总是惊人的巧合,在我们准备研发文件存储系统的时候,Google 走在了前面,2007 年他们公布了 GFS( Google File System )的设计论文,这给我们带来了很多借鉴的思路。随后我们开发出了适合淘宝使用的图片存储系统 TFS(Taobao File System)。3 年之后,我们发现历史的巧合比我们想象中还要神奇,几乎跟我们同时,中国的另外一家互联网公司也开发了他们的文件存储系统,甚至取的名字都一样 —— TFS,太神奇了!(猜猜是哪家?) 178 | 179 | 2007 年 6 月,TFS 正式上线运营。在生产环境中应用的集群规模达到了 200 台 PC Server(146G\*6 SAS 15K Raid5),文件数量达到上亿级别;系统部署存储容量:140TB;实际使用存储容量: 50TB;单台支持随机 IOPS200+,流量 3MBps。 180 | 181 | 要讲 TFS 的系统架构,首先要描述清楚业务需求,淘宝对图片存储的需求大概可以描述如下: 182 | 183 | 文件比较小;并发量高;读操作远大于写操作;访问随机;没有文件修改的操作;要求存储成本低;能容灾能备份。应对这种需求,显然要用分布式存储系统;由于文件大小比较统一,可以采用专有文件系统;并发量高,读写随机性强,需要更少的 IO 操作;考虑到成本和备份,需要用廉价的存储设备;考虑到容灾,需要能平滑扩容。 184 | 185 | 参照 GFS 并做了适度的优化之后,TFS 1.0 版的架构图如下: 186 | 187 | ![img](https://pic001.cnblogs.com/images/2012/1/2012042521422296.jpg) 188 | 189 | 从上面架构图上看:集群由一对 Name Server 和多台 Data Serve r 构成,Name Server 的两台服务器互为双机,就是集群文件系统中管理节点的概念。 190 | 191 | 在这个架构中: 192 |   • 每个 Data Server 运行在一台普通的 Linux 主机上 193 |   • 以 block 文件的形式存放数据文件(一般 64M 一个 block ) 194 |   • block 存多份保证数据安全 195 |   • 利用 ext3 文件系统存放数据文件 196 |   • 磁盘 raid5 做数据冗余 197 |   • 文件名内置元数据信息,用户自己保存 TFS 文件名与实际文件的对照关系 – 使得元数据量特别小。 198 | 199 | 淘宝 TFS 文件系统在核心设计上最大的取巧的地方就在,传统的集群系统里面元数据只有 1 份,通常由管理节点来管理,因而很容易成为瓶颈。而对于淘宝网的用户来说,图片文件究竟用什么名字来保存实际上用户并不关心,因此 TFS 在设计规划上考虑在图片的保存文件名上暗藏了一些元数据信息,例如图片的大小、时间、访问频次等等信息,包括所在的逻辑块号。而在元数据上,实际上保存的信息很少,因此元数据结构非常简单。仅仅只需要一个 fileID,能够准确定位文件在什么地方。 200 | 201 | 由于大量的文件信息都隐藏在文件名中,整个系统完全抛弃了传统的目录树结构,因为目录树开销最大。拿掉后,整个集群的高可扩展性极大提高。实际上,这一设计理念和目前业界的“对象存储”较为类似,淘宝网 TFS 文件系统已经更新到 1.3 版本,在生产系统的性能已经得到验证,且不断得到了完善和优化,淘宝网目前在对象存储领域的研究已经走在前列。 202 | 203 | 在 TFS 上线之前,淘宝网每个商品只允许上传一张图片,大小限定在 120K 之内,在商品详情里面的图片必须使用外站的服务。那时侯发布一件商品确实非常麻烦,笔者曾经想卖一台二手电脑,先把照片上传到 Google 相册,在发布到淘宝网之后发现 Google 相册被墙了,我的图片别人看不到,当时郁闷的不行。TFS 上线后,商品展示图片开放到 5 张,商品描述里面的图片也可以使用淘宝的图片服务,到现在为止,淘宝网给每个用户提供了 1G 的图片空间,这下大家都满足了。技术和业务就是这么互相用力的推动着,业务满足不了的时候,技术必须创新,技术创新之后,业务有了更大的发展空间。 204 | 205 | 1.3 版本的架构见阿里味(阿里巴巴内网)⋯⋯ 206 | 207 | **七、淘宝技术发展(分布式时代:服务化)** 208 | 209 | 在系统发展的过程中,架构师的眼光至关重要,作为程序员,把功能实现即可,但作为架构师,要考虑系统的扩展性、重用性,这种敏锐的感觉,有人说是一种代码洁癖。淘宝早期有几个架构师具备了这种感觉。一指开发的 Webx 是一个扩展性很强的框架,行癫在这个框架上插入了数据分库路由的模块、session 框架等等。在做淘宝后台系统的时候,同样需要这几个模块,行癫指导我把这些模块单独打成了 jar 包。另外在做淘宝机票、彩票系统的时候,页面端也有很多东西需要复用,最直观的是页头和页脚,一开始我们每个系统里面复制了一份过去,但奇妙的是,那段时间页脚要经常修改,例如把“雅虎中国”改成“中国雅虎”,过一段时间又加了一个“口碑网”,再过一段时间变成了“雅虎口碑”,最后又变成了“中国雅虎”,每个系统都改一遍,折腾啊。后来我就把这部分 velocity 模版单独拿出来了,做成了公用的模块。 210 | 211 | 上面这些都是比较小的复用模块,到 2006 年我们做了一个商品类目属性的改造,在类目里面引入属性的概念。项目的代号叫做“泰山”,如同它的名字,这是一个举足轻重的项目,这个改变是一个划时代的创新。在这之前的三年时间内,商品的分类都是按照树状的一级一级的节点来分的,随着商品数量的增长,类目也变得越来越深,越来越复杂,这带给买家的就是查找一件商品要逐级类目点开,找商品之前要懂商品的分类。而淘宝运营部门管理类目的小二也发现一个很严重的问题 —— 例如男装里面有 T 恤、T 恤下面有耐克、耐克有纯棉的,女装里面也有 T 恤、T 恤下面还是有耐克、耐克下面依然有纯棉的,那是先分男女装再分款式再分品牌再分材质呢?还是先分品牌再分款式再分材质再分男女呢?晕倒了。这时候,一位大侠出来了 —— 一灯,他说品牌、款式、材质这种东东可以叫做“属性”,属性是类似 tag 的一个概念,与类目相比更加离散,更加灵活,这样也缩减了类目的深度。这个思想的提出,一举解决了分类的难题!从系统的角度来看,我们建立了“属性”这样一个数据结构,由于除了类目的子节点有属性,父节点也有可能有属性,于是类目属性合起来也是一个结构化的数据对象。这个做出来之后我们把它独立出来作为一个服务,叫做 catserver(category server)。跟类目属性密切关联的商品搜索功能,独立出来,叫做 hesper(金星),catserver 和 hesper 供淘宝的前后台系统调用。 212 | 213 | 现在淘宝的商品类目属性已经是地球上最大的了,几乎没有什么类目的商品在淘宝上找不到(除了违禁的),但最初类目属性改造完之后,我们很缺属性数据,尤其是数码类的最缺。那从哪里弄这些数据呢亲?我们跟“中关村在线”合作,拿到了很多数据,那个时候,很多商品属性信息的后边标注着:“来自中关村在线”。有了类目属性,给运营的工作带来很大的便利,我们知道淘宝的运营主要就是类目的运营,什么季节推什么商品,都要在类目属性上面做调整,让买家更容易找到。例如夏天我要用户在女装一级类目下就标出来材质是不是蕾丝的、是不是纯棉的,冬天却要把羽绒衣调到女装一级类目下,流行什么就要把什么商品往更高级的类目调整。这样类目和属性要经常调整,随之而来的问题就显现了 —— 调整到哪个类目,那类商品的卖家就要编辑一次自己的商品,随着商品量的增长,卖家的工作量越来越大,然后我们就发现卖家受不了啦。到了 2008 年,我们研究了超市里面前后台商品的分类,发现超市前台商品可以随季节和关联来调整摆放场景(例如著名的啤酒和尿布的关联),后台仓库里面要按照自然类目来存储,二者密切关联却又相互分开。然后我们就把前后台类目分开了,这样卖家发布商品选择的是自然类目和属性,淘宝前台展示的是根据运营需要而摆放的商品的类目和属性。改造后的类目属性服务取名叫做 forest(森林,跟类目属性有点神似。catserver 还在,提供卖家授权、品牌服务、关键词等相关的服务)。类目属性的服务化,是淘宝在系统服务化方面做的第一个探索。 214 | 215 | 虽然个别架构师具备了代码洁癖,但淘宝前台系统的业务量和代码量还是爆炸式的增长了起来。业务方总在后面催,开发人员不够了就继续招人,招来的人根本看不懂原来的业务,只好摸索着在“合适的地方”加一些“合适的代码”,看看运行起来像那么回事,就发布上线了。在这样的恶性循环中,系统越来越臃肿,业务的耦合性越来越高,开发的效率越来越低。借用当时比较流行的一句话“写一段代码,编译一下能通过,半个小时就过去了;编译一下没通过,半天就过去了。”在这种情况下,系统出错的概率也逐步增长,常常是你改了商品相关的某些代码,发现交易出问题了,甚至你改了论坛上的某些代码,旺旺出问题了。这让开发人员苦不堪言,而业务方还认为这帮人干活越来越慢了。 216 | 217 | 大概是在 2007 年底的时候,研发部空降了一位从硅谷来的高管,空闻大师。空闻是一位温厚的长者,他告诉我们一切要以稳定为中心,所有影响系统稳定的因素都要解决掉。例如每做一个日常修改,都必须整个系统回归测试一遍;多个日常修改如果放在一个版本里面,要是一个功能没有测试通过,整个系统都不能发布。我们把这个叫做“火车模型”,任何一个乘客没有上车,都不许发车。这样做的最直接后果就是火车一直晚点,新功能上线更慢了,我们能明显的感觉到业务方的不满,空闻的压力肯定非常大。当时我都不理解这种一刀切的做法,为了稳定牺牲了发展的速度,这跟某 Party 的“稳定压倒一切”有什么分别? 218 | 219 | 但是到现在回过头来看看,其实我们并没有理解背后的思路。正是在这种要求下,我们不得不开始改变一些东西,例如把回归测试日常化,每天晚上都跑一遍整个系统的回归。还有就是在这种要求下,我们不得不对这个超级复杂的系统做肢解和重构,其中复用性最高的一个模块 —— 用户信息模块开始拆分出来了,我们叫它 UIC(user information center)。在 UIC 里面,它只处理最基础的用户信息操作,例如 getUserById、getUserByName 等等。 220 | 221 | 在另外一个方面,还有两个新兴的业务,也对系统基础功能的拆分提出了要求。在那个时候,我们做了淘宝旅行(trip.taobao.com)和淘宝彩票(caipiao.taobao.com)两个新业务,这两个新业务在商品的展示和交易的流程上都跟主站的业务不一样,机票是按照航班的信息展示的,彩票是按照双色球、数字和足球的赛程来展示的。但用到的会员的功能和交易的功能是跟主站差不多的,当时做的时候就很纠结,在主站里面做的话,会有一大半跟主站无关的东西,重新做一个的话,会有很多重复建设。最终我们决定不再给主站添乱了,就另起炉灶做了两个新的业务系统。从查询商品、购买商品、评价反馈、查看订单这一整个流程都重新写了一套出来。现在在“我的淘宝”里面查看交易记录的时候,还能发现“已买到的宝贝”里面把机票和彩票另外列出来了,他们没有加入到普通的订单里面去。在当时如果已经把会员、交易、商品、评价这些模块拆分出来,就不用什么都重做一遍了。 222 | 223 | ![img](https://pic003.cnblogs.com/2012/1/201210/2012101308271834.jpg) 224 | 225 | 到 2008 年初,整个主站系统(有了机票、彩票系统之后,把原来的系统叫做主站)的容量已经到了瓶颈,商品数在一亿以上,PV 在 2.5 亿以上,会员数超过了五千万。这个时候 Oracle 的连接池数量都不够用了,数据库的容量到了极限,上层系统再增加机器也无法继续扩容了,我们只有把底层的基础服务继续拆分,从底层开始扩容,上层才能扩展,这才能容纳以后三五年的增长。 226 | 227 | 于是那一年我们专门启动了一个更大的项目,把交易这个核心业务模块也拆分出来了。原来的淘宝交易除了跟商品管理耦合在一起,也在支付宝和淘宝之间跳来跳去,跟支付宝耦合在一起,系统复杂,用户体验也很不好。我们把交易的底层业务拆出来叫交易中心 TC(trade center),所谓底层业务是例如创建订单、减库存、修改订单状态等原子型的操作;交易的上层业务叫交易管理 TM(trade manager),例如拍下一件普通商品要对订单、库存、物流进行操作,拍下虚拟商品不需要对物流进行操作,这些在 TM 里面完成。这个项目取了一个很没有创意的名字 —— “千岛湖”,这帮开发人员取这个名字的目的是想在开发完毕之后,去千岛湖玩一圈,后来他们如愿以偿了。这个时候还有一个项目也在搞,就是淘宝商城,之前拆分出来的那些基础服务,给商城的快速构建,提供了良好的基础。 228 | 229 | 类目属性、用户中心、交易中心,随着这些模块逐步的拆分和服务化改造,我们在系统架构方面也积累了不少的经验。到 2008 年底干脆做了一个更大的项目,把淘宝所有的业务都模块化,这是继 2004 年从 LAMP 架构到 Java 架构之后的第二次脱胎换骨。这个项目取了一个很霸气的名字,叫“五彩石”(女娲炼石补天,用的石头)。这个系统重构的工作非常惊险,有人称之为“给一架高速飞行的飞机换发动机”。 230 | 231 | 五彩石项目发布之后,这帮工程师去三亚玩了几天。他们把淘宝的系统拆分成了如下架构: 232 | 233 | ![img](https://pic003.cnblogs.com/2012/1/201210/2012101221210061.jpg) 234 | 235 | 其中 UIC 和 Forest 上文说过,TC、IC、SC 分别是交易中心(Trade Center)、商品中心(Item Center)、店铺中心(Shop Center),这些中心级别的服务只提供原子级的业务逻辑,如根据 ID 查找商品、创建交易、减少库存等操作。再往上一层是业务系统 TM(Trade Manager 交易业务)、IM(Item Manager 商品业务)、SM(Shop Manager,因为不好听,所以后来改名叫 SS:Shop System,店铺业务)、Detail(商品详情)。 236 | 237 | 拆分之后,系统之间的交互关系变得非常复杂,示意图如下: 238 | 239 | ![img](https://pic003.cnblogs.com/2012/1/201210/2012101221224180.jpg) 240 | 241 | 系统这么拆分的话,好处显而易见,拆分之后每个系统可以单独部署,业务简单,方便扩容;有大量可重用的模块以便于开发新的业务;能够做到专人专事,让技术人员更加专注于某一个领域。这样要解决的问题也很明显,分拆之后,系统之间还是必须要打交道的,越往底层的系统,调用它的客户方越多,这就要求底层的系统必须具有超大规模的容量和非常高的可用性。另外,拆分之后的系统如何通讯?这里需要两种中间件系统,一种是实时调用的中间件(淘宝的 HSF,高性能服务框架)、一种是异步消息通知的中间件(淘宝的 Notify)。另外还有一个需要解决的问题是用户在 A 系统登录了,到 B 系统的时候,用户的登录信息怎么保存?这又涉及到一个 Session 框架。再者,还有一个软件工程方面的问题,这么多层的一套系统,怎么去测试它? 242 | -------------------------------------------------------------------------------- /99~参考资料/System Design Primer/README.md: -------------------------------------------------------------------------------- 1 | # System Design Primer 2 | 3 | ![典型的系统架构图](https://pic.imgdb.cn/item/605950b68322e6675cff5e81.png) 4 | 5 | ## 性能与可扩展性 6 | 7 | 如果服务**性能**的增长与资源的增加是成比例的,服务就是可扩展的。通常,提高性能意味着服务于更多的工作单元,另一方面,当数据集增长时,同样也可以处理更大的工作单位。1 8 | 9 | 另一个角度来看待性能与可扩展性: 10 | 11 | - 如果你的系统有**性能**问题,对于单个用户来说是缓慢的。 12 | - 如果你的系统有**可扩展性**问题,单个用户较快但在高负载下会变慢。 13 | 14 | ### 来源及延伸阅读 15 | 16 | - [简单谈谈可扩展性](http://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html) 17 | - [可扩展性,可用性,稳定性和模式](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/) 18 | 19 | ## 延迟与吞吐量 20 | 21 | **延迟**是执行操作或运算结果所花费的时间。 22 | 23 | **吞吐量**是单位时间内(执行)此类操作或运算的数量。 24 | 25 | 通常,你应该以**可接受级延迟**下**最大化吞吐量**为目标。 26 | 27 | ### 来源及延伸阅读 28 | 29 | - [理解延迟与吞吐量](https://community.cadence.com/cadence_blogs_8/b/sd/archive/2010/09/13/understanding-latency-vs-throughput) 30 | 31 | ## 可用性与一致性 32 | 33 | ### CAP 理论 34 | 35 |

36 | 37 |
38 | 来源:再看 CAP 理论 39 |

40 | 41 | 在一个分布式计算系统中,只能同时满足下列的两点: 42 | 43 | - **一致性** ─ 每次访问都能获得最新数据但可能会收到错误响应 44 | - **可用性** ─ 每次访问都能收到非错响应,但不保证获取到最新数据 45 | - **分区容错性** ─ 在任意分区网络故障的情况下系统仍能继续运行 46 | 47 | **网络并不可靠,所以你应要支持分区容错性,并需要在软件可用性和一致性间做出取舍。** 48 | 49 | #### CP ─ 一致性和分区容错性 50 | 51 | 等待分区节点的响应可能会导致延时错误。如果你的业务需求需要原子读写,CP 是一个不错的选择。 52 | 53 | #### AP ─ 可用性与分区容错性 54 | 55 | 响应节点上可用数据的最近版本可能并不是最新的。当分区解析完后,写入(操作)可能需要一些时间来传播。 56 | 57 | 如果业务需求允许[最终一致性](#最终一致性),或当有外部故障时要求系统继续运行,AP 是一个不错的选择。 58 | 59 | ### 来源及延伸阅读 60 | 61 | - [再看 CAP 理论](http://robertgreiner.com/2014/08/cap-theorem-revisited/) 62 | - [通俗易懂地介绍 CAP 理论](http://ksat.me/a-plain-english-introduction-to-cap-theorem/) 63 | - [CAP FAQ](https://github.com/henryr/cap-faq) 64 | 65 | ## 一致性模式 66 | 67 | 有同一份数据的多份副本,我们面临着怎样同步它们的选择,以便让客户端有一致的显示数据。回想 [CAP 理论](#cap-理论)中的一致性定义 ─ 每次访问都能获得最新数据但可能会收到错误响应 68 | 69 | ### 弱一致性 70 | 71 | 在写入之后,访问可能看到,也可能看不到(写入数据)。尽力优化之让其能访问最新数据。 72 | 73 | 这种方式可以 memcached 等系统中看到。弱一致性在 VoIP,视频聊天和实时多人游戏等真实用例中表现不错。打个比方,如果你在通话中丢失信号几秒钟时间,当重新连接时你是听不到这几秒钟所说的话的。 74 | 75 | ### 最终一致性 76 | 77 | 在写入后,访问最终能看到写入数据(通常在数毫秒内)。数据被异步复制。 78 | 79 | DNS 和 email 等系统使用的是此种方式。最终一致性在高可用性系统中效果不错。 80 | 81 | ### 强一致性 82 | 83 | 在写入后,访问立即可见。数据被同步复制。 84 | 85 | 文件系统和关系型数据库(RDBMS)中使用的是此种方式。强一致性在需要记录的系统中运作良好。 86 | 87 | ### 来源及延伸阅读 88 | 89 | - [Transactions across data centers](http://snarfed.org/transactions_across_datacenters_io.html) 90 | 91 | ## 可用性模式 92 | 93 | 有两种支持高可用性的模式: **故障切换(fail-over)**和**复制(replication)**。 94 | 95 | ### 故障切换 96 | 97 | #### 工作到备用切换(Active-passive) 98 | 99 | 关于工作到备用的故障切换流程是,工作服务器发送周期信号给待机中的备用服务器。如果周期信号中断,备用服务器切换成工作服务器的 IP 地址并恢复服务。 100 | 101 | 宕机时间取决于备用服务器处于“热”待机状态还是需要从“冷”待机状态进行启动。只有工作服务器处理流量。 102 | 103 | 工作到备用的故障切换也被称为主从切换。 104 | 105 | #### 双工作切换(Active-active) 106 | 107 | 在双工作切换中,双方都在管控流量,在它们之间分散负载。 108 | 109 | 如果是外网服务器,DNS 将需要对两方都了解。如果是内网服务器,应用程序逻辑将需要对两方都了解。 110 | 111 | 双工作切换也可以称为主主切换。 112 | 113 | ### 缺陷:故障切换 114 | 115 | - 故障切换需要添加额外硬件并增加复杂性。 116 | - 如果新写入数据在能被复制到备用系统之前,工作系统出现了故障,则有可能会丢失数据。 117 | 118 | ### 复制 119 | 120 | #### 主 ─ 从复制和主 ─ 主复制 121 | 122 | 这个主题进一步探讨了[数据库](#数据库)部分: 123 | 124 | - [主 ─ 从复制](#主从复制) 125 | - [主 ─ 主复制](#主主复制) 126 | 127 | ## 域名系统 128 | 129 |

130 | 131 |
132 | 来源:DNS 安全介绍 133 |

134 | 135 | 域名系统是把 www.example.com 等域名转换成 IP 地址。 136 | 137 | 域名系统是分层次的,一些 DNS 服务器位于顶层。当查询(域名) IP 时,路由或 ISP 提供连接 DNS 服务器的信息。较底层的 DNS 服务器缓存映射,它可能会因为 DNS 传播延时而失效。DNS 结果可以缓存在浏览器或操作系统中一段时间,时间长短取决于[存活时间 TTL](https://en.wikipedia.org/wiki/Time_to_live)。 138 | 139 | - **NS 记录(域名服务)** ─ 指定解析域名或子域名的 DNS 服务器。 140 | - **MX 记录(邮件交换)** ─ 指定接收信息的邮件服务器。 141 | - **A 记录(地址)** ─ 指定域名对应的 IP 地址记录。 142 | - **CNAME(规范)** ─ 一个域名映射到另一个域名或 `CNAME` 记录(example.com 指向 www.example.com)或映射到一个 `A` 记录。 143 | 144 | [CloudFlare](https://www.cloudflare.com/dns/) 和 [Route 53](https://aws.amazon.com/route53/) 等平台提供管理 DNS 的功能。某些 DNS 服务通过集中方式来路由流量: 145 | 146 | - [加权轮询调度](http://g33kinfo.com/info/archives/2657) 147 | - 防止流量进入维护中的服务器 148 | - 在不同大小集群间负载均衡 149 | - A/B 测试 150 | - 基于延迟路由 151 | - 基于地理位置路由 152 | 153 | ### 缺陷:DNS 154 | 155 | - 虽说缓存可以减轻 DNS 延迟,但连接 DNS 服务器还是带来了轻微的延迟。 156 | - 虽然它们通常由[政府,网络服务提供商和大公司](http://superuser.com/questions/472695/who-controls-the-dns-servers/472729)管理,但 DNS 服务管理仍可能是复杂的。 157 | - DNS 服务最近遭受 [DDoS 攻击](http://dyn.com/blog/dyn-analysis-summary-of-friday-october-21-attack/),阻止不知道 Twitter IP 地址的用户访问 Twitter。 158 | 159 | ### 来源及延伸阅读 160 | 161 | - [DNS 架构]() 162 | - [Wikipedia](https://en.wikipedia.org/wiki/Domain_Name_System) 163 | - [关于 DNS 的文章](https://support.dnsimple.com/categories/dns/) 164 | 165 | ## 内容分发网络(CDN) 166 | 167 |

168 | 169 |
170 | 来源:为什么使用 CDN 171 |

172 | 173 | 内容分发网络(CDN)是一个全球性的代理服务器分布式网络,它从靠近用户的位置提供内容。通常,HTML/CSS/JS,图片和视频等静态内容由 CDN 提供,虽然亚马逊 CloudFront 等也支持动态内容。CDN 的 DNS 解析会告知客户端连接哪台服务器。 174 | 175 | 将内容存储在 CDN 上可以从两个方面来提供性能: 176 | 177 | - 从靠近用户的数据中心提供资源 178 | - 通过 CDN 你的服务器不必真的处理请求 179 | 180 | ### CDN 推送(push) 181 | 182 | 当你服务器上内容发生变动时,推送 CDN 接受新内容。直接推送给 CDN 并重写 URL 地址以指向你的内容的 CDN 地址。你可以配置内容到期时间及何时更新。内容只有在更改或新增是才推送,流量最小化,但储存最大化。 183 | 184 | ### CDN 拉取(pull) 185 | 186 | CDN 拉取是当第一个用户请求该资源时,从服务器上拉取资源。你将内容留在自己的服务器上并重写 URL 指向 CDN 地址。直到内容被缓存在 CDN 上为止,这样请求只会更慢, 187 | 188 | [存活时间(TTL)](https://en.wikipedia.org/wiki/Time_to_live)决定缓存多久时间。CDN 拉取方式最小化 CDN 上的储存空间,但如果过期文件并在实际更改之前被拉取,则会导致冗余的流量。 189 | 190 | 高流量站点使用 CDN 拉取效果不错,因为只有最近请求的内容保存在 CDN 中,流量才能更平衡地分散。 191 | 192 | ### 缺陷:CDN 193 | 194 | - CDN 成本可能因流量而异,可能在权衡之后你将不会使用 CDN。 195 | - 如果在 TTL 过期之前更新内容,CDN 缓存内容可能会过时。 196 | - CDN 需要更改静态内容的 URL 地址以指向 CDN。 197 | 198 | ### 来源及延伸阅读 199 | 200 | - [全球性内容分发网络](http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci) 201 | - [CDN 拉取和 CDN 推送的区别](http://www.travelblogadvice.com/technical/the-differences-between-push-and-pull-cdns/) 202 | - [Wikipedia](https://en.wikipedia.org/wiki/Content_delivery_network) 203 | 204 | ## 负载均衡器 205 | 206 |

207 | 208 |
209 | 来源:可扩展的系统设计模式 210 |

211 | 212 | 负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。无论哪种情况,负载均衡器将从计算资源来的响应返回给恰当的客户端。负载均衡器的效用在于: 213 | 214 | - 防止请求进入不好的服务器 215 | - 防止资源过载 216 | - 帮助消除单一的故障点 217 | 218 | 负载均衡器可以通过硬件(昂贵)或 HAProxy 等软件来实现。 219 | 增加的好处包括: 220 | 221 | - **SSL 终结** ─ 解密传入的请求并加密服务器响应,这样的话后端服务器就不必再执行这些潜在高消耗运算了。 222 | - 不需要再每台服务器上安装 [X.509 证书](https://en.wikipedia.org/wiki/X.509)。 223 | - **Session 留存** ─ 如果 Web 应用程序不追踪会话,发出 cookie 并将特定客户端的请求路由到同一实例。 224 | 225 | 通常会设置采用[工作 ─ 备用](#工作到备用切换active-passive) 或 [双工作](#双工作切换active-active) 模式的多个负载均衡器,以免发生故障。 226 | 227 | 负载均衡器能基于多种方式来路由流量: 228 | 229 | - 随机 230 | - 最少负载 231 | - Session/cookie 232 | - [轮询调度或加权轮询调度算法](http://g33kinfo.com/info/archives/2657) 233 | - [四层负载均衡](#四层负载均衡) 234 | - [七层负载均衡](#七层负载均衡) 235 | 236 | ### 四层负载均衡 237 | 238 | 四层负载均衡根据监看[传输层](#通讯)的信息来决定如何分发请求。通常,这会涉及来源,目标 IP 地址和请求头中的端口,但不包括数据包(报文)内容。四层负载均衡执行[网络地址转换(NAT)](https://www.nginx.com/resources/glossary/layer-4-load-balancing/)来向上游服务器转发网络数据包。 239 | 240 | ### 七层负载均衡器 241 | 242 | 七层负载均衡器根据监控[应用层](#通讯)来决定怎样分发请求。这会涉及请求头的内容,消息和 cookie。七层负载均衡器终结网络流量,读取消息,做出负载均衡判定,然后传送给特定服务器。比如,一个七层负载均衡器能直接将视频流量连接到托管视频的服务器,同时将更敏感的用户账单流量引导到安全性更强的服务器。 243 | 244 | 以损失灵活性为代价,四层负载均衡比七层负载均衡花费更少时间和计算资源,虽然这对现代商用硬件的性能影响甚微。 245 | 246 | ### 水平扩展 247 | 248 | 负载均衡器还能帮助水平扩展,提高性能和可用性。使用商业硬件的性价比更高,并且比在单台硬件上**垂直扩展**更贵的硬件具有更高的可用性。相比招聘特定企业系统人才,招聘商业硬件方面的人才更加容易。 249 | 250 | #### 缺陷:水平扩展 251 | 252 | - 水平扩展引入了复杂度并涉及服务器复制 253 | - 服务器应该是无状态的:它们也不该包含像 session 或资料图片等与用户关联的数据。 254 | - session 可以集中存储在数据库或持久化[缓存](#缓存)(Redis、Memcached)的数据存储区中。 255 | - 缓存和数据库等下游服务器需要随着上游服务器进行扩展,以处理更多的并发连接。 256 | 257 | ### 缺陷:负载均衡器 258 | 259 | - 如果没有足够的资源配置或配置错误,负载均衡器会变成一个性能瓶颈。 260 | - 引入负载均衡器以帮助消除单点故障但导致了额外的复杂性。 261 | - 单个负载均衡器会导致单点故障,但配置多个负载均衡器会进一步增加复杂性。 262 | 263 | ### 来源及延伸阅读 264 | 265 | - [NGINX 架构](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/) 266 | - [HAProxy 架构指南](http://www.haproxy.org/download/1.2/doc/architecture.txt) 267 | - [可扩展性](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones) 268 | - [Wikipedia]() 269 | - [四层负载平衡](https://www.nginx.com/resources/glossary/layer-4-load-balancing/) 270 | - [七层负载平衡](https://www.nginx.com/resources/glossary/layer-7-load-balancing/) 271 | - [ELB 监听器配置](http://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-listener-config.html) 272 | 273 | ## 反向代理(web 服务器) 274 | 275 |

276 | 277 |
278 | 资料来源:维基百科 279 |
280 |

281 | 282 | 反向代理是一种可以集中地调用内部服务,并提供统一接口给公共客户的 web 服务器。来自客户端的请求先被反向代理服务器转发到可响应请求的服务器,然后代理再把服务器的响应结果返回给客户端。 283 | 284 | 带来的好处包括: 285 | 286 | - **增加安全性** - 隐藏后端服务器的信息,屏蔽黑名单中的 IP,限制每个客户端的连接数。 287 | - **提高可扩展性和灵活性** - 客户端只能看到反向代理服务器的 IP,这使你可以增减服务器或者修改它们的配置。 288 | - **本地终结 SSL 会话** - 解密传入请求,加密服务器响应,这样后端服务器就不必完成这些潜在的高成本的操作。 289 | - 免除了在每个服务器上安装 [X.509](https://en.wikipedia.org/wiki/X.509) 证书的需要 290 | - **压缩** - 压缩服务器响应 291 | - **缓存** - 直接返回命中的缓存结果 292 | - **静态内容** - 直接提供静态内容 293 | - HTML/CSS/JS 294 | - 图片 295 | - 视频 296 | - 等等 297 | 298 | ### 负载均衡器与反向代理 299 | 300 | - 当你有多个服务器时,部署负载均衡器非常有用。通常,负载均衡器将流量路由给一组功能相同的服务器上。 301 | - 即使只有一台 web 服务器或者应用服务器时,反向代理也有用,可以参考上一节介绍的好处。 302 | - NGINX 和 HAProxy 等解决方案可以同时支持第七层反向代理和负载均衡。 303 | 304 | ### 不利之处:反向代理 305 | 306 | - 引入反向代理会增加系统的复杂度。 307 | - 单独一个反向代理服务器仍可能发生单点故障,配置多台反向代理服务器(如[故障转移](https://en.wikipedia.org/wiki/Failover))会进一步增加复杂度。 308 | 309 | ### 来源及延伸阅读 310 | 311 | - [反向代理与负载均衡](https://www.nginx.com/resources/glossary/reverse-proxy-vs-load-balancer/) 312 | - [NGINX 架构](https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/) 313 | - [HAProxy 架构指南](http://www.haproxy.org/download/1.2/doc/architecture.txt) 314 | - [Wikipedia](https://en.wikipedia.org/wiki/Reverse_proxy) 315 | 316 | ## 应用层 317 | 318 |

319 | 320 |
321 | 资料来源:可缩放系统构架介绍 322 |

323 | 324 | 将 Web 服务层与应用层(也被称作平台层)分离,可以独立缩放和配置这两层。添加新的 API 只需要添加应用服务器,而不必添加额外的 web 服务器。 325 | 326 | **单一职责原则**提倡小型的,自治的服务共同合作。小团队通过提供小型的服务,可以更激进地计划增长。 327 | 328 | 应用层中的工作进程也有可以实现[异步化](#异步)。 329 | 330 | ### 微服务 331 | 332 | 与此讨论相关的话题是 [微服务](https://en.wikipedia.org/wiki/Microservices),可以被描述为一系列可以独立部署的小型的,模块化服务。每个服务运行在一个独立的线程中,通过明确定义的轻量级机制通讯,共同实现业务目标。1 333 | 334 | 例如,Pinterest 可能有这些微服务: 用户资料、关注者、Feed 流、搜索、照片上传等。 335 | 336 | ### 服务发现 337 | 338 | 像 [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](#超文本传输协议http) 路径。Consul 和 Etcd 都有一个内建的 [key-value 存储](#键-值存储) 用来存储配置信息和其他的共享信息。 339 | 340 | ### 不利之处:应用层 341 | 342 | - 添加由多个松耦合服务组成的应用层,从架构、运营、流程等层面来讲将非常不同(相对于单体系统)。 343 | - 微服务会增加部署和运营的复杂度。 344 | 345 | ### 来源及延伸阅读 346 | 347 | - [可缩放系统构架介绍](http://lethain.com/introduction-to-architecting-systems-for-scale) 348 | - [破解系统设计面试](http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview) 349 | - [面向服务架构](https://en.wikipedia.org/wiki/Service-oriented_architecture) 350 | - [Zookeeper 介绍](http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) 351 | - [构建微服务,你所需要知道的一切](https://cloudncode.wordpress.com/2016/07/22/msa-getting-started/) 352 | 353 | ## 数据库 354 | 355 |

356 | 357 |
358 | 资料来源:扩展你的用户数到第一个一千万 359 |

360 | 361 | ### 关系型数据库管理系统(RDBMS) 362 | 363 | 像 SQL 这样的关系型数据库是一系列以表的形式组织的数据项集合。 364 | 365 | > 校对注:这里作者 SQL 可能指的是 MySQL 366 | 367 | **ACID** 用来描述关系型数据库[事务](https://en.wikipedia.org/wiki/Database_transaction)的特性。 368 | 369 | - **原子性** - 每个事务内部所有操作要么全部完成,要么全部不完成。 370 | - **一致性** - 任何事务都使数据库从一个有效的状态转换到另一个有效状态。 371 | - **隔离性** - 并发执行事务的结果与顺序执行事务的结果相同。 372 | - **持久性** - 事务提交后,对系统的影响是永久的。 373 | 374 | 关系型数据库扩展包括许多技术:**主从复制**、**主主复制**、**联合**、**分片**、**非规范化**和 **SQL 调优**。 375 | 376 |

377 | 378 |
379 | 资料来源:可扩展性、可用性、稳定性、模式 380 |

381 | 382 | #### 主从复制 383 | 384 | 主库同时负责读取和写入操作,并复制写入到一个或多个从库中,从库只负责读操作。树状形式的从库再将写入复制到更多的从库中去。如果主库离线,系统可以以只读模式运行,直到某个从库被提升为主库或有新的主库出现。 385 | 386 | ##### 不利之处:主从复制 387 | 388 | - 将从库提升为主库需要额外的逻辑。 389 | - 参考[不利之处:复制](#不利之处复制)中,主从复制和主主复制**共同**的问题。 390 | 391 |

392 | 393 |
394 | 资料来源:可扩展性、可用性、稳定性、模式 395 |

396 | 397 | #### 主主复制 398 | 399 | 两个主库都负责读操作和写操作,写入操作时互相协调。如果其中一个主库挂机,系统可以继续读取和写入。 400 | 401 | ##### 不利之处: 主主复制 402 | 403 | - 你需要添加负载均衡器或者在应用逻辑中做改动,来确定写入哪一个数据库。 404 | - 多数主-主系统要么不能保证一致性(违反 ACID),要么因为同步产生了写入延迟。 405 | - 随着更多写入节点的加入和延迟的提高,如何解决冲突显得越发重要。 406 | - 参考[不利之处:复制](#不利之处复制)中,主从复制和主主复制**共同**的问题。 407 | 408 | ##### 不利之处:复制 409 | 410 | - 如果主库在将新写入的数据复制到其他节点前挂掉,则有数据丢失的可能。 411 | - 写入会被重放到负责读取操作的副本。副本可能因为过多写操作阻塞住,导致读取功能异常。 412 | - 读取从库越多,需要复制的写入数据就越多,导致更严重的复制延迟。 413 | - 在某些数据库系统中,写入主库的操作可以用多个线程并行写入,但读取副本只支持单线程顺序地写入。 414 | - 复制意味着更多的硬件和额外的复杂度。 415 | 416 | ##### 来源及延伸阅读 417 | 418 | - [扩展性,可用性,稳定性模式](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/) 419 | - [多主复制](https://en.wikipedia.org/wiki/Multi-master_replication) 420 | 421 | #### 联合 422 | 423 |

424 | 425 |
426 | 资料来源:扩展你的用户数到第一个一千万 427 |

428 | 429 | 联合(或按功能划分)将数据库按对应功能分割。例如,你可以有三个数据库:**论坛**、**用户**和**产品**,而不仅是一个单体数据库,从而减少每个数据库的读取和写入流量,减少复制延迟。较小的数据库意味着更多适合放入内存的数据,进而意味着更高的缓存命中几率。没有只能串行写入的中心化主库,你可以并行写入,提高负载能力。 430 | 431 | ##### 不利之处:联合 432 | 433 | - 如果你的数据库模式需要大量的功能和数据表,联合的效率并不好。 434 | - 你需要更新应用程序的逻辑来确定要读取和写入哪个数据库。 435 | - 用 [server link](http://stackoverflow.com/questions/5145637/querying-data-by-joining-two-tables-in-two-database-on-different-servers) 从两个库联结数据更复杂。 436 | - 联合需要更多的硬件和额外的复杂度。 437 | 438 | ##### 来源及延伸阅读:联合 439 | 440 | - [扩展你的用户数到第一个一千万](https://www.youtube.com/watch?v=w95murBkYmU) 441 | 442 | #### 分片 443 | 444 |

445 | 446 |
447 | 资料来源:可扩展性、可用性、稳定性、模式 448 |

449 | 450 | 分片将数据分配在不同的数据库上,使得每个数据库仅管理整个数据集的一个子集。以用户数据库为例,随着用户数量的增加,越来越多的分片会被添加到集群中。 451 | 452 | 类似[联合](#联合)的优点,分片可以减少读取和写入流量,减少复制并提高缓存命中率。也减少了索引,通常意味着查询更快,性能更好。如果一个分片出问题,其他的仍能运行,你可以使用某种形式的冗余来防止数据丢失。类似联合,没有只能串行写入的中心化主库,你可以并行写入,提高负载能力。 453 | 454 | 常见的做法是用户姓氏的首字母或者用户的地理位置来分隔用户表。 455 | 456 | ##### 不利之处:分片 457 | 458 | - 你需要修改应用程序的逻辑来实现分片,这会带来复杂的 SQL 查询。 459 | - 分片不合理可能导致数据负载不均衡。例如,被频繁访问的用户数据会导致其所在分片的负载相对其他分片高。 460 | - 再平衡会引入额外的复杂度。基于[一致性哈希](http://www.paperplanes.de/2011/12/9/the-magic-of-consistent-hashing.html)的分片算法可以减少这种情况。 461 | - 联结多个分片的数据操作更复杂。 462 | - 分片需要更多的硬件和额外的复杂度。 463 | 464 | #### 来源及延伸阅读:分片 465 | 466 | - [分片时代来临](http://highscalability.com/blog/2009/8/6/an-unorthodox-approach-to-database-design-the-coming-of-the.html) 467 | - [数据库分片架构]() 468 | - [一致性哈希](http://www.paperplanes.de/2011/12/9/the-magic-of-consistent-hashing.html) 469 | 470 | #### 非规范化 471 | 472 | 非规范化试图以写入性能为代价来换取读取性能。在多个表中冗余数据副本,以避免高成本的联结操作。一些关系型数据库,比如 [PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL) 和 Oracle 支持[物化视图](https://en.wikipedia.org/wiki/Materialized_view),可以处理冗余信息存储和保证冗余副本一致。 473 | 474 | 当数据使用诸如[联合](#联合)和[分片](#分片)等技术被分割,进一步提高了处理跨数据中心的联结操作复杂度。非规范化可以规避这种复杂的联结操作。 475 | 476 | 在多数系统中,读取操作的频率远高于写入操作,比例可达到 100:1,甚至 1000:1。需要复杂的数据库联结的读取操作成本非常高,在磁盘操作上消耗了大量时间。 477 | 478 | ##### 不利之处:非规范化 479 | 480 | - 数据会冗余。 481 | - 约束可以帮助冗余的信息副本保持同步,但这样会增加数据库设计的复杂度。 482 | - 非规范化的数据库在高写入负载下性能可能比规范化的数据库差。 483 | 484 | ##### 来源及延伸阅读:非规范化 485 | 486 | - [非规范化](https://en.wikipedia.org/wiki/Denormalization) 487 | 488 | #### SQL 调优 489 | 490 | SQL 调优是一个范围很广的话题,有很多相关的[书](https://www.amazon.com/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords=sql+tuning)可以作为参考。 491 | 492 | 利用**基准测试**和**性能分析**来模拟和发现系统瓶颈很重要。 493 | 494 | - **基准测试** - 用 [ab](http://httpd.apache.org/docs/2.2/programs/ab.html) 等工具模拟高负载情况。 495 | - **性能分析** - 通过启用如[慢查询日志](http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html)等工具来辅助追踪性能问题。 496 | 497 | 基准测试和性能分析可能会指引你到以下优化方案。 498 | 499 | ##### 改进模式 500 | 501 | - 为了实现快速访问,MySQL 在磁盘上用连续的块存储数据。 502 | - 使用 `CHAR` 类型存储固定长度的字段,不要用 `VARCHAR`。 503 | - `CHAR` 在快速、随机访问时效率很高。如果使用 `VARCHAR`,如果你想读取下一个字符串,不得不先读取到当前字符串的末尾。 504 | - 使用 `TEXT` 类型存储大块的文本,例如博客正文。`TEXT` 还允许布尔搜索。使用 `TEXT` 字段需要在磁盘上存储一个用于定位文本块的指针。 505 | - 使用 `INT` 类型存储高达 2^32 或 40 亿的较大数字。 506 | - 使用 `DECIMAL` 类型存储货币可以避免浮点数表示错误。 507 | - 避免使用 `BLOBS` 存储实际对象,而是用来存储存放对象的位置。 508 | - `VARCHAR(255)` 是以 8 位数字存储的最大字符数,在某些关系型数据库中,最大限度地利用字节。 509 | - 在适用场景中设置 `NOT NULL` 约束来[提高搜索性能](http://stackoverflow.com/questions/1017239/how-do-null-values-affect-performance-in-a-database-search)。 510 | 511 | ##### 使用正确的索引 512 | 513 | - 你正查询(`SELECT`、`GROUP BY`、`ORDER BY`、`JOIN`)的列如果用了索引会更快。 514 | - 索引通常表示为自平衡的 [B 树](https://en.wikipedia.org/wiki/B-tree),可以保持数据有序,并允许在对数时间内进行搜索,顺序访问,插入,删除操作。 515 | - 设置索引,会将数据存在内存中,占用了更多内存空间。 516 | - 写入操作会变慢,因为索引需要被更新。 517 | - 加载大量数据时,禁用索引再加载数据,然后重建索引,这样也许会更快。 518 | 519 | ##### 避免高成本的联结操作 520 | 521 | - 有性能需要,可以进行非规范化。 522 | 523 | ##### 分割数据表 524 | 525 | - 将热点数据拆分到单独的数据表中,可以有助于缓存。 526 | 527 | ##### 调优查询缓存 528 | 529 | - 在某些情况下,[查询缓存](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/)。 530 | 531 | ##### 来源及延伸阅读 532 | 533 | - [MySQL 查询优化小贴士](http://20bits.com/article/10-tips-for-optimizing-mysql-queries-that-dont-suck) 534 | - [为什么 VARCHAR(255) 很常见?](http://stackoverflow.com/questions/1217466/is-there-a-good-reason-i-see-varchar255-used-so-often-as-opposed-to-another-l) 535 | - [Null 值是如何影响数据库性能的?](http://stackoverflow.com/questions/1017239/how-do-null-values-affect-performance-in-a-database-search) 536 | - [慢查询日志](http://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html) 537 | 538 | ### NoSQL 539 | 540 | NoSQL 是**键-值数据库**、**文档型数据库**、**列型数据库**或**图数据库**的统称。数据库是非规范化的,表联结大多在应用程序代码中完成。大多数 NoSQL 无法实现真正符合 ACID 的事务,支持[最终一致](#最终一致性)。 541 | 542 | **BASE** 通常被用于描述 NoSQL 数据库的特性。相比 [CAP 理论](#cap-理论),BASE 强调可用性超过一致性。 543 | 544 | - **基本可用** - 系统保证可用性。 545 | - **软状态** - 即使没有输入,系统状态也可能随着时间变化。 546 | - **最终一致性** - 经过一段时间之后,系统最终会变一致,因为系统在此期间没有收到任何输入。 547 | 548 | 除了在 [SQL 还是 NoSQL](#sql-还是-nosql) 之间做选择,了解哪种类型的 NoSQL 数据库最适合你的用例也是非常有帮助的。我们将在下一节中快速了解下 **键-值存储**、**文档型存储**、**列型存储**和**图存储**数据库。 549 | 550 | #### 键-值存储 551 | 552 | > 抽象模型:哈希表 553 | 554 | 键-值存储通常可以实现 O(1) 时间读写,用内存或 SSD 存储数据。数据存储可以按[字典顺序](https://en.wikipedia.org/wiki/Lexicographical_order)维护键,从而实现键的高效检索。键-值存储可以用于存储元数据。 555 | 556 | 键-值存储性能很高,通常用于存储简单数据模型或频繁修改的数据,如存放在内存中的缓存。键-值存储提供的操作有限,如果需要更多操作,复杂度将转嫁到应用程序层面。 557 | 558 | 键-值存储是如文档存储,在某些情况下,甚至是图存储等更复杂的存储系统的基础。 559 | 560 | #### 来源及延伸阅读 561 | 562 | - [键-值数据库](https://en.wikipedia.org/wiki/Key-value_database) 563 | - [键-值存储的劣势](http://stackoverflow.com/questions/4056093/what-are-the-disadvantages-of-using-a-key-value-table-over-nullable-columns-or) 564 | - [Redis 架构](http://qnimate.com/overview-of-redis-architecture/) 565 | - [Memcached 架构](https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/) 566 | 567 | #### 文档类型存储 568 | 569 | > 抽象模型:将文档作为值的键-值存储 570 | 571 | 文档类型存储以文档(XML、JSON、二进制文件等)为中心,文档存储了指定对象的全部信息。文档存储根据文档自身的内部结构提供 API 或查询语句来实现查询。请注意,许多键-值存储数据库有用值存储元数据的特性,这也模糊了这两种存储类型的界限。 572 | 573 | 基于底层实现,文档可以根据集合、标签、元数据或者文件夹组织。尽管不同文档可以被组织在一起或者分成一组,但相互之间可能具有完全不同的字段。 574 | 575 | MongoDB 和 CouchDB 等一些文档类型存储还提供了类似 SQL 语言的查询语句来实现复杂查询。DynamoDB 同时支持键-值存储和文档类型存储。 576 | 577 | 文档类型存储具备高度的灵活性,常用于处理偶尔变化的数据。 578 | 579 | #### 来源及延伸阅读:文档类型存储 580 | 581 | - [面向文档的数据库](https://en.wikipedia.org/wiki/Document-oriented_database) 582 | - [MongoDB 架构](https://www.mongodb.com/mongodb-architecture) 583 | - [CouchDB 架构](https://blog.couchdb.org/2016/08/01/couchdb-2-0-architecture/) 584 | - [Elasticsearch 架构](https://www.elastic.co/blog/found-elasticsearch-from-the-bottom-up) 585 | 586 | #### 列型存储 587 | 588 |

589 | 590 |
591 | 资料来源: SQL 和 NoSQL,一个简短的历史 592 |

593 | 594 | > 抽象模型:嵌套的 `ColumnFamily>` 映射 595 | 596 | 类型存储的基本数据单元是列(名/值对)。列可以在列族(类似于 SQL 的数据表)中被分组。超级列族再分组普通列族。你可以使用行键独立访问每一列,具有相同行键值的列组成一行。每个值都包含版本的时间戳用于解决版本冲突。 597 | 598 | 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 这样的存储系统将键以字母顺序存储,可以高效地读取键列。 599 | 600 | 列型存储具备高可用性和高可扩展性。通常被用于大数据相关存储。 601 | 602 | ##### 来源及延伸阅读:列型存储 603 | 604 | - [SQL 与 NoSQL 简史](http://blog.grio.com/2015/11/sql-nosql-a-brief-history.html) 605 | - [BigTable 架构](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf) 606 | - [Hbase 架构](https://www.mapr.com/blog/in-depth-look-hbase-architecture) 607 | - [Cassandra 架构](http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/architecture/architectureIntro_c.html) 608 | 609 | #### 图数据库 610 | 611 |

612 | 613 |
614 | 资料来源:图数据库 615 |

616 | 617 | > 抽象模型: 图 618 | 619 | 在图数据库中,一个节点对应一条记录,一个弧对应两个节点之间的关系。图数据库被优化用于表示外键繁多的复杂关系或多对多关系。 620 | 621 | 图数据库为存储复杂关系的数据模型,如社交网络,提供了很高的性能。它们相对较新,尚未广泛应用,查找开发工具或者资源相对较难。许多图只能通过 [REST API](#表述性状态转移rest) 访问。 622 | 623 | ##### 相关资源和延伸阅读:图 624 | 625 | - [图数据库](https://en.wikipedia.org/wiki/Graph_database) 626 | - [Neo4j](https://neo4j.com/) 627 | - [FlockDB](https://blog.twitter.com/2010/introducing-flockdb) 628 | 629 | #### 来源及延伸阅读:NoSQL 630 | 631 | - [数据库术语解释](http://stackoverflow.com/questions/3342497/explanation-of-base-terminology) 632 | - [NoSQL 数据库 - 调查及决策指南](https://medium.com/baqend-blog/nosql-databases-a-survey-and-decision-guidance-ea7823a822d#.wskogqenq) 633 | - [可扩展性](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database) 634 | - [NoSQL 介绍](https://www.youtube.com/watch?v=qI_g07C_Q5I) 635 | - [NoSQL 模式](http://horicky.blogspot.com/2009/11/nosql-patterns.html) 636 | 637 | ### SQL 还是 NoSQL 638 | 639 |

640 | 641 |
642 | 资料来源:从 RDBMS 转换到 NoSQL 643 |

644 | 645 | 选取 **SQL** 的原因: 646 | 647 | - 结构化数据 648 | - 严格的模式 649 | - 关系型数据 650 | - 需要复杂的联结操作 651 | - 事务 652 | - 清晰的扩展模式 653 | - 既有资源更丰富:开发者、社区、代码库、工具等 654 | - 通过索引进行查询非常快 655 | 656 | 选取 **NoSQL** 的原因: 657 | 658 | - 半结构化数据 659 | - 动态或灵活的模式 660 | - 非关系型数据 661 | - 不需要复杂的联结操作 662 | - 存储 TB (甚至 PB)级别的数据 663 | - 高数据密集的工作负载 664 | - IOPS 高吞吐量 665 | 666 | 适合 NoSQL 的示例数据: 667 | 668 | - 埋点数据和日志数据 669 | - 排行榜或者得分数据 670 | - 临时数据,如购物车 671 | - 频繁访问的(“热”)表 672 | - 元数据/查找表 673 | 674 | ##### 来源及延伸阅读:SQL 或 NoSQL 675 | 676 | - [扩展你的用户数到第一个千万](https://www.youtube.com/watch?v=w95murBkYmU) 677 | - [SQL 和 NoSQL 的不同](https://www.sitepoint.com/sql-vs-nosql-differences/) 678 | 679 | ## 缓存 680 | 681 |

682 | 683 |
684 | 资料来源:可扩展的系统设计模式 685 |

686 | 687 | 缓存可以提高页面加载速度,并可以减少服务器和数据库的负载。在这个模型中,分发器先查看请求之前是否被响应过,如果有则将之前的结果直接返回,来省掉真正的处理。 688 | 689 | 数据库分片均匀分布的读取是最好的。但是热门数据会让读取分布不均匀,这样就会造成瓶颈,如果在数据库前加个缓存,就会抹平不均匀的负载和突发流量对数据库的影响。 690 | 691 | ### 客户端缓存 692 | 693 | 缓存可以位于客户端(操作系统或者浏览器),[服务端](#反向代理web-服务器)或者不同的缓存层。 694 | 695 | ### CDN 缓存 696 | 697 | [CDN](#内容分发网络cdn) 也被视为一种缓存。 698 | 699 | ### Web 服务器缓存 700 | 701 | [反向代理](#反向代理web-服务器)和缓存(比如 [Varnish](https://www.varnish-cache.org/))可以直接提供静态和动态内容。Web 服务器同样也可以缓存请求,返回相应结果而不必连接应用服务器。 702 | 703 | ### 数据库缓存 704 | 705 | 数据库的默认配置中通常包含缓存级别,针对一般用例进行了优化。调整配置,在不同情况下使用不同的模式可以进一步提高性能。 706 | 707 | ### 应用缓存 708 | 709 | 基于内存的缓存比如 Memcached 和 Redis 是应用程序和数据存储之间的一种键值存储。由于数据保存在 RAM 中,它比存储在磁盘上的典型数据库要快多了。RAM 比磁盘限制更多,所以例如 [least recently used (LRU)](https://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used) 的[缓存无效算法](https://en.wikipedia.org/wiki/Cache_algorithms)可以将热门数据放在 RAM 中,而对一些比较冷门的数据不做处理。 710 | 711 | Redis 有下列附加功能: 712 | 713 | - 持久性选项 714 | - 内置数据结构比如有序集合和列表 715 | 716 | 有多个缓存级别,分为两大类:**数据库查询**和**对象**: 717 | 718 | - 行级别 719 | - 查询级别 720 | - 完整的可序列化对象 721 | - 完全渲染的 HTML 722 | 723 | 一般来说,你应该尽量避免基于文件的缓存,因为这使得复制和自动缩放很困难。 724 | 725 | ### 数据库查询级别的缓存 726 | 727 | 当你查询数据库的时候,将查询语句的哈希值与查询结果存储到缓存中。这种方法会遇到以下问题: 728 | 729 | - 很难用复杂的查询删除已缓存结果。 730 | - 如果一条数据比如表中某条数据的一项被改变,则需要删除所有可能包含已更改项的缓存结果。 731 | 732 | ### 对象级别的缓存 733 | 734 | 将您的数据视为对象,就像对待你的应用代码一样。让应用程序将数据从数据库中组合到类实例或数据结构中: 735 | 736 | - 如果对象的基础数据已经更改了,那么从缓存中删掉这个对象。 737 | - 允许异步处理:workers 通过使用最新的缓存对象来组装对象。 738 | 739 | 建议缓存的内容: 740 | 741 | - 用户会话 742 | - 完全渲染的 Web 页面 743 | - 活动流 744 | - 用户图数据 745 | 746 | ### 何时更新缓存 747 | 748 | 由于你只能在缓存中存储有限的数据,所以你需要选择一个适用于你用例的缓存更新策略。 749 | 750 | #### 缓存模式 751 | 752 |

753 | 754 |
755 | 资料来源:从缓存到内存数据网格 756 |

757 | 758 | 应用从存储器读写。缓存不和存储器直接交互,应用执行以下操作: 759 | 760 | - 在缓存中查找记录,如果所需数据不在缓存中 761 | - 从数据库中加载所需内容 762 | - 将查找到的结果存储到缓存中 763 | - 返回所需内容 764 | 765 | ```python 766 | def get_user(self, user_id): 767 | user = cache.get("user.{0}", user_id) 768 | if user is None: 769 | user = db.query("SELECT * FROM users WHERE user_id = {0}", user_id) 770 | if user is not None: 771 | key = "user.{0}".format(user_id) 772 | cache.set(key, json.dumps(user)) 773 | return user 774 | ``` 775 | 776 | [Memcached](https://memcached.org/) 通常用这种方式使用。 777 | 778 | 添加到缓存中的数据读取速度很快。缓存模式也称为延迟加载。只缓存所请求的数据,这避免了没有被请求的数据占满了缓存空间。 779 | 780 | ##### 缓存的缺点: 781 | 782 | - 请求的数据如果不在缓存中就需要经过三个步骤来获取数据,这会导致明显的延迟。 783 | - 如果数据库中的数据更新了会导致缓存中的数据过时。这个问题需要通过设置  TTL 强制更新缓存或者直写模式来缓解这种情况。 784 | - 当一个节点出现故障的时候,它将会被一个新的节点替代,这增加了延迟的时间。 785 | 786 | #### 直写模式 787 | 788 |

789 | 790 |
791 | 资料来源:可扩展性、可用性、稳定性、模式 792 |

793 | 794 | 应用使用缓存作为主要的数据存储,将数据读写到缓存中,而缓存负责从数据库中读写数据。 795 | 796 | - 应用向缓存中添加/更新数据 797 | - 缓存同步地写入数据存储 798 | - 返回所需内容 799 | 800 | 应用代码: 801 | 802 | ``` 803 | set_user(12345, {"foo":"bar"}) 804 | ``` 805 | 806 | 缓存代码: 807 | 808 | ```python 809 | def set_user(user_id, values): 810 | user = db.query("UPDATE Users WHERE id = {0}", user_id, values) 811 | cache.set(user_id, user) 812 | ``` 813 | 814 | 由于存写操作所以直写模式整体是一种很慢的操作,但是读取刚写入的数据很快。相比读取数据,用户通常比较能接受更新数据时速度较慢。缓存中的数据不会过时。 815 | 816 | ##### 直写模式的缺点: 817 | 818 | - 由于故障或者缩放而创建的新的节点,新的节点不会缓存,直到数据库更新为止。缓存应用直写模式可以缓解这个问题。 819 | - 写入的大多数数据可能永远都不会被读取,用 TTL 可以最小化这种情况的出现。 820 | 821 | #### 回写模式 822 | 823 |

824 | 825 |
826 | 资料来源:可扩展性、可用性、稳定性、模式 827 |

828 | 829 | 在回写模式中,应用执行以下操作: 830 | 831 | - 在缓存中增加或者更新条目 832 | - 异步写入数据,提高写入性能。 833 | 834 | ##### 回写模式的缺点: 835 | 836 | - 缓存可能在其内容成功存储之前丢失数据。 837 | - 执行直写模式比缓存或者回写模式更复杂。 838 | 839 | #### 刷新 840 | 841 |

842 | 843 |
844 | 资料来源:从缓存到内存数据网格 845 |

846 | 847 | 你可以将缓存配置成在到期之前自动刷新最近访问过的内容。 848 | 849 | 如果缓存可以准确预测将来可能请求哪些数据,那么刷新可能会导致延迟与读取时间的降低。 850 | 851 | ##### 刷新的缺点: 852 | 853 | - 不能准确预测到未来需要用到的数据可能会导致性能不如不使用刷新。 854 | 855 | ### 缓存的缺点: 856 | 857 | - 需要保持缓存和真实数据源之间的一致性,比如数据库根据[缓存无效](https://en.wikipedia.org/wiki/Cache_algorithms)。 858 | - 需要改变应用程序比如增加 Redis 或者 memcached。 859 | - 无效缓存是个难题,什么时候更新缓存是与之相关的复杂问题。 860 | 861 | ### 相关资源和延伸阅读 862 | 863 | - [从缓存到内存数据](http://www.slideshare.net/tmatyashovsky/from-cache-to-in-memory-data-grid-introduction-to-hazelcast) 864 | - [可扩展系统设计模式](http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html) 865 | - [可缩放系统构架介绍](http://lethain.com/introduction-to-architecting-systems-for-scale/) 866 | - [可扩展性,可用性,稳定性和模式](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/) 867 | - [可扩展性](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache) 868 | - [AWS ElastiCache 策略](http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/Strategies.html) 869 | - [维基百科]() 870 | 871 | ## 异步 872 | 873 |

874 | 875 |
876 | 资料来源:可缩放系统构架介绍 877 |

878 | 879 | 异步工作流有助于减少那些原本顺序执行的请求时间。它们可以通过提前进行一些耗时的工作来帮助减少请求时间,比如定期汇总数据。 880 | 881 | ### 消息队列 882 | 883 | 消息队列接收,保留和传递消息。如果按顺序执行操作太慢的话,你可以使用有以下工作流的消息队列: 884 | 885 | - 应用程序将作业发布到队列,然后通知用户作业状态 886 | - 一个 worker 从队列中取出该作业,对其进行处理,然后显示该作业完成 887 | 888 | 不去阻塞用户操作,作业在后台处理。在此期间,客户端可能会进行一些处理使得看上去像是任务已经完成了。例如,如果要发送一条推文,推文可能会马上出现在你的时间线上,但是可能需要一些时间才能将你的推文推送到你的所有关注者那里去。 889 | 890 | **Redis** 是一个令人满意的简单的消息代理,但是消息有可能会丢失。 891 | 892 | **RabbitMQ** 很受欢迎但是要求你适应 AMQP 协议并且管理你自己的节点。 893 | 894 | **Amazon SQS** 是被托管的,但可能具有高延迟,并且消息可能会被传送两次。 895 | 896 | ### 任务队列 897 | 898 | 任务队列接收任务及其相关数据,运行它们,然后传递其结果。它们可以支持调度,并可用于在后台运行计算密集型作业。 899 | 900 | **Celery** 支持调度,主要是用 Python 开发的。 901 | 902 | ### 背压 903 | 904 | 如果队列开始明显增长,那么队列大小可能会超过内存大小,导致高速缓存未命中,磁盘读取,甚至性能更慢。[背压](http://mechanical-sympathy.blogspot.com/2012/05/apply-back-pressure-when-overloaded.html)可以通过限制队列大小来帮助我们,从而为队列中的作业保持高吞吐率和良好的响应时间。一旦队列填满,客户端将得到服务器忙或者 HTTP 503 状态码,以便稍后重试。客户端可以在稍后时间重试该请求,也许是[指数退避](https://en.wikipedia.org/wiki/Exponential_backoff)。 905 | 906 | ### 异步的缺点: 907 | 908 | - 简单的计算和实时工作流等用例可能更适用于同步操作,因为引入队列可能会增加延迟和复杂性。 909 | 910 | ### 相关资源和延伸阅读 911 | 912 | - [这是一个数字游戏](https://www.youtube.com/watch?v=1KRYH75wgy4) 913 | - [超载时应用背压](http://mechanical-sympathy.blogspot.com/2012/05/apply-back-pressure-when-overloaded.html) 914 | - [利特尔法则](https://en.wikipedia.org/wiki/Little%27s_law) 915 | - [消息队列与任务队列有什么区别?](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) 916 | 917 | ## 通讯 918 | 919 |

920 | 921 |
922 | 资料来源:OSI 7层模型 923 |

924 | 925 | ### 超文本传输协议(HTTP) 926 | 927 | HTTP 是一种在客户端和服务器之间编码和传输数据的方法。它是一个请求/响应协议:客户端和服务端针对相关内容和完成状态信息的请求和响应。HTTP 是独立的,允许请求和响应流经许多执行负载均衡,缓存,加密和压缩的中间路由器和服务器。 928 | 929 | 一个基本的 HTTP 请求由一个动词(方法)和一个资源(端点)组成。以下是常见的 HTTP 动词: 930 | 931 | | 动词 | 描述 | \*幂等 | 安全性 | 可缓存 | 932 | | ------ | ---------------------------- | ------ | ------ | ------------------------- | 933 | | GET | 读取资源 | Yes | Yes | Yes | 934 | | POST | 创建资源或触发处理数据的进程 | No | No | Yes,如果回应包含刷新信息 | 935 | | PUT | 创建或替换资源 | Yes | No | No | 936 | | PATCH | 部分更新资源 | No | No | Yes,如果回应包含刷新信息 | 937 | | DELETE | 删除资源 | Yes | No | No | 938 | 939 | **多次执行不会产生不同的结果**。 940 | 941 | HTTP 是依赖于较低级协议(如 **TCP** 和 **UDP**)的应用层协议。 942 | 943 | #### 来源及延伸阅读:HTTP 944 | 945 | - [README](https://www.quora.com/What-is-the-difference-between-HTTP-protocol-and-TCP-protocol) + 946 | - [HTTP 是什么?](https://www.nginx.com/resources/glossary/http/) 947 | - [HTTP 和 TCP 的区别](https://www.quora.com/What-is-the-difference-between-HTTP-protocol-and-TCP-protocol) 948 | - [PUT 和 PATCH 的区别](https://laracasts.com/discuss/channels/general-discussion/whats-the-differences-between-put-and-patch?page=1) 949 | 950 | ### 传输控制协议(TCP) 951 | 952 |

953 | 954 |
955 | 资料来源:如何制作多人游戏 956 |

957 | 958 | TCP 是通过 [IP 网络](https://en.wikipedia.org/wiki/Internet_Protocol)的面向连接的协议。使用[握手](https://en.wikipedia.org/wiki/Handshaking)建立和断开连接。发送的所有数据包保证以原始顺序到达目的地,用以下措施保证数据包不被损坏: 959 | 960 | - 每个数据包的序列号和[校验码](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Checksum_computation)。 961 | - [确认包]()和自动重传 962 | 963 | 如果发送者没有收到正确的响应,它将重新发送数据包。如果多次超时,连接就会断开。TCP 实行[流量控制]()和[拥塞控制](https://en.wikipedia.org/wiki/Network_congestion#Congestion_control)。这些确保措施会导致延迟,而且通常导致传输效率比 UDP 低。 964 | 965 | 为了确保高吞吐量,Web 服务器可以保持大量的 TCP 连接,从而导致高内存使用。在 Web 服务器线程间拥有大量开放连接可能开销巨大,消耗资源过多,也就是说,一个 [memcached](#memcached) 服务器。[连接池](https://en.wikipedia.org/wiki/Connection_pool) 可以帮助除了在适用的情况下切换到 UDP。 966 | 967 | TCP 对于需要高可靠性但时间紧迫的应用程序很有用。比如包括 Web 服务器,数据库信息,SMTP,FTP 和 SSH。 968 | 969 | 以下情况使用 TCP 代替 UDP: 970 | 971 | - 你需要数据完好无损。 972 | - 你想对网络吞吐量自动进行最佳评估。 973 | 974 | ### 用户数据报协议(UDP) 975 | 976 |

977 | 978 |
979 | 资料来源:如何制作多人游戏 980 |

981 | 982 | UDP 是无连接的。数据报(类似于数据包)只在数据报级别有保证。数据报可能会无序的到达目的地,也有可能会遗失。UDP 不支持拥塞控制。虽然不如 TCP 那样有保证,但 UDP 通常效率更高。 983 | 984 | UDP 可以通过广播将数据报发送至子网内的所有设备。这对 [DHCP](https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol) 很有用,因为子网内的设备还没有分配 IP 地址,而 IP 对于 TCP 是必须的。 985 | 986 | UDP 可靠性更低但适合用在网络电话、视频聊天,流媒体和实时多人游戏上。 987 | 988 | 以下情况使用 UDP 代替 TCP: 989 | 990 | - 你需要低延迟 991 | - 相对于数据丢失更糟的是数据延迟 992 | - 你想实现自己的错误校正方法 993 | 994 | #### 来源及延伸阅读:TCP 与 UDP 995 | 996 | - [游戏编程的网络](http://gafferongames.com/networking-for-game-programmers/udp-vs-tcp/) 997 | - [TCP 与 UDP 的关键区别](http://www.cyberciti.biz/faq/key-differences-between-tcp-and-udp-protocols/) 998 | - [TCP 与 UDP 的不同](http://stackoverflow.com/questions/5970383/difference-between-tcp-and-udp) 999 | - [传输控制协议](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) 1000 | - [用户数据报协议](https://en.wikipedia.org/wiki/User_Datagram_Protocol) 1001 | - [Memcache 在 Facebook 的扩展](http://www.cs.bu.edu/~jappavoo/jappavoo.github.com/451/papers/memcache-fb.pdf) 1002 | 1003 | ### 远程过程调用协议(RPC) 1004 | 1005 |

1006 | 1007 |
1008 | Source: Crack the system design interview 1009 |

1010 | 1011 | 在 RPC 中,客户端会去调用另一个地址空间(通常是一个远程服务器)里的方法。调用代码看起来就像是调用的是一个本地方法,客户端和服务器交互的具体过程被抽象。远程调用相对于本地调用一般较慢而且可靠性更差,因此区分两者是有帮助的。热门的 RPC 框架包括 [Protobuf](https://developers.google.com/protocol-buffers/)、[Thrift](https://thrift.apache.org/) 和 [Avro](https://avro.apache.org/docs/current/)。 1012 | 1013 | RPC 是一个“请求-响应”协议: 1014 | 1015 | - **客户端程序** ── 调用客户端存根程序。就像调用本地方法一样,参数会被压入栈中。 1016 | - **客户端 stub 程序** ── 将请求过程的 id 和参数打包进请求信息中。 1017 | - **客户端通信模块** ── 将信息从客户端发送至服务端。 1018 | - **服务端通信模块** ── 将接受的包传给服务端存根程序。 1019 | - **服务端 stub 程序** ── 将结果解包,依据过程 id 调用服务端方法并将参数传递过去。 1020 | 1021 | RPC 调用示例: 1022 | 1023 | ``` 1024 | GET /someoperation?data=anId 1025 | 1026 | POST /anotheroperation 1027 | { 1028 | "data":"anId"; 1029 | "anotherdata": "another value" 1030 | } 1031 | ``` 1032 | 1033 | RPC 专注于暴露方法。RPC 通常用于处理内部通讯的性能问题,这样你可以手动处理本地调用以更好的适应你的情况。 1034 | 1035 | 当以下情况时选择本地库(也就是 SDK): 1036 | 1037 | - 你知道你的目标平台。 1038 | - 你想控制如何访问你的“逻辑”。 1039 | - 你想对发生在你的库中的错误进行控制。 1040 | - 性能和终端用户体验是你最关心的事。 1041 | 1042 | 遵循 **REST** 的 HTTP API 往往更适用于公共 API。 1043 | 1044 | #### 缺点:RPC 1045 | 1046 | - RPC 客户端与服务实现捆绑地很紧密。 1047 | - 一个新的 API 必须在每一个操作或者用例中定义。 1048 | - RPC 很难调试。 1049 | - 你可能没办法很方便的去修改现有的技术。举个例子,如果你希望在 [Squid](http://www.squid-cache.org/) 这样的缓存服务器上确保 [RPC 被正确缓存](http://etherealbits.com/2012/12/debunking-the-myths-of-rpc-rest/)的话可能需要一些额外的努力了。 1050 | 1051 | ### 表述性状态转移(REST) 1052 | 1053 | REST 是一种强制的客户端/服务端架构设计模型,客户端基于服务端管理的一系列资源操作。服务端提供修改或获取资源的接口。所有的通信必须是无状态和可缓存的。 1054 | 1055 | RESTful 接口有四条规则: 1056 | 1057 | - **标志资源(HTTP 里的 URI)** ── 无论什么操作都使用同一个 URI。 1058 | - **表示的改变(HTTP 的动作)** ── 使用动作, headers 和 body。 1059 | - **可自我描述的错误信息(HTTP 中的 status code)** ── 使用状态码,不要重新造轮子。 1060 | - **[HATEOAS](http://restcookbook.com/Basics/hateoas/)(HTTP 中的 HTML 接口)** ── 你的 web 服务器应该能够通过浏览器访问。 1061 | 1062 | REST 请求的例子: 1063 | 1064 | ``` 1065 | GET /someresources/anId 1066 | 1067 | PUT /someresources/anId 1068 | {"anotherdata": "another value"} 1069 | ``` 1070 | 1071 | REST 关注于暴露数据。它减少了客户端/服务端的耦合程度,经常用于公共 HTTP API 接口设计。REST 使用更通常与规范化的方法来通过 URI 暴露资源,[通过 header 来表述](https://github.com/for-GET/know-your-http-well/blob/master/headers.md)并通过 GET、POST、PUT、DELETE 和 PATCH 这些动作来进行操作。因为无状态的特性,REST 易于横向扩展和隔离。 1072 | 1073 | #### 缺点:REST 1074 | 1075 | - 由于 REST 将重点放在暴露数据,所以当资源不是自然组织的或者结构复杂的时候它可能无法很好的适应。举个例子,返回过去一小时中与特定事件集匹配的更新记录这种操作就很难表示为路径。使用 REST,可能会使用 URI 路径,查询参数和可能的请求体来实现。 1076 | - REST 一般依赖几个动作(GET、POST、PUT、DELETE 和 PATCH),但有时候仅仅这些没法满足你的需要。举个例子,将过期的文档移动到归档文件夹里去,这样的操作可能没法简单的用上面这几个 verbs 表达。 1077 | - 为了渲染单个页面,获取被嵌套在层级结构中的复杂资源需要客户端,服务器之间多次往返通信。例如,获取博客内容及其关联评论。对于使用不确定网络环境的移动应用来说,这些多次往返通信是非常麻烦的。 1078 | - 随着时间的推移,更多的字段可能会被添加到 API 响应中,较旧的客户端将会接收到所有新的数据字段,即使是那些它们不需要的字段,结果它会增加负载大小并引起更大的延迟。 1079 | 1080 | ### RPC 与 REST 比较 1081 | 1082 | | 操作 | RPC | REST | 1083 | | ---------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------ | 1084 | | 注册 | **POST** /signup | **POST** /persons | 1085 | | 注销 | **POST** /resign
{
"personid": "1234"
} | **DELETE** /persons/1234 | 1086 | | 读取用户信息 | **GET** /readPerson?personid=1234 | **GET** /persons/1234 | 1087 | | 读取用户物品列表 | **GET** /readUsersItemsList?personid=1234 | **GET** /persons/1234/items | 1088 | | 向用户物品列表添加一项 | **POST** /addItemToUsersItemsList
{
"personid": "1234";
"itemid": "456"
} | **POST** /persons/1234/items
{
"itemid": "456"
} | 1089 | | 更新一个物品 | **POST** /modifyItem
{
"itemid": "456";
"key": "value"
} | **PUT** /items/456
{
"key": "value"
} | 1090 | | 删除一个物品 | **POST** /removeItem
{
"itemid": "456"
} | **DELETE** /items/456 | 1091 | 1092 |

1093 | 资料来源:你真的知道你为什么更喜欢 REST 而不是 RPC 吗 1094 |

1095 | 1096 | #### 来源及延伸阅读:REST 与 RPC 1097 | 1098 | - [你真的知道你为什么更喜欢 REST 而不是 RPC 吗](https://apihandyman.io/do-you-really-know-why-you-prefer-rest-over-rpc/) 1099 | - [什么时候 RPC 比 REST 更合适?](http://programmers.stackexchange.com/a/181186) 1100 | - [REST vs JSON-RPC](http://stackoverflow.com/questions/15056878/rest-vs-json-rpc) 1101 | - [揭开 RPC 和 REST 的神秘面纱](http://etherealbits.com/2012/12/debunking-the-myths-of-rpc-rest/) 1102 | - [使用 REST 的缺点是什么](https://www.quora.com/What-are-the-drawbacks-of-using-RESTful-APIs) 1103 | - [破解系统设计面试](http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview) 1104 | - [Thrift](https://code.facebook.com/posts/1468950976659943/) 1105 | - [为什么在内部使用 REST 而不是 RPC](http://arstechnica.com/civis/viewtopic.php?t=1190508) 1106 | 1107 | ## 安全 1108 | 1109 | 这一部分需要更多内容。[一起来吧](#贡献)! 1110 | 1111 | 安全是一个宽泛的话题。除非你有相当的经验、安全方面背景或者正在申请的职位要求安全知识,你不需要了解安全基础知识以外的内容: 1112 | 1113 | - 在运输和等待过程中加密 1114 | - 对所有的用户输入和从用户那里发来的参数进行处理以防止 [XSS](https://en.wikipedia.org/wiki/Cross-site_scripting) 和 [SQL 注入](https://en.wikipedia.org/wiki/SQL_injection)。 1115 | - 使用参数化的查询来防止 SQL 注入。 1116 | - 使用[最小权限原则](https://en.wikipedia.org/wiki/Principle_of_least_privilege)。 1117 | 1118 | ### 来源及延伸阅读 1119 | 1120 | - [为开发者准备的安全引导](https://github.com/FallibleInc/security-guide-for-developers) 1121 | - [OWASP top ten](https://www.owasp.org/index.php/OWASP_Top_Ten_Cheat_Sheet) 1122 | 1123 | ## 附录 1124 | 1125 | 一些时候你会被要求做出保守估计。比如,你可能需要估计从磁盘中生成 100 张图片的缩略图需要的时间或者一个数据结构需要多少的内存。**2 的次方表**和**每个开发者都需要知道的一些时间数据**(译注:OSChina 上有这篇文章的[译文](https://www.oschina.net/news/30009/every-programmer-should-know))都是一些很方便的参考资料。 1126 | 1127 | ### 2 的次方表 1128 | 1129 | ``` 1130 | Power Exact Value Approx Value Bytes 1131 | --------------------------------------------------------------- 1132 | 7 128 1133 | 8 256 1134 | 10 1024 1 thousand 1 KB 1135 | 16 65,536 64 KB 1136 | 20 1,048,576 1 million 1 MB 1137 | 30 1,073,741,824 1 billion 1 GB 1138 | 32 4,294,967,296 4 GB 1139 | 40 1,099,511,627,776 1 trillion 1 TB 1140 | ``` 1141 | 1142 | #### 来源及延伸阅读 1143 | 1144 | - [2 的次方](https://en.wikipedia.org/wiki/Power_of_two) 1145 | 1146 | ### 每个程序员都应该知道的延迟数 1147 | 1148 | ``` 1149 | Latency Comparison Numbers 1150 | -------------------------- 1151 | L1 cache reference 0.5 ns 1152 | Branch mispredict 5 ns 1153 | L2 cache reference 7 ns 14x L1 cache 1154 | Mutex lock/unlock 25 ns 1155 | Main memory reference 100 ns 20x L2 cache, 200x L1 cache 1156 | Compress 1K bytes with Zippy 10,000 ns 10 us 1157 | Send 1 KB bytes over 1 Gbps network 10,000 ns 10 us 1158 | Read 4 KB randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD 1159 | Read 1 MB sequentially from memory 250,000 ns 250 us 1160 | Round trip within same datacenter 500,000 ns 500 us 1161 | Read 1 MB sequentially from SSD* 1,000,000 ns 1,000 us 1 ms ~1GB/sec SSD, 4X memory 1162 | Disk seek 10,000,000 ns 10,000 us 10 ms 20x datacenter roundtrip 1163 | Read 1 MB sequentially from 1 Gbps 10,000,000 ns 10,000 us 10 ms 40x memory, 10X SSD 1164 | Read 1 MB sequentially from disk 30,000,000 ns 30,000 us 30 ms 120x memory, 30X SSD 1165 | Send packet CA->Netherlands->CA 150,000,000 ns 150,000 us 150 ms 1166 | 1167 | Notes 1168 | ----- 1169 | 1 ns = 10^-9 seconds 1170 | 1 us = 10^-6 seconds = 1,000 ns 1171 | 1 ms = 10^-3 seconds = 1,000 us = 1,000,000 ns 1172 | ``` 1173 | 1174 | 基于上述数字的指标: 1175 | 1176 | - 从磁盘以 30 MB/s 的速度顺序读取 1177 | - 以 100 MB/s 从 1 Gbps 的以太网顺序读取 1178 | - 从 SSD 以 1 GB/s 的速度读取 1179 | - 以 4 GB/s 的速度从主存读取 1180 | - 每秒能绕地球 6-7 圈 1181 | - 数据中心内每秒有 2,000 次往返 1182 | 1183 | #### 延迟数可视化 1184 | 1185 | ![](https://camo.githubusercontent.com/77f72259e1eb58596b564d1ad823af1853bc60a3/687474703a2f2f692e696d6775722e636f6d2f6b307431652e706e67) 1186 | 1187 | #### 来源及延伸阅读 1188 | 1189 | - [每个程序员都应该知道的延迟数 — 1](https://gist.github.com/jboner/2841832) 1190 | - [每个程序员都应该知道的延迟数 — 2](https://gist.github.com/hellerbarde/2843375) 1191 | - [关于建设大型分布式系统的的设计方案、课程和建议](http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf) 1192 | - [关于建设大型可拓展分布式系统的软件工程咨询](https://static.googleusercontent.com/media/research.google.com/en//people/jeff/stanford-295-talk.pdf) 1193 | --------------------------------------------------------------------------------