前一段时间在网上看见了一篇文章内容大致是作为一个架构师你需要拥有什么样的能力,其中不过是包括以下几个点:
1、对于Java基础技术体系(包括JVM、类装载机制、多线程并发、IO、网络)有一定的掌握和应用经验。
2、对面向对象的软件开发思想有清晰的认识、熟悉掌握常用的设计模式;
3、熟练掌握目前流行开源框架(spring/springmvc/ibatis),并且对其核心思想、实现原理有一定认知;
4、熟悉Oracle、MySQL等数据库开发与设计以及缓存系统REDIS或 Memcached的设计和研发;
5、熟悉底层中间件、分布式技术(包括缓存、消息系统、热部署、JMX等)
6、至少一种Java应用服务器如tomcat
7、精通shell编程,熟练应用awk、sed、grep、strace、tcudump、gdb等常用命令;
8、有大型分布式、高并发、高负载(大数据量)、高可用性系统设计开发经验
9、对配置管理和敏捷研发模式有所了解
10、业务能力
当然以上的十点都是一个高级架构所应该掌握的或者说已经有拥有的能力,而就算我们知道架构师需要这样的能力了,其实离架构师的阶段还差很远,就像你高考的时候知道要考数理化,政史地。我们知道这些是考试的科目,而如何去得到这些东西或者去如何应对高考中的每个知识点,所以知道应该要掌握技术的方向之后当然就是去学习里面的具体知识;
下面我就以分布式架构这个专题来介绍下需要哪些具体的知识点,你又如何来获得这些知识点;
一,通信
既然是分布式系统,系统间通信的技术就不可避免的要掌握。
首先要掌握一些基础知识,例如网络通信协议(诸如TCP/UDP等等)、网络IO(Blocking-IO,NonBlocking-IO、Asyn-IO)、网卡(多队列等);更偏应用的层面,需要了解例如连接复用、序列化/反序列化、RPC、负载均衡等。
通信连接方式:
大量的连接通常会有两种方式:
1.大量client连一个server
在现如今NonBlocking-IO这么成熟的情况下,一个支持大量client的server已经不那么难写了。
有一个点要特别注意,就是当server挂掉的时候,不能出现所有client都在一个时间点发起重连,那样基本就是灾难。
通常可以采用的方法是client重连前都做随机时间的sleep,另外就是重连的间隔采取避让算法。
二,伸缩性
分布式系统基本就意味着规模不小了,对于这类系统在设计的时候必须考虑伸缩性问题,架构图上画的任何一个点,如果请求量或者是数据量不断增大,怎么做到可以通过加机器的方式来解决,当然,这个过程也不用考虑无限大的场景,如果经历过从比较小到非常大规模的架构师,显然优势是不小的,同样也会是越来越稀缺的。
伸缩性的问题围绕着以下两种场景在解决:
1.无状态场景
无状态场景通常会把很多状态放在db,当量到一定阶段后会需要引入服务化,去缓解对db连接数太多的情况。
2.有状态场景
所谓状态其实就是数据,通常采用Sharding来实现伸缩性,Sharding有多种的实现方式,常见的有这么一些:
2.1规则Sharding
2.2一致性Hash
2.3Auto ShardingAuto Sharding的好处是基本上不用管数据搬迁,而且随着量上涨加机器就OK,但通常Auto Sharding的情况下对如何使用会有比较高的要求,
而这个通常也就会造成一些限制,这种方案例如HBase。
2.4CopyCopy这种常见于读远多于写的情况,实现起来又会有最终一致的方案和全局一致的方案,最终一致的多数可通过消息机制等,
全局一致的例如zookeeper/etcd之类的,既要全局一致又要做到很高的写支撑能力就很难实现了。
三,稳定性
作为分布式系统,必须要考虑清楚整个系统中任何一个点挂掉应该怎么处理(到了一定机器规模,每天挂掉一些机器很正常),同样主要还是分成了无状态和有状态:
1.无状态场景对于无状态场景,通常好办,只用节点发现的机制上具备心跳等检测机制就OK,经验上来说无非就是纯粹靠4层的检测对业务不太够,通常得做成7层的,当然,做成7层的就得处理好规模大了后的问题
2.有状态场景全局一致类型的场景中,如果一台挂了,就通常意味着得有选举机制来决定其他机器哪台成为主,常见的例如基于paxos的实现。可维护性整个系统环境应该怎么搭建,部署,配套的维护工具、监控点、报警点、问题定位、问题处理策略等等。
四,可维护性
维护性是很容易被遗漏的部分,但对分布式系统来说其实是很重要的部分,例如整个系统环境应该怎么搭建,部署,配套的维护工具、监控点、报警点、问题定位、问题处理策略等等。