架构师技术要点

来源:互联网 发布:淘宝同款比价软件 编辑:程序博客网 时间:2024/06/05 15:40

目录

    • 目录
    • 编程语言
      • CC
      • Go
      • Java
      • Python
      • Lua
      • Shell
    • 设计模式
    • Java主流框架
    • IO复用机制
    • RPC远程调用
    • 消息队列
    • 大数据
    • 实时处理
    • 存储系统
    • 日志分析
    • 搜索
    • 分布式
    • 数据库
    • Web
    • 前端

1.编程语言

编程语言作为一门基础技能,是首先需要掌握的。主要能熟练运用当前的主流语言进行快速开发,同时还要了解它们之间的不同点,并对比优缺点,这样才能在架构设计时,保证语言选型的最优性。以及每一种语言与其它对比时,最大的特点及优势在哪里。

主要以下几个关键点
1.语言类型,如解释型语言,编译型语言
1).解释型语言不需要编译,在运行时,通过解释器解释执行;
2).编译型语言,在编译时直接编译成机器语言,运行时直接执行,所以相比解释型语言,运行效率会高一些
3)Java也是属于编译型语言,但编译时期不是直接编译成机器语言,而是编译成Java字节码,即.class文件,运行时通过JVM(JAVA虚拟机)再解释执行
2.编程范式
1).编程范式指的是一种编程思想,如面向过程,面向对象,函数式编程等;
2).Java、C#是面向对象编程语言;Haskell是函数式编程语言;而C++则是多范式的编程语言;
3.GC机制
1).现在的大部分语言都提供了自己的GC机制,所以对于开发人员要求会低一些,但要精通一门语言,也是需要了解每一种语言内部GC机制的实现原理;
2).c/c++本身不提供GC机制,内存的申请与释放都由开发人员来控制,增加了灵活性的同时也增加了异常的概率,如内存溢出,野指针等;
3).三大基础GC算法:
标记清除法/标记压缩法
复制收集算法
引用计数法
4.强弱类型,动静类型
1).强类型偏向于不容忍隐式类型转换,弱类型:偏向于容忍隐式类型转换;
2).动态类型语言,类型检查发生在运行期间,编译的时候就知道每一个变量的类型,因为类型错误而不能做的事情是语法错误,
如:python,php,javascript是动态类型的;
静态类型语言 类型检查发生在运行之前,编译的时候不知道每一个变量的类型,因为类型错误而不能做的事情是运行时错误,譬如说你不能对一个数字 a 写 a[10] 当数组用,并且可以在运行期间改变变量的类型;

C/C++

C/C++是基础编程语言,学校一般都学这两个语言。C是一门偏底层的语言,指针是一大特性,对于内存的理解会更深入,同时其它语言的引用也知道实现原理。C++兼容C语言,同时也是一种多范式语言。

Go

Go语言天生在语法层面支持高并发。对于如C/C++,Java语言使用者来说,在处理高并发时,一般会采用多进程,多线程,以及IO复用等,而Go语言中的高并发是一个协程的概念。所谓协程,也可以理解为一个轻量级的线程,是一个语言层面的资源调度,而不是系统的调度。多个协程运行在同一个CPU核心上面,与线程相比,在切换上下文的时候会更快。当然也可以通过设置利用多核,实现真正的并发。

Java

Java是现在最流行的语言,其生态圈也比较完善。是一门纯面向对象的语言,与C#很类似,只不过C#由于运行在.NET之上,而.NET又不开放,所以用得人比较少。Java与C++相比,简单很多,去掉了多继承(可以通过接口来实现),也没有指针的概念,还有GC机制,因为运行在JVM之上,所以跨平台也很容易。学习Java的人,对于设计模式的理解与运用,也会更深入一些。

Python

Python也是目前最热门的语言,简单易学,非常适合没有编程基础的同学作为入门语言来学习,属于解释型语言,开发效率也很高,爬虫程序一般都用python来实现。
python可扩展可嵌入,也易于移植,同时还有丰富的标准库及第三方库。
缺点是运行效率比较慢,可以考虑关键代码用C/C++来实现。

Lua

Lua 最大的好处就是小,绝对的小,可以嵌入任何程序而我们几乎可以忽略为此增加的大小。C\C++的绝好伴侣,C\C++是静态编译型语言,Lua是动态解释型语言.当然,要做到动态也不是不行,C++可以用模板,C可以用宏,但是大量使用这些特性的项目代码是不能看的…
所以,C\C++ + Lua = 性能 + 动态性. 一边是性能,一边是灵活;
要理解Lua和C++交互,首先要理解Lua堆栈。
简单来说,Lua和C/C++语言通信的主要方法是一个无处不在的虚拟栈。栈的特点是先进后出。在Lua中,Lua堆栈就是一个struct,堆栈索引的方式可是是正数也可以是负数,区别是:正数索引1永远表示栈底,负数索引-1永远表示栈顶。

Shell

Shell主要用于与Unix系统的交互,大多数场景可以被python替代。文本处理方面,主要依赖于awk、sed这两把尖刀,能够方便快捷地处理相当复杂的问题。对于系统管理员来说,还是有必要掌握的。

2.设计模式

学习java的人都比较了解,主要有23种设计模式,分为创建型,结构型,行为型,常用的设计模式都是需要理解的,同时也要理解一些开源的框架所采用的是什么设计模式。

3.Java主流框架

Struts:用于web应用的开发,实现了MVC的组件设计;
Hibernate:对象关系映射,封闭了JDBC的操作,以面向对象的思维操作数据库;
Spring:以DI(依赖注入)与AOP(面向切面编程)为核心的框架,其中DI也称为IoC(控制反转)用于管理Java对象之间的依赖关系,AOP用于解耦业务代码和公共服务代码(如日志,安全,事务等)。DI和AOP能够让代码更加简单,具有良好的松耦合特性和可测试性,极大地简化开发;
MyBatis:也是一种对象关系映射框架,hibernate主要是POJO 和数据库表之间的映射,以及SQL的自动生成和执行,而MyBatis是在于 POJO 与 SQL 之间的映射关系。然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO 。相对Hibernate“O/R”而言,Mybatis 是一种“Sql Mapping”的ORM实现;

4.IO复用机制

Select:I/O多路复用机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作;
select的几大缺点:
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024

Poll:Poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构;
Epoll:Epoll是对于Select,Poll的一种改进。Epoll没有描述符限制,epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次;

5.RPC远程调用

Thrift:Facebook开发的rpc框架,通过IDL定义服务接口,支持大多数的主流语言;
GRpc:Google开发的rpc框架,基于http协议,并用protobuf实现序列化;
Protocol buffer:Google定义的数据交换格式,二进制格式,相比xml,json交换有效率上的优势;

6.消息队列

RabbitMQ:遵循AMQP协议,由内在高并发的erlang语言开发,用在实时的对可靠性要求比较高的消息传递上;
Kafka:主要用于处理活跃的流式数据,大数据量的数据处理上;

7.大数据

Hadoop:处理大数据的分布式系统架构,基于HDFS分布式文件系统,以及MapReduce的数据分析处理;
MapReduce:大数据计算的一种编程模型,可以理解为分而治之的思想。Map的作用是将海量的数据进行映射,然后输出到Reduce,而Reduce则是实现将这些映射进行整合计算;
Spark:也是处理大数据的架构,但本身没有存储系统,需要第三方的存储系统支撑,一般建立在HDFS文件系统之上。与hadoop相比优势在于处理速度,Spark的大部分操作都是在内存中,而Hadoop的MapReduce系统会在每次操作之后将所有数据写回到物理存储介质上。这是为了确保在出现问题时能够完全恢复,但Spark的弹性分布式数据存储也能实现这一点。同时Spark有自己的机器学习库MLib,而Hadoop系统则需要借助第三方机器学习库,如Apache Mahout;

8.实时处理

Storm:Hadoop作为一个批处理系统,以其吞吐量大、自动容错等优点,在海量数据处理上得到了广泛的使用,而Storm更加注重实时处理的流数据;

9.存储系统

HDFS:Hadoop原生的分布式文件系统
HBase:使用ZooKeeper做它的分布式协调服务,面向列的开源数据库,它是一个适合于非结构化数据存储的数据库
Bigtable:Google设计的分布式数据存储系统,用来处理海量的数据的一种非关系型的数据库

10.日志分析

ELK:即Elastic Search+LogStash+Kibana,logstash用于采集日志,ES提供存储及搜索,Kibana提供可视化统计查询;
FileBeat:日志采集工具,比logstash更轻量;

11.搜索

Solr:搜索引擎,支持多种数据格式的索引,搜索海量数据,速度非常快,毫秒级返回结果。所以单纯的对已有的数据搜索,Solr更有优势。实时建立索引时, Solr会产生io阻塞,速度变慢;
Elastic Search:分布式搜索引擎,优势在于实时数据的搜索,ES在建立索引时,默认放在内存中。随着数据量的实时增加,ES的优势会更加明显。
Lucene:全文检索引擎工具包

12.分布式

Etcd:是一个采用HTTP协议的健/值对存储系统,它是一个分布式和功能层次配置系统,可用于构建服务发现系统。其很容易部署、安装和使用,提供了可靠的数据持久化特性。它是安全的并且文档也十分齐全;
Zookeeper:其数据存储的格式类似于文件系统,如果运行在一个服务器集群中,Zookeeper将跨所有节点共享配置状态,每个集群选举一个领袖,客户端可以连接到任何一台服务器获取数据;
Dubbo:Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合
Twemproxy:代理分片机制,本身也是单点,需要用Keepalived做高可用方案。
Keepalived:检测服务器状态的心跳机制,用于实现高可用。

13.数据库

Mongo:非关系型数据库,以Json格式的文档存储
Mysql:关系型数据库
Redis:key-value数据库,存储在内存,多用于缓存。同时还提供list,set,zset,hash等数据结构的存储
Memcached:key-value数据库,Memcached的内部内存管理机制虽然不像Redis的那样复杂,但却更具实际效率,这是因为Memcached在处理元数据时所消耗的内存资源相对更少,所以理适合只需读取操作的场景

14.Web

Nginx:Web服务器,以及反向代理服务器,提供多种负载均衡算法,如轮询,权重,IP绑定等;
Tomcat:通过与Nginx配合使用,实现动静分离,nginx返回静态页面的请求更快,而动态页面的处理由tomcat来实现;
Tengine:淘宝的web服务器,在Nginx基础之上,添加了一些功能。如组合多个CSS、JavaScript文件的访问请求变成一个请求,响应速度有优势;

15.前端

Html:超文本标记语言,前端页面显示
Css:层叠样式表,控制html的不同样式
Js:动态页面脚本语言