.NET 分布式架构开发实战之二 草稿设计“.NET研究”

简介:   前言:  本篇之所以称为草稿设计,是因为设计的都是在纸上完成的。反映了一个思考的过程。  本篇的议题如下:  1) 第一个数据层草图的提出  2) 对数据访问层的思考  3) 第二个数据层草图的提出  1.数据层草图的提出  Richard开始着手设计,一开始他没有就立刻在自己的计算机开始敲代码。

  前言:

  本篇之所以称为草稿设计,是因为设计的都是在纸上完成的。反映了一个思考的过程。

  本篇的议题如下:

  1) 第一个数据层草图的提出

  2) 对数据访问层的思考

  3) 第二个数据层草图的提出

  1.数据层草图的提出

  Richard开始着手设计,一开始他没有就立刻在自己的计算机开始敲代码。而且采用笔+纸开始构思。

  因为他认为:写程序不是什么时候都得上机,脑子里面想什么的才是最重要的,往往很多时候,在设计程序时,首先在头脑中就已经把整个功能已经实现了,甚至代码的详细编写都已经在头脑中走了一遍,并且在头脑上海徐汇企业网站设计与制作中运行,调试了。

  开始设计了,因为这次Richard想要提出一个比较好的架构,一个比较强大的企业级的架构,所以参看成功的一些案例是很有必要,Richard也想到了微软best practice的那些推荐的架构组织方式和建议(大家对best practice不熟悉也要紧,不会影响阅读)。

  之后,Richard的第一个草图就出来了:

上海企业网站制作"cursor: pointer; display: block; margin-left: auto; margin-right: auto;" title="点击图片可在新窗口打开" src="https://yqfile.alicdn.com/img_7604ea19ba643c037ddca5cb1c8941e5.jpg" border="0" alt="" width="484" height="369" />

  一个架构组织方式的提出,不是随随便便就提出的,新的架构的设计和提出首先必须要明白你要解决哪些问题,而且也不要过度设计。(这个过程很难,很多时候需要权衡,所以作为架构的设计者,权衡的思想很重要:在时间,资源,资金等都要考虑)。可能在起初会参看一些别的设计架构,甚至是模仿它们,但是随着思考的深入,那些表象的东西就会逐渐的被抛除。

  同时也开始设计的时候,没有说一定要立刻就要设计出一个很强大的东西出来,对架构设计的能力也是在慢慢的演化和思考过程中提升的。

  2. 对数据访问层的思考

  在解释为什么架构要像上面那副图进行设计之前,我们首先来讨论一些之前项目问题:

  对于数据访问层(DAL)的问题:

  1. DAL很依赖Linq生成的实体。可以说在之前的项目中,在数据访问层能够使用的技术就已经钉死在了Linq上。这里不是说Linq不好,而且强调在DAL的访问技术的选择的余地已经没有了,不灵活。

  a) 在架构的设计过程中,就需要考虑到以后技术的转变和更换,可能在项目A中采用Linq to sql,但是在项目B中就采用Entity Framework。因为我们的目的就是要开发一个比较灵活的通用架构,能够支持不同就数据访问技术。可能以后的项目都只是用上海闵行企业网站制作一种访问技术,但是最为架构的设计者,特别是希望从架构最后能够演化到Framework, 那就要为更换技术预上海徐汇企业网站制作留接口。

  2. 在DAL中没有很多的异常处理等底层机制。

  a) 在项目设计的过程中,有些底层的机制是几乎每一个逻辑都要用到的:异常处理,日志跟踪,缓存机制,事务机制,安全验证机制。当时在之前的DAL中是没有的。可能现在你认为有些机制不是需要的,或者不明白为什么需要。

  因为一个强大的软件,不能随随便便就因为某些异常或者错误就崩溃了,也不可能就是一大堆代码的堆砌。上面所提到的有些机制:如异常,日志,它们的价值很多时候在软件维护的时候体验出来。根据日志记录,可以查处软件哪里出了问题,如是数据库断了,还是哪个操作流程导致了问题。 而有些机制是在运行时体现价值,如缓存,验证,事务。

  但是在使用这些底层机制的时候也要权衡,综合的考虑,如缓存机制,就得明白那些数据要缓存,缓存在哪里,缓存数据时候要加密,缓存多长时间,如何刷新过期了的数据。等等,很多东西要考虑。

  3. 数据来源仅仅只是考虑了数据库。其实这个问题不是之前的项目的一个问题,但是这里有必要提出。

  a) 一般在我们开发项目的时候,数据的来源很多时候都是数据库,我们直接操作数据库就行了,但是还得考虑一个问题:如果我们的项目没有自己的数据库,我们的数据来源是来自其他的公司或者服务接口,怎么办?作为架构的设计者,是需要考虑这些的。NET 分布式架构开发实战之二 草稿设计

  可能在项目敲定那天就已经清楚是自己设计数据库还是从其他地方获取数据。但是一个通用的一个架构的就要能够为其他的数据源预留接口。

  这里,可能就有了一点过度设计的味道了,起初在项目A中所使用的架构没有考虑其他数据源的问题,但是如果在项目B中出现了,怎么办?那么架构就要演化,改进来适应这种情况。

  之前也提过,没有必要一上来就设计强大的就架构,而是在项目中改进,演化。开始时候没有考虑到,以后慢慢的加嘛。(比较的纠结)。

  上面只是紧紧的从数据层DAL的角度进行了思考,DAL最终还是为业务层BLL提供数据的,所以就考虑DAL以何种方式来被BLL调用,鉴于之前的一些考虑,可以得出一点:不让BLL直到DAL的实现细节,所以接口似乎是个不错的解决办法,Provider的模式也似乎可以排上用场。

  于是,Richard就决定在DAL和BLL之前加上接口层来解耦。

  3. 第二个数据层草图的提出

  这个图和之前的第一个图基本上是一样的,只是做了一修改,而且加上了之前谈论中涉及的一些问题。

  因为随着思考的深入,逐渐的发觉:数据源的来源可以很多—数据库,普通文本,XML等等。不同的数据源提供不同的Provider,其实从其他的服务接口获取数据也是一种来源,上面的图之所以单独的把Service Agent分出,主要是因为比较特殊。

  而且图中的那些基本功能:Log, Exception等,是到处都用到的。

  此时Richard也在头脑中闪现了一些要处理的,可以出现的异常:

  1.Data Source is not exits:数据源不存在,因为这个问题很常见,比如在项目运行过程中,数据库断了,或者远程的服务无法访问,等等基本都属于这个问题的。所以这个异常肯定是要处理的。

  2. Time out:超时。这个异常很常见,获取的数据过大,或者远程数据源连接超时,等,都可以引发一些问题。

  3. 如果数据源是其他服务接口提供数据,那么在数据获取时,可能要转换数据格式,如果格式出错,。或者发送的数据不符合一些规则,这个异常一定要处理,因为这些数据可能涉及到安全的问题了:是数据真的不正确,还是被篡改了。

  程序就必须对这些异常进行处理:是把原生的异常抛出,然后有业务层决定如果处理;还是决定把异常包装称为另外的一个异常,再抛出;还是最后干脆再DAL就执行自己处理,然后给业务层一个友好的提示,等等。如果数据源是远程的服务,那么如果服务断了,在异常过程中,采用什么样的策略:简单的处理,如抛上海闵行企业网站设计与制作出异常,记录日志,还是做一些恢复性的操作,如尝试重新连接,等。

  之前第一张图中,在DAL上定义一个接口,用来接耦,但是在第二张图有做了一些修改--把DAL做为服务提供出去。之所以做了这个修改,因为在开始思考的时候,只是认为底层设计的DAL只是给BLL使用。可以发觉到一点:在DAL中,数据可以从远程的服务中获取,那么可能我们这里的DAL也可以作为服务给其他的人设计的DAL使用,也就是说,我们的这里的DAL成了远程服务的数据源。所以做了上面的修改。但是这个思考到还会改进,因为这里面问题(读者朋友可以先自己思考是什么问题)。

  相关文章:.NET分布式架构开发实战之一 故事起源

                     .NET 分布式架构开发实战之三 数据访问深入一点的思考

                     .NET 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
7月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
136 2
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
9月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
在数字化转型中,企业亟需从海量数据中快速提取价值并转化为业务增长动力。5月15日19:00-21:00,阿里云三位技术专家将讲解Kafka与Flink的强强联合方案,帮助企业零门槛构建分布式实时分析平台。此组合广泛应用于实时风控、用户行为追踪等场景,具备高吞吐、弹性扩缩容及亚秒级响应优势。直播适合初学者、开发者和数据工程师,参与还有机会领取定制好礼!扫描海报二维码或点击链接预约直播:[https://developer.aliyun.com/live/255088](https://developer.aliyun.com/live/255088)
633 35
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
|
9月前
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
283 12
|
4月前
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
11月前
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1209 0
分布式爬虫框架Scrapy-Redis实战指南
|
4月前
|
存储 NoSQL 前端开发
【赵渝强老师】MongoDB的分布式存储架构
MongoDB分片通过将数据分布到多台服务器,实现海量数据的高效存储与读写。其架构包含路由、配置服务器和分片服务器,支持水平扩展,结合复制集保障高可用性,适用于大规模生产环境。
398 1
|
8月前
|
监控 算法 关系型数据库
分布式事务难题终结:Seata+DRDS全局事务一致性架构设计
在分布式系统中,CAP定理限制了可用性、一致性与分区容错的三者兼得,尤其在网络分区时需做出取舍。为应对这一挑战,最终一致性方案成为常见选择。以电商订单系统为例,微服务化后,原本的本地事务演变为跨数据库的分布式事务,暴露出全局锁失效、事务边界模糊及协议差异等问题。本文深入探讨了基于 Seata 与 DRDS 的分布式事务解决方案,涵盖 AT 模式实践、分片策略优化、典型问题处理、性能调优及高级特性实现,结合实际业务场景提供可落地的技术路径与架构设计原则。通过压测验证,该方案在事务延迟、TPS 及失败率等方面均取得显著优化效果。
457 61
|
7月前
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
319 1
分布式新闻数据采集系统的同步效率优化实战
|
9月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
3188 57
|
8月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
2319 7

热门文章

最新文章