数据密集型应用及其可靠、可扩展与可维护的定义

一、什么算是“数据密集型应用”

对于一个应用系统,如果“数据”是其成败决定性因素,包括数据的规模、数据的复杂度或者数据产生与变化的速率等,我们就可以称为“数据密集型应用系统”;与之对应的是计算密集型,CPU主频往往是后者最大的制约瓶颈。

例如:使用了以下组件的应用系统:关系型数据库、NoSql、消息队列、缓存、搜索引擎、批处理与流处理框架

二、可靠、可扩展与可维护的应用系统

1、可靠性

意味着即使发生故障,系统也可以正常工作。故障包括:

1)硬件故障。如硬盘崩溃、内存故障、电网停电。硬盘的平均无故障时间约为10-50年。因此,在一个包括10000个磁盘的存储集群中,我们应该预期平均每天有一个磁盘发生故障。硬件故障通常是随机的,不相干的。减少硬盘故障率的策略有:

  • 针对单机系统

磁盘配置RAID,服务器配备双电源,热插拔CPU,数据中心添加备用电源、发单机等

  • 分布式系统

通过软件容错的方式来容忍多机失效,例如当需要重启计算机为操作系统打安全补丁,可以每次给一个节点打补丁然后重启,而不需要同时下线整个系统。

2)软件错误。软件问题通常是系统的,更难以处理

3)人为失误。总是很难避免,时不时会出错。以下多种方法可以帮助减少人为错误:

  • 以最小出错的方式来设计系统。例如,精心设计的抽象层、API以及管理界面,使“做正确的事情”很轻松,但搞坏很复杂。
  • 想办法分离最容易错误的地方、容易引发故障的接口。特别是,提供一个功能齐全但非生产用的沙箱环境。
  • 充分的测试:单元测试、全系统集成测试、手动测试、自动化测试。
  • 当出现人为失误时,提供快速的恢复机制以尽量减少故障影响。
  • 设置详细而清晰的监控子系统,包括性能指标和错误率。
  • 推行管理流程并加以培训。

2、可扩展性

是指负载增加时,有效保持系统性能的相关技术策略。

负载:Web服务器的每秒请求处理次数,数据库中写入的比例,聊天室的同时活动用户数量,缓存命中率等。有时平均值很重要,有时系统瓶颈来自于少数峰值。

性能:批处理系统中,通常关心吞吐量,即每秒可处理的记录条数,或者在指定数据集上运行作业所需的总时间;而在线系统通常更看重服务的响应时间,即客户端从发送请求到接收响应之间的间隔。

响应时间:平均值并不是合适的指标,因为它掩盖了一些信息,无法告诉有多少用户实际经历了多少延迟。最好使用百分位数。中位数表示列表中间的响应时间,缩写为p50,如果中位数响应时间为200ms,意味着一半的请求响应不到200ms。想要弄清楚异常的响应数据有多糟糕,需要关注p95、p99、p999

3、可维护性

本质上是为了让工程和运营团队更为轻松。包括:

  • 可运维性:运维更轻松。
  • 简单性:简化复杂度。
  • 可演化性:易于改变。

良好的抽象可以帮助降低复杂性,并使系统更易于修改和适配新场景。良好的操纵性意味着系统健康状况有良好的可预测性和有效的管理方法。

原文地址:https://www.cnblogs.com/bestzrz/p/10464305.html

时间: 2024-11-13 06:16:42

数据密集型应用及其可靠、可扩展与可维护的定义的相关文章

【设计理念】数据密集型应用特点

数据密集型应用特点 需求 存储数据,以便自己或其他应用程序之后能再次找到--数据库 记住开销昂贵操作的结果,加快读取速度--缓存 允许用户按关键字搜索数据,或以各种方式对数据进行过滤--搜索索引 向其他进程发送消息,进行异步处理--流处理 定期处理累积的大批量数据--批处理 关于数据系统的思考 数据库.消息队列.缓存等工具分属于几个差异显著的类别.虽然数据库和消息队列表面上有一些相似性--它们都会存储一段时间的数据--但它们有迥然不同的访问模式,这意味着迥异的性能特征和实现手段. 越来越多的应用

数据密集型 和 cpu密集型 event loop

Node.js在官网上是这样定义的:“一个搭建在Chrome JavaScript运行时上的平台,用于构建高速.可伸缩的网络程序.Node.js采用的事件驱动.非阻塞I/O模型使它既轻量又高效,是构建运行在分布式设备上的数据密集型实时程序的完美选择.”Web站点早已不仅限于内容的呈现,很多交互性和协作型环境也逐渐被搬到了网站上,而且这种需求还在不断地增长.这就是所谓的数据密集型实时(data-intensive real-time)应用程序,比如在线协作的白板,多人在线游戏等,这种web应用程序

数据密集型系统架构设计

按照使用的资源类型划分,我们可以把系统分为三大类型:IO密集型.计算密集型,数据密集型.系统的类型反映了系统的主要瓶颈.现实情况中,大部分系统在由小变大的过程中,最先出现瓶颈的是IO.IO问题体现在两个方面:高并发,存储介质的读写(例如数据库,磁盘等).随着业务逻辑的复杂化,接下来出现瓶颈的是计算,也就是常说的CPU idle不足.出现计算瓶颈的时候,一般会使用水平扩展(加机器)和垂直扩张(服务拆分)两个方法.随着数据量(用户数量,客户数量)的增长,再接下来出现瓶颈的是内存. 如今,内存的合理使

CPU-bound(计算密集型) 和I/O bound(I/O密集型)/数据密集型

https://blog.csdn.net/q_l_s/article/details/51538039 I/O密集型 (CPU-bound)I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CPU Loading 不高.CPU bound 指的是系统的 硬盘/内存 效能 相对 CPU 的效能 要好很多,此时,系统运作,大部分的状况是 CPU Loading 100%,CPU 要读/写 I

ADO.NET 数据访问类查询、属性扩展

今天,我首先在之前所做的人员管理系统的基础上,利用数据访问类进行了所有人员信息的查询. 主程序代码: List<Users> Ulist = new UsersData().Select(); if (Ulist.Count > 0)//判断是否包含语句 { foreach (Users u1 in Ulist)//遍历 { Console.WriteLine(u1.UserName + " " + u1.PassWord + " " + u1.N

Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进行讨论. string input = "83B0233C-A24F-49FD-8083-1337209EBC9A,EAB523C6-2FE7-47BE-89D5-C6D440C3033A"; var result = Util.Conv.ToGuidList( input ); 观察上面

从大数据菜鸟走上大师的历程 第二讲:函数定义,流程控制,异常处理

Scala 第二讲 函数定义,流程控制,异常处理 For 循环  for(左边为单个对象obj  <-  右边为对象集合objs ) for 循环里把右边的对象赋给左边 现在正是学习大数据的最好机遇,不花一分钱就可以成为大数据高手,实现年薪50万的梦想. 王家林的第一个中国梦:免费为全社会培养100万名优秀的大数据从业人员! 如果您有兴趣请点击这个链接进入大数据的学习 http://blog.sina.com.cn/s/blog_8fbd39ee0102vto3.html 如果您确实感觉视频教程

在VS2012后的版本中做数据报表时,提示尚未指定报表“Report1”的报表定义

有一群的朋友在用VS2012做数据报表时,老是提示 本地报表处理期间出错. 尚未指定报表“Report1”的报表定义 未将对象引用设置到对象的实例. 我看了一下,步骤没错,我用VS2010做了一下,一切OK,没问题,但用VS2013做时, 就提示这错误 后仔细看了一下设计生成的源码,嘿,还真有区别,在VS2012与VS2013中, ReportViewer生成的代码在引用报表数据时,使用的是ReportEmbeddedResource属性 <LocalReport ReportEmbeddedR

(转)在VS2012后的版本中做数据报表时,提示尚未指定报表“Report1”的报表定义

转自:http://www.cnblogs.com/ljx2012/p/4093474.html 有一群的朋友在用VS2012做数据报表时,老是提示 本地报表处理期间出错.        尚未指定报表“Report1”的报表定义            未将对象引用设置到对象的实例. 我看了一下,步骤没错,我用VS2010做了一下,一切OK,没问题,但用VS2013做时, 就提示这错误 后仔细看了一下设计生成的源码,嘿,还真有区别,在VS2012与VS2013中, ReportViewer生成的代