掌握架构设计的一些知识
架构是架子和构成
1. 操作系统层面
这个说起来话就长了,我用过的就是DOS,Windows,Unix,Solaris,各种Linux,还有一些其他的OS/2之类我没用过的
掌握操作系统特性,比如Windows的运行机制,Win32窗口机制,Windows服务机制,Windows文件系统等等,Linux也一样,包含前面没提到的内存管理机制,网络通讯机制,各种操作系统之间是存在一些显著差异的,但是基本上都是有对应和相似之处
2. 数据库,像MySQL/Oracle/SQLServer/DB2/ PostgreSQL等等,还有列式数据库
不仅能存储结构化,也可以存储非结构化、序列化等数据,掌握数据库存储的一些必要知识,有一本黑色封面的数据仓库的书很好,掌握基本SQL语法(ANSI92之类的)之外,再了解一些范式,范式的好坏,冗余设计的必要性,索引优化,全文检索等等,还有一些主从机制,分布式部署机制等等
3. NoSQL
掌握数据库,就知道为什么要NoSQL,稍微了解下NoSQL的起源,像MongoDB、Redis是比较有代表性的,当然还有Memcached,这些是有区别的,所以在架构应用中,有时候会充当存储以外不同的角色,比如缓存层
4. 应用服务器
这里就相对有意思了,可以分B/S、C/S架构下的不同区别,但是不单独说,只说一些当下比较widely的B/S架构,例如Tomcat、JBoss、IIS、还有以前的BEA的WebLogic,IBM的WebSphere等等,一般你掌握的编程语言写的业务逻辑,就部署在这里,有时候我们会叫应用服务器也叫容器,一般能够直接提供HTTP/HTTPS访问能力,常规C/S服务器实现的时候,协议一般是私有协议,可以是基于RPC或者其他socket的私有协议
5. 反向代理/负载均衡/HTTP服务器
当我们的应用部署在某一个应用服务器时,一台应用服务器常常满足不了很多用户访问,所以要部署多台,这时候就需要一个负载均衡服务将一组应用服务器代理为对外统一服务,需要了解这里面有的不同的负载均衡策略和机制,通常也将应用服务器中静态化的内容,例如html/css/js/images等文件部署在这里,提供高速访问,其中nignx是比较优秀的,当然apache也有这样的功能,当然反向代理还有一些安全控制等等
6. 缓存层
缓存层基本作用是实现减少对数据库或其他介质的直接读访问,从而提高性能,原理上是直接读内存,减少读IO设备,表现上其实和整个计算器体系相似,又和各模块原理相似,比如硬盘也有缓存,CPU有L1、L2等缓存,又和单机不同,主要是作用规模上和业务上的区别,上面提到的Redis和 Memcached经常被用来提高访问效率,常应用于应用服务中,或架构其他必要的地方,扩展了解下缓存雪崩,缓存击穿等等知识
7. 消息队列/MQ
消息队列例如ActiveMQ,IBM MQ,MSMQ,Kafka,RabbitMQ等等有很多,一般提供发布订阅/队列/消费者/生产者等等模式,在整个架构体系中负责解耦,对于高并发要求的系统再辅助分布式消息对列实现万/亿级的高性能系统尤其重要,扩展了解一下ZeroMQ,比较有意思,加深对网络编程的理解
8. 高可用HA
一般如何保障高可用的方案有很多种包括软硬件,Nignx本身提供负债均衡机制也是一种高可用实现方案,其次,还有HAProxy可以用来补足Nignx不具备的一些地方,这些服务通常会配合KeepAlived一起使用,以保证高可用,当然,还有LVS,这个可以进阶了解一下
9. 分布式/分布式管理/同步/数据一致性
分布式系统架构常常将读和写分离,写入又变成异步写入,甚至是多个子系统的异步写入,这时候如何保障数据的一致性,原子性,可靠性,甚至实时性,就是一个问题,如何将分布式服务一起封装为一个高效可用的集群服务,就是一个问题,常常跟随着架构设计运行改进的整个生命周期,然后就可以去看下Zookeeper了
10. 安全性
安全性是个很大的范畴,用户名密码的规范都属于安全范畴,这里只稍微提一下几个方面的安全,证书安全,提供https访问显然是当下必不可少的安全手段,其次,运维上将生产区合理划分,制定安全访问规则规范,上云的服务器就关注下防火墙服务,系统内的数据安全,就要看那些是敏感数据,最简单的比如用户的密码,加把盐吧,盐怎么加,可以深入了解一下
11. 域名/网址/服务/入口/轮询
申请一个域名,一个域名绑定了多组服务器,服务器运行在不同线路的机房或者BGP线路,如何将上百,上万台服务器交给一个域名,多个域名子域名访问,就是这里需要了解的,DNS解析、DNS轮询也是负债均衡的必备,基本上就是将A记录分配到不同IP
12. 源代码管理/持续集成/自动化运维/devops
这块就很宽泛了,从开发到测试,上线贯穿整个软件产品生命周期的管理工具很多,方法很多,了解下源代码管理工具CVS/SVN/GIT/HG/TFS等,开发自然离不开构建ANT/MAVEN,再到Hudson/Jenkins,部署用docker/k8s等等,还有各种运维监控工具,性能监控工具,日志收集等等,好的架构必定是需要考虑工程化问题的,我记得有个早先有架构4+1视图,部署就在里面,系统架构最终都是需要部署和运行的,持续可运行才是目标,开发过程不是
13. 协议/序列化/规范/约束
架构设计中比较关键的是协议,无论是基于HTTP的还是私有协议的,遵循协议规范,尤其重要,浏览器遵循了规范,各种HTTP状态需要用好,私有协议也可以考虑json/protobuf等等,在序列化上有性能考虑的或者其他特定业务场景的,比如说行情接入等等,按照规范接入文本或者xml等协议,尤其注意减少内存复制等,约束是架构设计中非常需要关注的,各个子系统之间如何规范约束,是保障架构不会乱七八糟的基础,这个需要额外的话题
14. 客户端/iOS/Android/MFC/DirectUI/H5
客户端技术经过这么多年发展,到现在移动端的蓬勃,其实是有迹可循的,客户端一般和操作系统紧密相连,不管是Win32运行在Windows上的界面,还是app运行在iOS或者Android上,总是离不开的是窗体,按钮,布局,事件,重绘,双缓冲,GDI,DirectX等等,挺好的一个方向,也是最接近用户的地方,还有就是H5,前往不能会用Vue,Bootstrap,Angular之类的,忘记ECMA,更好的掌握原生的,还有CSS各种应用,这块特别重要得得掌握运行环境,运行引擎,交互原理等等,还有就是H5/JS和原生应用以及桌面应用之间的交互,internal call,intercepted等等
15. 其他SSO/OpenID/第三方接入/推送
以前是A站点和B站点集成或者AD/LADP集成认证等,现代架构,特别是互联网架构是个多方应用用户组成的,微信/QQ/微博/支付宝授权登录,第三方支付接入,给用户推送信息,等等,这一类基本上遵循对方的规范前提下,正确的结合好自身业务系统数据,根据系统架构规模,将这个地方的应用集约即可
16. 大数据/数据仓库/ETL/报表
早先SQL Server自带一个DTS/SSIS工具,Oracle有Warehouse(OWB)等等,大数据少不了ETL部分,ETL就是Extract抽取Transfom转换Load装载,开源的方案也有很多,比如现在的Kettle,还有CloverETL等等,这块里面范畴很大,维度,Cube,OLAP都是必要了解的,当然Hadoop,HDFS,Storm等都可以是大数据方案种的解决方案选择,还有Hbase等等
17. 额外扩展一些乱七八糟的
串口通讯232/422/485,还有USB口通讯,有些硬件直接发指令的交互,从主板南北桥到IO控制,还有时钟芯片,都了解一下,编程语言的不同,大多就意味着运行机制的不同,比如解释运行还是编译运行,在不同操作系统下入口地址不同等等,编译原理再掌握一点LLVM什么的就更加了,Linux内核尝试一下自己做做裁剪,没准搞个自己的发行版也是可以,Debian,Ubuntu,Redhat啊之类的,以及字符集,ISO8859-1,UTF8,Unicode之类的,还有TCP/UDP等等各种通讯原理得扎实,最重要的是建立知识体系的索引,用到什么碰到什么就可以定位什么解决什么,准确的定位能力尤其重要,准确的定位能力又来自于对整个知识体系的积累和学习
18. 想起来再写…