一起谈.NET技术,.NET 分布式架构开发实战之二 草稿设计

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

  前言:

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

  本篇的议题如下:

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

  2) 对数据访问层的思考

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

  1.数据层草图的提出

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

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

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

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

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

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

  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 分布式架构开发实战之四 构建从理想和实现之间的桥梁(前篇)

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
12月前
|
负载均衡 测试技术 调度
大模型分布式推理:张量并行与流水线并行技术
本文深入探讨大语言模型分布式推理的核心技术——张量并行与流水线并行。通过分析单GPU内存限制下的模型部署挑战,详细解析张量并行的矩阵分片策略、流水线并行的阶段划分机制,以及二者的混合并行架构。文章包含完整的分布式推理框架实现、通信优化策略和性能调优指南,为千亿参数大模型的分布式部署提供全面解决方案。
3054 4
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
317 2
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
12月前
|
人工智能 API 数据库
Semantic Kernel .NET 架构学习指南
本指南系统解析微软Semantic Kernel .NET架构,涵盖核心组件、设计模式与源码结构,结合实战路径与调试技巧,助你从入门到贡献开源,掌握AI编排开发全栈技能。
1311 2
|
消息中间件 监控 Java
Apache Kafka 分布式流处理平台技术详解与实践指南
本文档全面介绍 Apache Kafka 分布式流处理平台的核心概念、架构设计和实践应用。作为高吞吐量、低延迟的分布式消息系统,Kafka 已成为现代数据管道和流处理应用的事实标准。本文将深入探讨其生产者-消费者模型、主题分区机制、副本复制、流处理API等核心机制,帮助开发者构建可靠、可扩展的实时数据流处理系统。
993 4
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
624 1
分布式新闻数据采集系统的同步效率优化实战
|
机器学习/深度学习 监控 PyTorch
68_分布式训练技术:DDP与Horovod
随着大型语言模型(LLM)规模的不断扩大,从早期的BERT(数亿参数)到如今的GPT-4(万亿级参数),单卡训练已经成为不可能完成的任务。分布式训练技术应运而生,成为大模型开发的核心基础设施。2025年,分布式训练技术已经发展到相当成熟的阶段,各种优化策略和框架不断涌现,为大模型训练提供了强大的支持。
1212 0
|
JSON 监控 Java
Elasticsearch 分布式搜索与分析引擎技术详解与实践指南
本文档全面介绍 Elasticsearch 分布式搜索与分析引擎的核心概念、架构设计和实践应用。作为基于 Lucene 的分布式搜索引擎,Elasticsearch 提供了近实时的搜索能力、强大的数据分析功能和可扩展的分布式架构。本文将深入探讨其索引机制、查询 DSL、集群管理、性能优化以及与各种应用场景的集成,帮助开发者构建高性能的搜索和分析系统。
755 0
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
3901 7

热门文章

最新文章