学《云计算应用开发实践》总结<三>

前言

前几章将有特点的公有云计算平台都介绍了一下,这里费下嘴,不是说只有这些云平台,实际上有很多,到现在Bat、360等都得云计算平台有涉及,方向、功能大体相似,我们常用的网盘算是其中之一。通过前面云计算的介绍,云计算相关的虚拟化、并行计算、主机管理等技术,我们也积累很多东西,现在就开始应用到实践中。

第五章在云上开发你的应用

笔者认为可以按照数据的使用方式,将应用分为三种:以计算为中心的应用(统计计算,模拟计算,图像、信息管理系统,这类单个计算所需数据量小,数据传输代价小,能够实时处理),以数据为中心的应用(互联网搜索公司、数据挖掘、人口统计、日志分析,输入数据量较大,传输代价高,需要分布式并行处理),需要兼顾数据与计算的应用(采用分而治之的方法,根据不同的功能模块采用不同的技术)。

对于这么应用,我们有不同的架构选择,以计算为中心的应用架构选择,除了本机采用多线程编程外,通常可以把计算所需的数据分发到多台计算机上同时计算,一般这样的应用计算所需数据量较小,数据传输花费时间少,侧重于并行计算,而不必关注数据存储问题,前端因特网应用可以使用负载均衡器,后台的大计算量可以选择Platform Symphony等软件来解决。

以数据为中心的应用架构与以计算为中心的最大区别就是计算所需的数据”量“,当需要传输的数据量很大时,数据传输的时间远远大于处理的时间,单纯提高速度就没有了实际用处,于是,Google提出了MapReduce计算框架,他将数据最初产生时就分布存放在分布式文件系统中,每一个数据存储节点同时也是计算节点,大大节省了数据传输时间,提高了计算速度,算是目前较为有效的离线处理方案,后来就有了实时处理数据框架Spark,所以以数据为中心的应用可以采用MapReduce架构(比如hadoop实现)构建应用计算环境。

需要兼顾数据和计算的应用架构选择,比如Google的搜索页面,它采用前端页面使用负载均衡器提高用户的响应速度,后台大数据量计算采用MapReduce架构解决,总之,就是分而治之,转化为以数据和计算为中心。

其实,MapReduce框架并不能解决所有的问题,大致有这么三点:一、目前很多应用都是集中式存储的,出于各种考虑,多数用户不会使用HDFS这种分布式文件系统,那样就使用不了MapReduce框架;二、现有的MapReduce实现,数据都是分散式存储的,这样势必给数据的传输和同步带来新的问题;三、MapReduce计算节点是和数据相关联的,需要将数据分发到所有的工作节点上,而实际情况是,一般数据只存在整个集群的部分节点上,这样有时就不能充分的利用计算资源。

除了MapReduce框架的问题,现有的云计算技术还存在很多问题。因为我们说了那么多的云计算产品,他们都是针对某一方面问题而产生的解决方案,当整合时,各种问题也就随机产生:一、NoSQL数据库API不兼容,不同厂商提供的数据库操作方式不一样,同样的插入功能不尽相同,尽管他们在设计上相似。这种不同会导致当选择了某种特殊NoSQL数据库开发应用后,很难将应用迁移到其他云计算平台上;二、各公共服务提供商所提供的服务不同,具体的看下图:

针对上面提到的问题现状,我们也有相应的解决办法。我们知道在传统的关系型数据库中,也遇到过同样的问题,当时是创建了SQL标准数据库访问语言,开发了hibernate,DataNucleus等轻量级的ORM开发组件,同样,对于新兴NoSQl数据库,针对java语言,几乎所有的NoSQL数据库都支持JPA标准,注意这是个标准。

JPA(Java Persistence API)实现了存储对象向不同数据库存储的相互转化,总体思想和现有的Hibernate、DataNucleus等ORM框架大体一致,总的来说,JPA包括以下两方面技术:一是ORM对象关系映射,ORM简而言之就是将java类中字段、名称和数据库的列名、表名关联在一起,JPA支持XMl和java Annotation(注解式编程)两种元数据的形式;二是统一标准的数据库编程接口,JPA提供统一的数据库编程接口标准来操作实体对象,执行查询,插入,删除,更新等操作,以笔者经验,JPA能很好解决90%的数据库操作,对于个别的大数据量、特定的操作需要开发人员自己完成。具体JPA的实现操作我会专门一文来介绍。

最后就是实战基于云计算平台的文件共享系统需求分析,请看下回分解。

时间: 2024-10-25 16:42:56

学《云计算应用开发实践》总结<三>的相关文章

Git工程开发实践(三)——Git常用操作

Git工程开发实践(三)--Git常用操作 一.Git仓库操作 1.Git仓库创建 git init在当前目录中初始化Git仓库git init [project-name]创建一个新目录并初始化仓库初始化git仓库会默认创建一个mater分支,创建名为.git的子目录,内含初始化Git仓库中所有的骨干文件,此时仓库中的文件还没有被跟踪.通过git add命令来实现对指定文件的跟踪,然后执行git commit提交. git add . git commit -m 'initial projec

ASP.NET5+EntityFramework7开发实践(三)

1.说明 在<ASP.NET5+EntityFramework7开发实践(一)>介绍过仓储模式,只是没有在控制器中如何使用? 本章重新补充一下.注意,也会使用ASP.NET5中的依赖注入. 2.仓储模式 先看接口: 1 public interface IRoleRepository:IDisposable 2 { 3 //IEnumerable和IQueryable 4 //二者在EF都会延迟加载,不同的是: 5 //IEnumerable是数据加载到内存,刷选在内存中的数据上执行 6 //

ASP.NET-FineUI开发实践-9(三)

1. TextChanged事件前台触发回发后台,接上文,先给TextBox1加上事件,看看是怎么生成出来的, 注意AutoPostBack="true",找源代码,f4多出了个 listeners: { change: function () { __doPostBack('SimpleForm1$TextBox1', ''); } } 在extjs API里搜 listeners 是监听事件的意思,change当然就是事件注意可以三个参数,例子里没写但api里有,__doPostB

ASP.NET-FineUI开发实践-6(三)

自动补全也算是好东西吧,我也不清楚下拉列表可以过滤为啥还有自动不全,其实自动补全用到还是通过jq获取服务端的动态数据补全.我没做动态的例子,其实好写,就不写了. 1.用到了两个js包 <script src="../../res/js/jquery.min.js" type="text/javascript"></script> <script src="../res/jqueryuiautocomplete/jquery-u

API开发实践(三) 查询物流路径

查询物流可以使用现成的API,本文使用的快递鸟查询. 查询方法主要在两个类:errorManage.kdniaoTrackQueryAPI中 各种快递查询Api接口(快递鸟) 调用API一定要仔细阅读文档,了解编码格式.请求方式.参数设置等信息. 上代码之前先说一下数据结构: 我们想要的物流路径可由一系列地址组成,但在实际操作中还存在查询失败及没有物流信息的情况,所以还要返回一个查询状态信息. 所以选择一个能储存所需信息的最简单结构,用List结构传递即可. 规定List第一位存储Int型转状态

FineUI开发实践-目录

FineUI初学手册 下载,实例项目搭建 ASP.NET-FineUI开发实践-1 实际开发环境是FineUI 4.0.4,编辑页面回发,__doPostBack应用 ASP.NET-FineUI开发实践-2 1.Window控件显示2.显示隐藏控件4.直接通过行号修改指定列内容5.获取iframe ASP.NET-FineUI开发实践-3 1.参照模拟数据库分页通过缓存重写内存分页,优化页面响应速度2.得到指定行指定列的值后台3.按钮至少选择一项的通用方法,OnClientClick+=累加.

ASP.NET-FineUI开发实践-9(四)

现在是这么个问题,在开发中表格是动态出来的,就是标准板是全部字段列出,客户要根据情况列出自己想要的,在增加操作页面的同时要是能用前台自带的功能直接保存到后台就好了,现在的列显示和隐藏是不回发的. 1.FineUI引用的extjs是ext-part1.js,这就不说了,以前截过图,这个文件是压缩的,参数也是简化的不好看,其实这个就是ext-all.js,ext-all哪来的呢,就是extjs官方实例里下的,下来之后也是压缩的,旁边还有个不压缩的,ext-all-debug.js ,完全可以看,那我

《移动平台开发实践》第三周学习任务

目录 20189230杨静怡 2018-2019-2 <移动平台开发实践>第3周学习总结 学习<Java和Android开发学习指南(第二版)>第5.6.8.9章-- 教材学习中的问题和解决过程 代码调试中的问题和解决过程 [代码托管] statistics.sh脚本运行结果的截图 上周考试错题总结 学习进度条 参考资料 20189230杨静怡 2018-2019-2 <移动平台开发实践>第3周学习总结 学习<Java和Android开发学习指南(第二版)>

Android开发实践:以“专业”的态度处理多线程

刚开始学一门编程语言的时候,我总是会有一种困惑,怎样让自己的代码看起来更"专业"?很多时候,我们可以照着教材实现一些基本的功能,比如用Socket发送/接收几个字符,写一个线程完成某个异步任务,但是在实际的项目中,往往不那么简单,比如需要设计Socket通信协议,需要处理Socket的连接异常断开,需要考虑在线程阻塞的情况下如何正常退出和释放资源等等,关于这些"实战经验",前面的文章也有所涉及,以后有空准备再开个专题跟大家分享探讨一下,今天先简单地说说怎样更&quo