Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >构建可靠、可扩展与可维护的应用系统

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

原创
作者头像
house.zhang
发布于 2021-10-28 14:04:36
发布于 2021-10-28 14:04:36
8150
举报

当前的应用系统,通常数据量比较大、数据复杂度比较高以及数据快速多变,可以把这样的系统称之为数据密集型系统,数据密集型系统通常基于不同的模块组件进行构建,根据不同的功能采用不同的组件,各个组件相互配合组合成一个功能强大、满足不同需求场景的应用系统,比如一个互联网系统通常由类似以下结构组成:

数据库:主要产品是mysql,用于存储和持久化数据,一遍数据能够多次访问。

  • 高速缓存:主要产品有Redis、Memcached缓存那些经常要访问以及复杂计算和操作的数据,用来加快数据的返回,减少数据库压力,扩大系统并发能力。
  • 索引:主要产品有ElasticSearch、Solar,用来支持搜索功能,支持用户用关键字搜素和过滤数据。

除此之外还会涉及到其它模块

  • 流式处理:数据持续产生,需要快速消费数据进行数据计算。
  • 批处理:定期计算处理大量历史数据

随着功能需求越来越复杂,系统需求越来越广泛,单个组件无法满足所有的数据处理和存储的需求,所以需要根据需求将任务分解,组合合适的技术组件去高效的完成某一部分功能,多个组件通过应用层的代码有机的组合起来,对我们的技术要求也比较高,也带来更高的技术挑战。更加复杂的情况是在使用过程中随着用户量以及业务越来越复杂,一定会碰到更多棘手的问题。

比如,当系统出现局部失效时,如何确保数据的正确性与完整性?当系统降级时候,该如何设计为用户提供一致的用户体验?当系统负载增加时,系统如何扩展?这些问题是一个互联网分布式系统需要去重点考虑。

数据密集型应用系统专注于大多数软件系统都极为重要的三个问题:

  • 可靠性

当出现意外情况如硬件、软件故障、人为失误等,系统应可以正常运转,性能可能有所降低,但功能还是正确的。硬件故障,通常的做法是添加硬件冗余来减少系统故障率,随着数据量和应用计算需求的增加,更多应用可以运行在大规模机器之上,随之而来的硬件故障率呈线性增长。因此通过软件容错的方式来容忍多机失效成为新的手段,或者至少成为硬件容错的有力补充。软件问题,故障更加难以预料,因为节点之间是由软件关联的,因而往往会导致更多的系统故障。

  • 可扩展性

随着数据量、流量或复杂性等规模的增长,系统应该能够以合理的方式来匹配这种增长。

  • 可维护性

随着时间的推移,新功能的开发、新的团队成员加入都能够快速参与到系统开发和运维当中。主要关注软件系统的三个设计原则:可运维性、简单性、可演化性。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET Core 3.0之深入源码理解ObjectPool(二)
前文主要介绍了ObjectPool的一些理论基础,本文主要从源码角度理解Microsoft.Extensions.ObjectPool是如何实现的。下图为其三大核心组件图:
AI.NET 极客圈
2020/05/18
9010
ObjectPool 对象池设计模式
ObjectPool的默认实现是DefaultPool,对象池的创建由ObjectPoolProvider抽象类的默认实现DefaultObjectPoolProvider类实现。
Ryan_OVO
2023/10/19
2190
对象池在 .NET (Core)中的应用[2]: 设计篇
《编程篇》已经涉及到了对象池模型的大部分核心接口和类型。对象池模型其实是很简单的,不过其中有一些为了提升性能而刻意为之的实现细节倒是值得我们关注。总的来说,对象池模型由三个核心对象构成,它们分别是表示对象池的ObjectPool<T>对象、对象值提供者的ObjectPoolProvider对象,已及控制池化对象创建与释放行为的IPooledObjectPolicy<T>对象,我们先来介绍最后一个对象。
蒋金楠
2021/08/31
1.6K0
对象池在 .NET (Core)中的应用[2]: 设计篇
.NET Core 中对象池(Object Pool)的使用
对象池简单来说就是一种为对象提供可复用能力的软件设计思路。我们常说有借有还,再借不难,而对象池就是通过借和还这样两个动作来保证对象可以被重复使用,从而节省频繁创建对象的性能开销。对象池最常用的场景是游戏设计,因为在游戏中大量存在着可复用的对象,源源不断的子弹出现并不是循环再生的。在数据库中存在着被称为连接池的东西,每当出现数据库无法连接的情况时,经验丰富的开发人员往往会先检查连接池是否满了,这其实就是对象池模式在特定领域的具体实现。因此对象池本质上就是负责一组对象创建和销毁的容器。 对象池最大的优势是可以自主地管理池子内的每个对象,决定它们是需要被回收还是可以重复使用。我们都知道创建一个新对象需要消耗一定的系统资源,一旦这些对象可以重复地使用就可以节省系统资源开销,这对提高系统性能会非常有帮助。下面的代码实微软官方文档实现的一个简单的对象池:
喵叔
2021/11/19
1.1K0
从ObjectPool到CAS指令
相信最近看过我的文章的朋友对于Microsoft.Extensions.ObjectPool不陌生;复用、池化是在很多高性能场景的优化技巧,它能减少内存占用率、降低 GC 频率、提升系统 TPS 和降低请求时延。
InCerry
2022/11/14
3230
Provider模式应用demo
取操作:Interlocked.CompareExchange(ref items[i].Element, null,item)。取完后将元素置为null
Ryan_OVO
2023/10/19
1810
对象池在 .NET (Core)中的应用[1]: 编程篇
借助于有效的自动化垃圾回收机制,.NET让开发人员不在关心对象的生命周期,但实际上很多性能问题都来源于GC。并不说.NET的GC有什么问题,而是对象生命周期的跟踪和管理本身是需要成本的,不论交给应用还是框架来做,都会对性能造成影响。在一些对性能比较敏感的应用中,我们可以通过对象复用的方式避免垃圾对象的产生,进而避免GC因对象回收导致的性能损失。对象池是对象复用的一种常用的方式。.NET提供了一个简单高效的对象池框架,并使用在ASP.NET自身框架中。这个对象池狂框架由“Microsoft.Extensions.ObjectPool”这个NuGet包提供,我们可以通过添加这个NuGet包它引入我们的应用中。接下来我们就通过一些简单的示例来演示一下对象池的基本编程模式。
蒋金楠
2021/08/31
1.3K0
对象池在 .NET (Core)中的应用[1]: 编程篇
.NET对象池的使用
昨天在『.NET 大牛之路』技术群和大家聊到了对象池的话题,今天展开详细讲讲这个知识点。
JusterZhu
2022/12/07
6060
.NET对象池的使用
对象池在 .NET (Core)中的应用[3]: 扩展篇
原则上所有的引用类型对象都可以通过对象池来提供,但是在具体的应用中需要权衡是否值得用。虽然对象池能够通过对象复用的方式避免GC,但是它存储的对象会耗用内存,如果对象复用的频率很小,使用对象池是不值的。如果某个小对象的使用周期很短,能够确保GC在第0代就能将其回收,这样的对象其实也不太适合放在对象池中,因为第0代GC的性能其实是很高的。除此之外,对象释放到对象池之后就有可能被其他线程提取出来,如果释放的时机不对,有可能造成多个线程同时操作同一个对象。总之,我们在使用之前得考虑当前场景是否适用对象池,在使用的时候严格按照“有借有还”、“不用才还”的原则。
蒋金楠
2021/08/30
1.7K0
ASP.NET Core 中的 ObjectPool 对象重用(一)
对象池是一种设计模式,一个对象池包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象。池的对象可以从池中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁他,他是一种特殊的工厂对象。
HueiFeng
2020/01/22
1.3K0
ASP.NET Core 中的 ObjectPool 对象重用(一)
基于阻塞队列的生产者消费者C#并发设计
这是从上文的<<图文并茂的生产者消费者应用实例demo>>整理总结出来的,具体就不说了,直接给出代码,注释我已经加了,原来的code请看<<.Net中的并行编程-7.基于BlockingCollection实现高性能异步队列>>,我改成适合我的版本了,直接给code:
Ryan_OVO
2023/10/18
3170
.NET性能优化-复用StringBuilder
在之前的文章中,我们介绍了 dotnet 在字符串拼接时可以使用的一些性能优化技巧。比如:
InCerry
2022/11/14
3080
.NET性能优化-ArrayPool同时复用数组和对象
前两天在微信后台收到了读者的私信,问了一个这样的问题,由于私信回复有字数和篇幅限制,我在这里统一回复一下。读者的问题是这样的:
InCerry
2023/03/08
4500
.NET性能优化-ArrayPool同时复用数组和对象
[一起读源码]走进C#并发队列ConcurrentQueue的内部世界
决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写。前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列ConcurrentQueue作为开篇来聊一聊它的实现原理。
李明成
2020/04/15
2.3K0
[一起读源码]走进C#并发队列ConcurrentQueue的内部世界
.net 5.0 Options组件源码解析
本文主要介绍Options组件的原理和源码解析,但是主要介绍常用的一些用法,有一些不常用的模式,本文可能会跳过,因为内容太多.
郑小超.
2022/05/07
9320
.net 5.0 Options组件源码解析
Disruptor-NET和内存栅栏
Disruptor-NET算法(是一种无锁算法)需要我们自己实现某一种特定的内存操作的语义以保证算法的正确性。这时我们就需要显式的使用一些指令来控制内存操作指令的顺序以及其可见性定义。这种指令称为内存栅栏。 内存一致性模型需要在各种的程序与系统的各个层次上定义内存访问的行为。在机器码与的层次上,其定义将影响硬件的设计者以及机器码开发人员;而在高级语言层次上,其定义将影响高级语言开发人员以及编译器开发人员和硬件设计人员。即,内存操作的乱序在各个层次都是存在的。这里,所谓的程序的执行顺序有三种: (1)程序顺序
张善友
2018/01/29
8220
java 对象池技术
1、为什么用对象池 在 java 中,对象的生命周期包括对象创建、对象使用,对象消失三个时间段,其中对象的使用是对象真正需要存活的时间,不好修改,该用的时候还得使用啊。对象的创建和消失就得好好控制下了。对象的创建是比较费时间的,也许感觉不到,好比一个赋值操作int i=1,也是需要耗时的,在比如构造一个对象,一个数组就更加消耗时间。再说对象的消除,在 java 里面使用 GC 来进行对象回收,其实也是需要对对象监控每一个运行状态,包括引用,赋值等。在 Full GC 的时候,会暂停其他操作,独占 CPU。所以,我们需要控制对象的创建数量,也不要轻易的让对象消失,让他的复用更加充分。
breezedancer
2018/09/12
2.2K0
java 对象池技术
[一起读源码]走进C#并发队列ConcurrentQueue的内部世界 — .NET Core篇
在上一篇《走进C#并发队列ConcurrentQueue的内部世界》中解析了Framework下的ConcurrentQueue实现原理,经过抛砖引玉,得到了一众大佬的指点,找到了.NET Core版本下的ConcurrentQueue源码,位于以下地址:
HOHO
2020/04/27
1.4K0
[一起读源码]走进C#并发队列ConcurrentQueue的内部世界 — .NET Core篇
asp.net core选项Options模块的笔记
这篇博客是写给自己看的。已经不止一次看到AddOptions的出现,不管是在.net core源码还是别人的框架里面,都充斥着AddOptions。于是自己大概研究了下,没有深入,因为,我的功力还是不够,等能力到了再回头研究下。在这里还是要说一遍,因为DI的重要性不言而喻,不必谈的太深,说下自己的理解: 
Ryan_OVO
2023/10/19
1800
Asp.Net Core EndPoint 终结点路由工作原理解读
在本打算写一篇关于Identityserver4 的文章时候,却发现自己对EndPoint -终结点路由还不是很了解,故暂时先放弃了IdentityServer4 的研究和编写;所以才产生了今天这篇关于EndPoint (终结点路由) 的文章。
Jlion
2022/04/07
1K0
Asp.Net Core EndPoint 终结点路由工作原理解读
推荐阅读
相关推荐
.NET Core 3.0之深入源码理解ObjectPool(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档