Thursday, December 3, 2015

淘宝技术这十年



http://www.cnblogs.com/DjangoBlog/p/3535452.html

淘宝开始的很早,很多开源技术还没出现或者不被人所知,如果今天开始做的话,可能有很多东西会直接拿来用或者改进了,比如 memcache,redis, voldemort, kafka, storm, thrift + twitter finagle.

一开始如果能多考虑点可扩展的架构,日后一旦壮大,重构会不那么痛苦。具体实现视情况打折扣,理想实现是即使在单机上也按照分布式应用思路做,但肯定没办法这么理想,进度所迫,产品设计总在变化,需求总在变。无论如何,一开始完全不考虑一味求糙快猛是愚蠢的,忽视业界经验,尤其是这本书讲到的经验,有可能日后中道崩殂。

技术对了,产品设计对了,未必能成功,因为时机可能不对,用户一时接受不了。

好的设计是磨练出来的,再好的架构师也没法一锤定音,一方面是流量上来后各种未预料到的问题,另一方面是没有完全一模一样的需求,各种未预料到的需求。即使如此,互联网行业的系统架构还是有粗略套路可循的,因为同一行业内要解决的事情总有类似的。

可供参考的技术,不完全是书中提到的。
    1. load balancing + high availability
      • DNS server 根据客户端的 IP 对应的地理位置对同一域名解析出不同的 IP 地址,以把用户请求导向不同的机房;
      • 在页面里嵌入一段 JS 脚本,同时请求多个机房的某相同资源,服务端可以记录下请求日志,然后经由后台的日志分析系统分析出这个客户端请求哪个机房最快,这个信息可以用来改进上面的第一种办法;
      • 在域名解析完成后,客户端的请求被发送到指定 IP 上,这个 IP 上部署 LVS(工作在 OSI 网络模型第四层),LVS 后面部署 HAProxy(工作在 OSI 网络模型第七层),两层一起做 load balancer,综合 LVS 的高效以及 HAProxy 的丰富特性。
        • Apache 和 Nginx 也有 proxy 功能,但术业有专攻,流量特别大的时候效率肯定还是比不上 HAProxy
        • 各位看官,貌似不要 LVS 也行吧? HAProxy 加上 keepalived or pacemaker + corosync/heartbeat 也能避免单点故障。
    2. edge cache: Apache Traffic Server, Squid, Varnish,用来缓存静态内容或者一段时间内不变的动态内容
    3. http server:  Nginx, Apache, Tomcat, Jetty
      • 在展现层上免不了走两条路子:服务端模板技术,在服务端全渲染好;AJAX 方式。虽然两者并不排斥,但个人觉得 AJAX 方式优雅的多,一开始就把 service 和 UI 分离开了,开发也容易,前端工程师和后端工程师不用在模板文件上打架。
    4. session persistence
      • session ID
        • cookie
        • url parameter,比如 JSESSIONID=xxx
      • session 的存储
        • 直接把信息放在 cookie 里,QPS 高时带宽浪费严重
        • http server 本地磁盘,需要 load balancer 支持 sticky session,单个 http server 崩溃会丢失 session 数据
        • global session storage: redis, rdbms + memcache
    5. RPC system,切分各个服务后,服务之间需要统一而且高效的 RPC 机制
      • service registry,这是每个创业公司一开始都会忽视的东西,而一旦壮大后都必需得做,尤其是把各种功能分割到不同子系统成为服务之后。
      • RPC framework:  thrift, twitter finagle
    6. cache:  memcache, redis, tairvoldemort
    7. storage: 分布式存储应该是整个技术栈里最难的部分了。
      • 关系数据库:MySQL, PostgreSQL
        • 这俩数据库都是单机版本,要达到集群效果需要做大量工作:分库分表、join、分页、事务、failover、负载均衡,尽可能自动化的导入导出、增减实例,目测只有 Google、Facebook和淘宝玩的很溜。
      • NoSQL: HBase, Cassandra, Riak, RethinkDB, CouchBase,Voldemort
      • 小文件存储:TFS,MogileFS, FastDFS
    8. 消息队列:这类产品多如牛毛,但能同时支持至少一次、至多一次、保序特性的还是不多。多提一句的是 Redis 集群(官方的抑或各种山寨的)都是 AP 系统,不是 CP 系统,作为 queue 不适合严肃场合(作为 storage 也如此)
    9. 任务队列:GearmanCelery
    10. 系统监测:Nagios, Ganglia, Graphitestatsd
    11. 日志收集:Kafka, Flume, Fluentd, KibanaLinkedIn 的实践非常值得参考,尤其值得一提的是 schema registry 的概念,没有这个服务,很难利用收集的数据。
    12. 数据分析:Hadoop, Storm, Spark, Presto
    13. 自动化部署:PuppetChefAnsible 等。

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts