11. 考虑把web应用程序分解为服务 上帝保佑,如果你负责的web应用程序超过50万行代码,而且仍然只作单一的项目部署,那么是时候根据服务功能把它分解成专业的服务了,并分配到不同的子组织或团队去操作。将Web应用程序分解为服务有以下诸多优势:
- Debug将变得简单
- 扩展及让子系统运行的更好将变得简单
- 很容易了解运行环境里发生了什么
- 更快的添加新功能
12. 不要使用session stickiness 这绝是与魔鬼共舞,session stickiness会让极值负荷下无法扩展。你的客户端应该能够调用ANY应用程序服务器,并得到其查询值。其中一个方法是让服务无状态,也称为RestFUL服务。每个请求,客户端会收发标识状态的id,代表客户session的数据存储在数据库或跨多个请求的分布式缓存。 如果因为某个原因,取代RestFUL服务,你网站大部分是建立在HttpServlets和HttpSession属性上,使用以下方法可以实现独立session stickiness的网站: 一个servlet过滤器面对每项服务,取走每个请求的id,然后调用分布式缓存来填充会话属性,这将有助于处理请求。因此数据中心任何服务器都可以响应来自客户端的请求,因为session状态被保持在memcached。 不使用session stickiness还允许使用“rolling restart”方式重启你的应用程序服务器集群,从而实现100%的正常运行时间。 13. 终止反向代理商的SSL 在SSL信号交换及潜在TCP通信有效保持上,反向代理非常擅长。在反向代理有上设定一个显式的TCP维持计时器,nGinx及许多其他http服务器都允许这么做,这允许TCP连接多次重复使用。与TCP信号交换的成本是3个network call,这样许多请求就可以避免这个开销。 因此从反向代理到应用程序服务器,通常是RAW http;因此,同样也要维持TCP的上行连接。 14. 为GSLB类型的负载平衡器使用粘性负载平衡 跨数据中心的负载平衡,建议使用session stickiness。这是因为在跨数据中心复制上,数据库Oracle或Cassandra只能依赖最终一致性技术。因此,非粘性跨数据中心负载均衡器将使你的客户端再也无法访问网站。因此经常使用GSLB,多数情况下,你的CDN将获得基于位置的GSLB数据中心解决方案。 15. 减少主页上的CNAME查找 尽量减少主页上的CNAME查找。单单主页的CNAME查找,一些网站就有10个或更多。即使客户端DNS查找的答案可能来自他们的ISP递归缓存,我们仍然可以做的更好。www.amazon.com CNAME查找为零。 dig
www.amazon.com
;; QUESTION SECTION:
;www.amazon.com. IN A
;; ANSWER SECTION:
www.amazon.com.28 IN A 205.251.242.54 16. 拥抱一切“reactor” 在高流量软件系统中,reactor模式一次又一次的得以证明。一系列框架被创建用以实现reactor模式,reactor大致使用场景如下:
- 作为一个反向代理:nGinx
- 应用程序服务器: node.js
- 并行处理的: Scala的actor model
除非你的业务逻辑是高度CPU绑定,否则就得考虑使用reactor模式或基于事件循环的软件。如果无法实现,可以考虑像RxJava框架那样的响应式编程模型。 17. 实现调用取消 从Siddharth Anand的一个会议上得到灵感,服务调用时的调用图。首先,通过数字的递减实现超时。接下来,服务调用图的每次调用,都会创建一个UUID,并在分布式缓存中为UUID设置一个标志: UUID:true
- 如果服务调用图中的任何服务超时,UUID的标志设置为false。
- 现在为所有服务实现一个servlet过滤器,一直检查这个标志,只在这个标志是真时才继续处理。
- 如果标志是是假,程序返回一个空的response。
- 这在大业务量时,可以禁止不必要的调用。
18. 执行GC搜索协议 再次,灵感来自于同一个人——通过Netty让所有的服务也显示一个TCP端口。在调用一个服务之前,调用TCP端口然后暂停2 - 5 ms等待访问。如果调用超时,这意味着这个Java进程正字做一个“stop the world”的垃圾收集。客户立即切换到另一个服务实例,然后尝试同样的步骤。如果调用成功,然后调用实例上的实际服务。 注意:实现GC搜索协议需要的客户端ip地址配置(即客户端负载均衡)。 19. 尽可能让业务逻辑和I / O存取异步进行 在流量爆炸时,异步业务逻辑能让您的应用程序避免建立过多的线程。将事件队列推送给负载均衡集群,让它去做进程订阅的业务逻辑,而不是在http request/response周期线程做这些事。 20. 偏爱最终一致性数据库 尤其是当你在运行跨数据中心的应用程序。除非你的用例是事务处理的(比如订单)等等,否则偏爱使用最终一致性数据库比如Cassandra,并尽可能少的使用ACID类型数据库。 21. 使用CDN服务静态内容 使用CDN服务静态内容——javascript、图像、css 等。CDN能有效地将静态内容复制到近客户地方,因此许多针对这些静态内容的http请求最终穿越不会超过几百英里。 22. 打包压缩javascript到一个文件中 减少javascript内联。 注意:不要在pre-prod环境中这么做,这里需要使用调试程序做javascript的debug。 |