加入收藏 | 设为首页 | 会员中心 | 我要投稿 桂林站长网 (https://www.0773zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 云计算 > 正文

应用程序扩展性不好?来瞧基于Java开发的云应用程序

发布时间:2022-06-01 12:12:10 所属栏目:云计算 来源:互联网
导读:最近,我们受命开发一个用于分析大数据的软件即服务(SaaS)应用程序。为了进行数据挖掘,系统需要将数十亿个公开帖子存储在数据库中,并且对这些帖子进行分类处理。 这个环境下的分类是一个缓慢、耗费资源、又让人痛苦的过程,需要为数据库中的任何记录赋予

         最近,我们受命开发一个用于分析大数据的软件即服务(SaaS)应用程序。为了进行数据挖掘,系统需要将数十亿个公开帖子存储在数据库中,并且对这些帖子进行分类处理。
 
        这个环境下的分类是一个缓慢、耗费资源、又让人痛苦的过程,需要为数据库中的任何记录赋予主题或情绪。对我们的测试数据进行分类的过程持续时间长达24个小时。
 
       为了应对这些要求,显然摆在我们面前的选择就是在亚马逊网络服务(AWS)上构建一个云应用程序。接手这个项目一段时间后,我想交流一下本人在开发基于Java的云应用程序方面的心得、认识和方法。
 
        何谓云计算?
 
       不妨先来看看维基百科给出的定义:
 
         “云计算涉及网络上的分布式计算,某个程序或应用软件可能同时在多个连接的计算机上运行。”
这个定义可能有点模糊不清,但是可以理解,因为云计算本身与其说是个技术术语,还不如说是个营销术语。对新手而言,要是我们用一种更实际的方法来定义云计算,理解起来就比较容易:
 
         传统Web应用程序与云Web应用程序的唯一区别在于完美扩展的功能。如果给予无限制的硬件,云应用程序应该能够处理无限制的工作量。
如今云应用程序大行其道,这是由于人们对现代应用程序提出了更高的要求。在过去,谷歌以开发含有互联网上几乎所有可用信息的具有高扩展性的应用程序而出名。而如今,另外许多企业需要开发能够处理类似规模数据和计算的应用程序(Facebook、Youtube、LinkedIn、Twitter,还有像我们这样搜索和处理数据的人员)。
 
        借助开发应用程序的传统方式,不可能处理这么庞大的数据量。这促使我们采用了一种全然不同的方法,开发可扩展性非常好的应用程序。那就是云应用程序。
 
为何开发Web应用程序的传统方法其扩展性不够好?
 
开发Web应用程序的传统方法
 
不妨看一下为什么传统应用程序无法处理规模庞大的数据。
 
如果你开发过一款传统的Web应用程序,它应该与上图非常相似。存在另外一些细小的差异,比如合并应用服务器和Web服务器或者多台企业服务器。不过大多数时候,数据库是关系型数据库。Web服务器通常是有状态(stateful)服务器,而企业服务器能同时提供无状态服务和有状态服务。
 
有一些重大的缺点导致这种架构不具备足够好的可扩展性。我们不妨先从定义完美的可扩展性开始分析。
 
  如果给予双倍数量的带宽和双倍数量的硬件,某个系统总是能为双倍数量的工作提供一样的响应时间,就能实现完美的可扩展性(perfect scalability)。
完美的可扩展性在实际环境中实现不了。确切地说,开发人员只是旨在实现近似完美的可扩展性。比如说,DNS服务器就不在我们的控制范围之内。因而,从理论上来说,我们无法处理数量超出DNS服务器的请求。这就是任何系统的上限,连谷歌也不例外。
 
SQL
 
回到上面那个图,最大的弱点在于数据库的可扩展性。请求数量和数据大小都足够小时,开发人员应该不会注意到负载增加后性能受到的任何影响。继续进一步增加负载,如果处理器的使用率达到100%或者内存全部被占用,影响可能非常明显。这时候,最实际的办法就是为数据库系统提供更多的内存和处理器资源。之后,系统可能会再度顺畅运行起来。
 
遗憾的是,这种方法不可能只要问题出现就可以永远重复。总是会存在一个限制:不管你拥有多少内存和处理器资源,性能总会慢慢变得越来越差。这是预料之中的事,因为会有许多请求需要创建、读取、更新和删除(CRUD)某一些记录。不管你是决定缓存记录、将记录存储在内存中还是采取其他任何手段,它们都是独特的记录,存在于单一机器中,多少数量的访问请求可以发送到某一个内存地址是有限制的。
 
这又是不可避免的限制,因为SQL是为确保完整性而开发的。为了确保完整性,SQL服务器中的任何信息都应该具有独特性,这点必不可少。即便在进行了数据隔离或复制之后,这个特点仍然适用(至少对主实例来说是这样)。
 
相比之下,NoSQL并不试图对数据进行规范化。相反,它选择存储聚合对象,这些对象里面可能含有重复的信息。因此,NoSQL只有在数据完整性并非必需的情况下才适用。
 
来自couchbase.com的上面这个例子表明了数据如何存储在文档数据库中以及如何存储在关系数据库中。如果某户人家有多个成员,关系数据库只为所有家庭成员存储一个地址,而NoSQL数据库只是复制住址。某家人搬家后,所有家庭成员的住址可能在一个事务中未被更新,这违反了数据完整性。
 
不过,对我们的应用程序及另外许多应用程序而言,这种暂时的违反是可以接受的。比如说,你可能不需要你的社交网页页面浏览量或社交网站的公开帖子数做到百分之百准确。
 
数据重复实际上消除了我们上面提到的针对单单一个内存地址的并发访问,让开发人员可以选择将数据存储在自己希望的任何地方,只要一个节点中的变化内容可以慢慢同步到其他节点。这种架构的可扩展性强得多。
 
有状态
 
下一个问题是有状态服务。有状态服务需要同一批硬件来服务同一客户机提出的请求。客户机数量增加后,最明智的举动就是将更多的应用服务器和Web服务器部署到系统中。不过就有状态服务而言,资源分配无法做到完全优化。
 
就传统应用程序而言,负载均衡系统没有系统负载的任何信息,通常使用循环配置(Round Robin)手法,将请求分散到不同的服务器。这里的问题在于,并非所有的请求都一个样,也并非所有的客户机都发送数量一样的请求。这势必导致有些服务器不堪重负,而有些服务器仍然处于闲置状态。
 
混合数据检索和数据处理
 
就传统应用程序而言,从数据库检索数据的服务器最终要处理数据。处理数据和检索数据之间没有明确的分离。这两项任务都会给系统带来瓶颈。如果瓶颈来自数据检索,数据处理自然未得到充分使用,反之亦然。
 

(编辑:桂林站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!