架构模式
系统朝大型系统衍变的过程中,如下几个架构模式是我们应该考虑也终将经历的。
分层
即对系统进行横向划分。比如进行MVC分层,又可分为接入层、业务层、核心数据层。应当禁止跨层调用以及逆向调用。
分割
即对系统进行纵向划分。比如在业务层上拆解业务,核心数据层上划分不同类型的数据,以方便流量控制等。
分布式
分布式部署一般耳熟能详。也是SOA中重要的一环。但是在没有高效分布式事务的前提下,如何在分布式中保证数据一致性,是首当其冲需要考虑的。分布式概念衍生出很多我们生产环境中常规的一些设计思路,比如将应用和服务分布式化;静态资源分布式部署即动静分离,以方便通过反向代理,加速等手段来加速与优化;nosql、sql等方式存储数据;分布式配置;分布式权限控制;分布式封禁;分布式锁;分布式文件系统如NFS;分布式计算,如阿里的天梯系统等。
集群
到了后期,为保证服务的性能和高可用,一般都会进行集群化部署,即将服务进行虚拟化处置。这中间就需要考虑负载均衡,健康检查,自动剔除等。
缓存
缓存在大型系统中的地位极其重要。其可以充当数据层的缓冲层,通过缓存热点数据,以及不常改变的数据来达到提升性能,减少数据持久层的压力等目的。缓存从前到后可以分为:CDN加速、反向代理、本地缓存、分布式缓存。
异步化
当并发过大超过服务吞吐能力时,采用消息队列(比如RabbitMQ, ActiveMQ, Kafka)可以达到削峰的目的。
冗余
进行适当的热备、冷备也是比较重要的。比如RabbitMQ就可以通过冗余来保证数据的可靠性。
自动化
自动化部署、发布、测试、监控、报警、降级、资源分配等都是一个必须要考虑的议题。
安全
手机验证码、图形验证码、以及敏感信息过滤、防SQL注入、防XSS攻击(如CSRF)等。
核心架构要素
性能
几个tips: 浏览器端利用浏览器缓存、使用页面压缩、减少Cookie传输; 传输上采用CDN加速和反向代理服务器; 服务器端利用本地/分布式缓存;结合消息队列实现异步化;集群化虚拟化; 代码层面采用多线程,以及JVM优化,利用弱键等其他手段 数据库端,适当采用索引,利用DB缓存(默认打开),SQL优化,利用NOSQL,NEWSQL优化 性能的衡量标准一般可以看平响、吞吐量(TPS、QPS)等。
可用性
一般就三个手段、冗余、集群化、分布式。
伸缩性
服务尽量同构。DB、cache在考虑分布式时尽量提前设计好扩展方案。也可以采用一些主流的对水平伸缩支持较好的nosql、memcached、hbase等。
扩展性
这个没啥好说。扩展性依赖于前期良好的架构设计。合理业务逻辑抽象,水平/垂直切割分布式化等等。
安全性
如上。