Hadoop概论
大数据行业背景分析
1.大数据产生的背景
<div class="mdContent">
进入2012年,大数据(big data)一词越来越多地被提及,人们用它来描述和定义信息爆炸时代产生的海量数
大数据时代来临
大数据时代来临
据,并命名与之相关的技术发展与创新。它已经上过《纽约时报》《华尔街日报》的专栏封面,进入美国白宫官网的新闻,现身在国内一些互联网主题的讲座沙龙中,甚至被嗅觉灵敏的国金证券、国泰君安、银河证券等写进了投资推荐报告。 [1]
数据正在迅速膨胀并变大,它决定着企业的未来发展,虽然很多企业可能并没有意识到数据爆炸性增长带来问题的隐患,但是随着时间的推移,人们将越来越多的意识到数据对企业的重要性。
正如《纽约时报》2012年2月的一篇专栏中所称,“大数据”时代已经降临,在商业、经济及其他领域中,决策将日益基于数据和分析而作出,而并非基于经验和直觉。
哈佛大学社会学教授加里·金说:“这是一场革命,庞大的数据资源使得各个领域开始了量化进程,无论学术界、商界还是政府,所有领域都将开始这种进程。”
</div>
2.大数据应用领域
<div class="mdContent">
一、金融领域
大数据所带来的社会变革已经深入到人们生活的各个方面,金融创新离不开大数据,日常的出行、购物、运动、理财等等。金融业面临众多前所未有的跨界竞争对手,市场格局、业务流程将发生巨大改变。未来的金融业将开展新一轮围绕大数据的IT建设投资。
据悉,目前,中国的金融行业数据量已经超过100TB,非结构化数据迅速增长。分析人士认为,中国金融行业正在步入大数据时代的初级阶段。优秀的数据分析能力是当今金融市场创新的关键,资本管理、交易执行、安全和反欺诈等相关的数据洞察力,成为金融企业运作和发展的核心竞争力。
二、安防领域
作为信息时代海量数据的来源之一,视频监控产生了巨大的信息数据。物联网在安防领域应用无处不在,特别是近几年随着平安城市、智能交通等行业的快速发展,大集成、大联网、云技术推动安防行业进入大数据时代。安防行业大数据的存在已经被越来越多的人熟知,特别是安防行业海量的非结构化视频数据,以及飞速增长的特征数据,带动了大数据应用的一系列问题。
三、能源领域
能源大数据理念是将电力、石油、燃气等能源领域数据及人口、地理、气象等其他领域数据进行综合采集、处理、分析与应用的相关技术与思想。能源大数据不仅是大数据技术在能源领域的深入应用,也是能源生产、消费及相关技术革命与大数据理念的深度融合,将加速推进能源产业发展及商业模式创新。
四、业务领域
大数据也更多的帮助业务流程的优化。物联网和大数据,成为产业新价值,我们可以通过利用社交媒体数据、网络搜索以及天气预报挖掘出有价值的数据,其中大数据的应用最广泛的就是供应链以及配送路线的优化。在这2个方面,地理定位和无线电频率的识别追踪货物和送货车,利用实时交通路线数据制定更加优化的路线。人力资源业务也通过大数据的分析来进行改进,这其中就包括了人才招聘的优化。
五、医疗领域
大数据分析应用的计算能力可以让我们能够在几分钟内就可以解码整个DNA。并且让我们可以制定出最新的治疗方案。同时可以更好的去理解和预测疾病。就好像人们戴上智能手表等可以产生的数据一样,大数据同样可以帮助病人对于病情进行更好的治疗。在医疗领域中,物联网的重大作用就表现在大数据上。大数据技术目前已经在医院应用监视早产婴儿和患病婴儿的情况,通过记录和分析婴儿的心跳,医生针对婴儿的身体可能会出现不适症状做出预测。这样可以帮助医生更好的救助婴儿。
六、电力行业领域
大数据对该行业的应用主要体现在智能电网上,通过获取人们的用电行为信息,大数据分析对智慧城市建设的意义和智能电网是密不可分的。智能电网能够实现优化电的生产、分配以及消耗,有利于电网安全检测与控制(包括大灾难预警与处理、供电与电力调度决策支持和更准确的用电量预测)、客户用电行为分析与客户细分,电力企业精细化运营管理等多方面,实现更科学的电力需求管理。
</div>
Hadoop概述
<div class="mdContent">
Hadoop家族
大数据学习路线介绍
一、Linux
lucene: 全文检索引擎的架构
solr: 基于lucene的全文搜索服务器,实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面。
二、Hadoop
HDFS: 分布式存储系统,包含NameNode,DataNode。NameNode:元数据,DataNode。DataNode:存数数据。
yarn: 可以理解为MapReduce的协调机制,本质就是Hadoop的处理分析机制,分为ResourceManager NodeManager。
MapReduce: 软件框架,编写程序。
Hive: 数据仓库 可以用SQL查询,可以运行Map/Reduce程序。用来计算趋势或者网站日志,不应用于实时查询,需要很长时间返回结果。
HBase: 数据库。非常适合用来做大数据的实时查询。Facebook用Hbase存储消息数据并进行消息实时的分析
ZooKeeper: 针对大型分布式的可靠性协调系统。Hadoop的分布式同步等靠Zookeeper实现,例如多个NameNode,active standby切换。
Sqoop: 数据库相互转移,关系型数据库和HDFS相互转移
Mahout: 可扩展的机器学习和数据挖掘库。用来做推荐挖掘,聚集,分类,频繁项集挖掘。
Chukwa: 开源收集系统,监视大型分布式系统,建立在HDFS和Map/Reduce框架之上。显示、监视、分析结果。
Ambari: 用于配置、管理和监视Hadoop集群,基于Web,界面友好。
二、Cloudera
Cloudera Manager: 管理 监控 诊断 集成
Cloudera CDH:(Cloudera's Distribution,including Apache Hadoop) Cloudera对Hadoop做了相应的改变,发行版本称为CDH。
Cloudera Flume: 日志收集系统,支持在日志系统中定制各类数据发送方,用来收集数据。
Cloudera Impala: 对存储在Apache Hadoop的HDFS,HBase的数据提供直接查询互动的SQL。
Cloudera hue: web管理器,包括hue ui,hui server,hui db。hue提供所有CDH组件的shell界面的接口,可以在hue编写mr。
三、机器学习/R
R: 用于统计分析、绘图的语言和操作环境,目前有Hadoop-R
mahout: 提供可扩展的机器学习领域经典算法的实现,包括聚类、分类、推荐过滤、频繁子项挖掘等,且可通过Hadoop扩展到云中。
四、storm
Storm: 分布式,容错的实时流式计算系统,可以用作实时分析,在线机器学习,信息流处理,连续性计算,分布式RPC,实时处理消息并更新数据库。
Kafka: 高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据(浏览,搜索等)。相对Hadoop的日志数据和离线分析,可以实现实时处理。目前通过Hadoop的并行加载机制来统一线上和离线的消息处理
Redis: 由c语言编写,支持网络、可基于内存亦可持久化的日志型、key-value型数据库。
五、Spark
Scala: 一种类似java的完全面向对象的编程语言。
jblas: 一个快速的线性代数库(JAVA)。基于BLAS与LAPACK,矩阵计算实际的行业标准,并使用先进的基础设施等所有的计算程序的ATLAS艺术的实现,使其非常快。
Spark: Spark是在Scala语言中实现的类似于Hadoop MapReduce的通用并行框架,除了Hadoop MapReduce所具有的优点,但不同于MapReduce的是job中间输出结果可以保存在内存中,从而不需要读写HDFS,因此Spark能更好的适用于数据挖掘与机器学习等需要迭代的MapReduce算法。可以和Hadoop文件系统并行运作,用过Mesos的第三方集群框架可以支持此行为。
Spark SQL: 作为Apache Spark大数据框架的一部分,可用于结构化数据处理并可以执行类似SQL的Spark数据查询
Spark Streaming: 一种构建在Spark上的实时计算框架,扩展了Spark处理大数据流式数据的能力。
Spark MLlib: MLlib是Spark是常用的机器学习算法的实现库,目前(2014.05)支持二元分类,回归,聚类以及协同过滤。同时也包括一个底层的梯度下降优化基础算法。MLlib以来jblas线性代数库,jblas本身以来远程的Fortran程序。
Spark GraphX: GraphX是Spark中用于图和图并行计算的API,可以在Spark之上提供一站式数据解决方案,可以方便且高效地完成图计算的一整套流水作业。
Fortran: 最早出现的计算机高级程序设计语言,广泛应用于科学和工程计算领域。
BLAS: 基础线性代数子程序库,拥有大量已经编写好的关于线性代数运算的程序。
LAPACK: 著名的公开软件,包含了求解科学与工程计算中最常见的数值线性代数问题,如求解线性方程组、线性最小二乘问题、特征值问题和奇异值问题等。
ATLAS: BLAS线性算法库的优化版本。
Spark Python: Spark是由scala语言编写的,但是为了推广和兼容,提供了java和python接口。
六、Python
Python: 一种面向对象的、解释型计算机程序设计语言。
七、云计算平台
Docker: 开源的应用容器引擎
kvm: (Keyboard Video Mouse)
openstack: 开源的云计算管理平台项目
</div>
分布式原理(存储原理,计算原理)
<div class="mdContent">
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。内聚性是指每一个数据库分布节点高度自治,有本地的数据库管理系统。透明性是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。在分布式数据库系统中,用户感觉不到数据是分布的,即用户不须知道关系是否分割、有无副本、数据存于哪个站点以及事务在哪个站点上执行等。
</div>
分布式存储原理
<div class="mdContent">
分布式存储简单的来说,就是将数据分散存储到多个存储服务器上,并将这些分散的存储资源构成一个虚拟的存储设备,实际上数据分散的存储在企业的各个角落。
还可以这样理解:
利用分布式技术将标准X86服务器的本地HDD、SSD等存储介质组织成一个大规模存储资源池,同时,对上层的应用和虚拟机提供工业界标准的SCSI、iSCSI和对象访问接口,进而打造一个虚拟的分布式统一存储产品。
分布式存储架构由三个部分组成:客户端、元数据服务器和数据服务器。客户端负责发送读写请求,缓存文件元数据和文件数据。元数据服务器负责管理元数据和处理客户端的请求,是整个系统的核心组件。数据服务器负责存放文件数据,保证数据的可用性和完整性。该架构的好处是性能和容量能够同时拓展,系统规模具有很强的伸缩性。
</div>
分布式计算原理
<div class="mdContent">
什么是分布式计算?所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。分布式网络存储技术是将数据分散的存储于多台独立的机器设备上。分布式网络存储系统采用 可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但解决了传统集中式存储系统中单存储服务器的瓶颈问题,还提高了系统的可靠性、可用性和扩展性。
</div>
Java RPC通信原理及分布式架构
<div class="mdContent">
一、RPC简介
RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地服务一样调用远程服务。它可以有不同的实现方式。如RMI(远程方法调用)、Hessian、Http invoker等。另外,RPC是与语言无关的。
RPC示意图
image
如上图所示,假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回。但从后续调用可以看出Computer1调用的是Computer2中的sayHi()方法,RPC屏蔽了底层的实现细节,让调用者无需关注网络通信,数据传输等细节。
二、RPC框架的实现
上面介绍了RPC的核心原理:RPC能够让本地应用简单、高效地调用服务器中的过程(服务)。它主要应用在分布式系统。如Hadoop中的IPC组件。但怎样实现一个RPC框架呢?
从下面几个方面思考,仅供参考:
1.通信模型:假设通信的为A机器与B机器,A与B之间有通信模型,在Java中一般基于BIO或NIO;。
2.过程(服务)定位:使用给定的通信方式,与确定IP与端口及方法名称确定具体的过程或方法;
3.远程代理对象:本地调用的方法(服务)其实是远程方法的本地代理,因此可能需要一个远程代理对象,对于Java而言,远程代理对象可以使用Java的动态对象实现,封装了调用远程方法调用;
4.序列化,将对象名称、方法名称、参数等对象信息进行网络传输需要转换成二进制传输,这里可能需要不同的序列化技术方案。如:protobuf,Arvo等。
三、Java实现RPC框架
1、实现技术方案
下面使用比较原始的方案实现RPC框架,采用Socket通信、动态代理与反射与Java原生的序列化。
2、RPC框架架构
RPC架构分为三部分:
1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。
2)服务中心,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
3)服务消费者,运行在客户端,通过远程代理对象调用远程服务。
3、 具体实现
服务提供者接口定义与实现,代码如下:
public
interface
HelloService {
String sayHi(String name);
}
|
HelloServices接口实现类:
public
class
HelloServiceImpl
implements
HelloService {
public
String sayHi(String name) {
return
"Hi, "
+ name;
}
}
|
服务中心代码实现,代码如下:
public
interface
Server {
public
void
stop();
public
void
start()
throws
IOException;
public
void
register(Class serviceInterface, Class impl);
public
boolean
isRunning();
public
int
getPort();
}
|
服务中心实现类:
public
class
ServiceCenter ``implements
Server {
private
static
ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private
static
final
HashMap<String, Class> serviceRegistry = ``new
HashMap<String, Class>();
private
static
boolean
isRunning = ``false``;
private
static
int
port;
public
ServiceCenter(``int
port) {
this``.port = port;
}
public
void
stop() {
isRunning = ``false``;
executor.shutdown();
}
public
void
start() ``throws
IOException {
ServerSocket server = ``new
ServerSocket();
server.bind(``new
InetSocketAddress(port));
System.out.println(``"start server"``);
try
{
while
(``true``) {
// 1.监听客户端的TCP连接,接到TCP连接后将其封装成task,由线程池执行
executor.execute(``new
ServiceTask(server.accept()));
}
} ``finally
{
server.close();
}
}
public
void
register(Class serviceInterface, Class impl) {
serviceRegistry.put(serviceInterface.getName(), impl);
}
public
boolean
isRunning() {
return
isRunning;
}
public
int
getPort() {
return
port;
}
private
static
class
ServiceTask ``implements
Runnable {
Socket clent = ``null``;
public
ServiceTask(Socket client) {
this``.clent = client;
}
public
void
run() {
ObjectInputStream input = ``null``;
ObjectOutputStream output = ``null``;
try
{
// 2.将客户端发送的码流反序列化成对象,反射调用服务实现者,获取执行结果
input = ``new
ObjectInputStream(clent.getInputStream());
String serviceName = input.readUTF();
String methodName = input.readUTF();
Class<?>[] parameterTypes = (Class<?>[]) input.readObject();
Object[] arguments = (Object[]) input.readObject();
Class serviceClass = serviceRegistry.get(serviceName);
if
(serviceClass == ``null``) {
throw
new
ClassNotFoundException(serviceName + ``" not found"``);
}
Method method = serviceClass.getMethod(methodName, parameterTypes);
Object result = method.invoke(serviceClass.newInstance(), arguments);
// 3.将执行结果反序列化,通过socket发送给客户端
output = ``new
ObjectOutputStream(clent.getOutputStream());
output.writeObject(result);
} ``catch
(Exception e) {
e.printStackTrace();
} ``finally
{
if
(output != ``null``) {
try
{
output.close();
} ``catch
(IOException e) {
e.printStackTrace();
}
}
if
(input != ``null``) {
try
{
input.close();
} ``catch
(IOException e) {
e.printStackTrace();
}
}
if
(clent != ``null``) {
try
{
clent.close();
} ``catch
(IOException e) {
e.printStackTrace();
}
}
}
}
}
}
|
客户端的远程代理对象:
public
class
RPCClient<T> {
public
static
<T> T getRemoteProxyObj(``final
Class<?> serviceInterface,
final
InetSocketAddress addr) {
// 1.将本地的接口调用转换成JDK的动态代理,在动态代理中实现接口的远程调用
return
(T) Proxy.newProxyInstance(serviceInterface.getClassLoader(),
new
Class<?>[]{serviceInterface},
new
InvocationHandler() {
public
Object invoke(Object proxy, Method method, Object[] args)
throws
Throwable {
Socket socket =
null``;
ObjectOutputStream output =
null``;
ObjectInputStream input =
null``;
try
{
// 2.创建Socket客户端,根据指定地址连接远程服务提供者
socket =
new
Socket();
socket.connect(addr);
// 3.将远程服务调用所需的接口类、方法名、参数列表等编码后发送给服务提供者
output =
new
ObjectOutputStream(socket.getOutputStream());
output.writeUTF(serviceInterface.getName());
output.writeUTF(method.getName());
output.writeObject(method.getParameterTypes());
output.writeObject(args);
// 4.同步阻塞等待服务器返回应答,获取应答后返回
input =
new
ObjectInputStream(socket.getInputStream());
return
input.readObject();
}
finally
{
if
(socket !=
null``) socket.close();
if
(output !=
null``) output.close();
if
(input !=
null``) input.close();
}
}
});
}
}
|
最后为测试类:
public
class
RPCTest {
public
static
void
main(String[] args)
throws
IOException {
new
Thread(``new
Runnable() {
public
void
run() {
try
{
Server serviceServer =
new
ServiceCenter(``8088``);
serviceServer.register(HelloService.``class``, HelloServiceImpl.``class``);
serviceServer.start();
}
catch
(IOException e) {
e.printStackTrace();
}
}
}).start();
HelloService service = RPCClient.getRemoteProxyObj(HelloService.``class``,
new
InetSocketAddress(``"localhost"``,
8088``));
System.out.println(service.sayHi(``"test"``));
}
}
|
运行结果:
regeist service HelloService
start server
Hi,
test
|
四、总结
RPC本质为消息处理模型,RPC屏蔽了底层不同主机间的通信细节,让进程调用远程的服务就像是本地的服务一样。
分布式架构<div class="mdContent">
分布式系统(distributed system) 是建立在网络之上的软件系统。
内聚性:是指每一个数据库分布节点高度自治,有本地的数据库管理系统。
透明性:是指每一个数据库分布节点对用户的应用来说都是透明的,看不出是本地还是远程。
在分布式数据系统中,用户感觉不数据是分布的,即用户不须知道关系是否分割,有无副本,数据存在于那个站点以及事物在哪个站点上执行。
简单来说:在一个分布式系统中,一组独立的计算机展现给用户的是一个统一的整体,就好像是一个系统似的。
image分布式系统作为一个整体对用户提供服务,而整个系统的内部的协作对用户来说是透明的,用户就像是指使用一个mysql 一样。
如:分布式mysql中间件 mycat ,来处理大并发大数据量的构架。
二、分布式架构的应用
1、分布式文件系统
例如:出名的有 Hadoop 的 HDFS, 还有 google的 GFS , 淘宝的 TFS 等
2、分布式缓存系统
例如:memcache , hbase, mongdb 等
3、分布式数据库
例如:mysql, mariadb, postgreSql 等
4、分布式webService
5、分布式计算
举例
以分布式mysql 数据库中间件mycat 为例
MySQL 在现在电商以及互联网公司的应用非常多,一个是因为他的免费开源,另外一个原因是因为分布式系统的水平可扩展性,随着移动互联网用户的暴增,互联网公司,像淘宝,天猫,唯品会等
电商都采用分布式系统应对用户的高并发量以及大数据量的存储。而在Mycat的商业案例中,有对中国移动的账单结算项目中,应用实时处理高峰期每天2亿的数据量,在对物联网的项目中,实现处理
高达26亿的数据量,并提供实时查询的接口。
通过对MyCat的学习,加深分布式系统架构的理解,以及分布式相关的技术,分布式一致性ZooKeeper服务, 高可用HAProxy/keepalived等相关应用。
1> 集群 与 分布式
2> 负载均衡
3> 分布式相关的高可用、容灾等名词解释
4> Mycat 中间件学习
三、资源推荐
1、大型分布式网站架构设计与实践 http://item.jd.com/11529266.html
2、大型网站技术架构:核心原理与案例分析 http://item.jd.com/11322972.html
3、大型网站系统与Java中间件实践 http://item.jd.com/11449803.html
4、分布式Java应用:基础与实践 http://item.jd.com/10144196.html
四、分布式架构的演进
(1)初始阶段架构** **
image特征:应用程序,数据库,文件等所有资源都放在一台服务器上。
(2)应用服务 和 数据服务 以及 文件服务 分离
image说明:好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台webserver。
特征:应用程序、数据库、文件分别部署在独立的资源上。
(3)使用缓存改善性能
image说明:系统访问特点遵循二八定律,即80%的业务访问集中在20%的数据上。
缓存分为 本地缓存 和 远程分布式缓存,本地缓存访问速度更快但缓存数据量有限,同时存在与应用程序争用内存的情况。
特征:数据库中访问较集中的一小部分数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的访问压力。
(4)使用“应用服务器”集群
说明:在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了。
突然有一天,发现系统的访问又开始有变慢的趋势了,这个时候首先查看数据库,压力一切正常,之后查看webserver,发现apache阻塞了很多的请求,
而应用服务器对每个请求也是比较快的,看来是请求数太高导致需要排队等待,响应速度变慢。
特征:多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。
描述:使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,提升系统的并发处理能力,使得服务器的负载压力不再成为整个系统的瓶颈。
(5)数据库读写分离
image说明:享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,
经过查找,发现数据库写入、更新的这些操作的部分数据库连接的资源竞争非常激烈,导致了系统变慢
特征:多台服务器通过负载均衡同时向外部提供服务,解决单台服务器处理能力和存储空间上限的问题。
描述:使用集群是系统解决高并发、海量数据问题的常用手段。通过向集群中追加资源,使得服务器的负载压力不在成为整个系统的瓶颈。
(6)反向代理和CDN加速
image特征:采用CDN和反向代理加快系统的访问速度。
描述:为了应付复杂的网络环境和不同地区用户的访问,通过CDN和反向代理加快用户访问的速度,同时减轻后端服务器的负载压力。CDN与反向代理的基本原理都是缓存。
(7)“分布式文件”系统 和 “分布式数据库”
image说明:随着系统的不断运行,数据量开始大幅度增长,这个时候发现分库后查询仍然会有些慢,于是按照分库的思想开始做分表的工作
特征:数据库采用分布式数据库,文件系统采用分布式文件系统。
描述:任何强大的单一服务器都满足不了大型系统持续增长的业务需求,数据库读写分离随着业务的发展最终也将无法满足需求,需要使用分布式数据库及分布式文件系统来支撑。
分布式数据库是系统数据库拆分的最后方法,只有在单表数据规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同的业务数据库部署在不同的物理服务器上。
** (8)使用NoSQL和搜索引擎 **
image特征:系统引入NoSQL数据库及搜索引擎。
描述:随着业务越来越复杂,对数据存储和检索的需求也越来越复杂,系统需要采用一些非关系型数据库如NoSQL和分数据库查询技术如搜索引擎。
应用服务器通过统一数据访问模块访问各种数据,减轻应用程序管理诸多数据源的麻烦。
(9)业务拆分
image特征:系统上按照业务进行拆分改造,应用服务器按照业务区分进行分别部署。
描述:为了应对日益复杂的业务场景,通常使用分而治之的手段将整个系统业务分成不同的产品线,应用之间通过超链接建立关系,也可以通过消息队列进行数据分发,
当然更多的还是通过访问同一个数据存储系统来构成一个关联的完整系统。
纵向拆分:将一个大应用拆分为多个小应用,如果新业务较为独立,那么就直接将其设计部署为一个独立的Web应用系统 纵向拆分相对较为简单,通过梳理业务,将较少相关的业务剥离即可。
横向拆分:将复用的业务拆分出来,独立部署为分布式服务,新增业务只需要调用这些分布式服务 横向拆分需要识别可复用的业务,设计服务接口,规范服务依赖关系。
(10)分布式服务
image特征:公共的应用模块被提取出来,部署在分布式服务器上供应用服务器调用。
描述:随着业务越拆越小,应用系统整体复杂程度呈指数级上升,由于所有应用要和所有数据库系统连接,最终导致数据库连接资源不足,拒绝服务。
五、分布式服务应用会面临哪些问题?
(1) 当服务越来越多时,服务URL配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
(2) 当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。
(3) 接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
(4) 服务多了,沟通成本也开始上升,调某个服务失败该找谁?服务的参数都有什么约定?
(5) 一个服务有多个业务消费者,如何确保服务质量?
(6) 随着服务的不停升级,总有些意想不到的事发生,比如cache写错了导致内存溢出,故障不可避免,每次核心服务一挂,影响一大片,人心慌慌,如何控制故障的影响面?服务是否可以功能降级?或者资源劣化?
</div>