系统内部矛盾的解决思路
最近在项目里面遇到一个比较难以解决的问题,简单的说就是查询问题。
某一张表的数据量比较大,很多业务都会根据条件来查询相关的数据,查询主要分为两类,一类是业务查询,能够根据指定的条件查询出相关的数据,数据量比较小,查询速度快,一类是后台查询,偏向数据分析,特点是查询耗时长,查询数据量比较大。
由于大量系统访问这个数据库,那么对数据源连接的实时性要求就比较高,如果后台查询大量占用数据源的连接,会影响到外部业务,从而影响业务功能的稳定性。
如何解决这个问题,在一般的情况下,我们首先会考虑设置一个合理的超时时间,由于业务查询都是大多是根据关键字查询,耗费时间都会在几十毫秒之下,很少会有大量长耗时的sql,后台的查询耗时比较长,如果设置较小的查询超时时间,会导致无法查询出来结果。那么就根据后台的查询耗时的平均时间,设置一个合理值。这种做法相对来说比较简单,但是会有潜在的风险。可能在默写特殊情况下,业务的查询也会存在热点数据,就是根据这些业务关键字的查询普遍耗时比较长,如果业务系统短时间内大量的热点数据查询,则会占用大量的数据源连接,从而影响正常的业务。尤其是在查询系统无法评估有那些潜在的长耗时查询的时候,系统就处于这种不可预测的有风险的阶段。
第二种方案,就是简单的区分这两种查询。我们先解决的问题是后台查询超时的问题,如果采用上面的方案,则会影响其他的业务系统。那么可以考虑把影响面局限于后台查询。把问题所涉及到的关注点进行分离。就是长耗时和短耗时的问题,那么就配置两个数据源,一个负责提供给业务系统,超时时间设置短一点,连接数设置大一点,一个负责提供给后台查询系统,连接数设置小一点,超时时间设置长一点。通过这种方式,能够把缩小影响面,也能够解决目前的问题。
从上面的一个简单的案例分析,在任何一个系统里面,都存在矛盾的两个方面(也可能存在多个方面)。解决这个矛盾有两个思路,第一个思路是通过两方对话和博弈使其达到一个均衡的过程。在不同的维度进行平衡,比如稳定性和复杂性,安全性和简单性,从不同的角度去考虑,通过加权和降权的方式使其达成一个平衡。还有一个考虑的思路就是对矛盾进行分离,单独进行处理,就是所谓的关注点分离。
类似上面的案例还有很多,我们所说的分层模式,也是把一个大系统中不同层面的所具备的特性不一致,并且有很多矛盾。拿我们最经常使用三层模式:web层,biz层,dal层举例,web层变化非常频繁,同时要快速的满足需求,biz层变化相对来说比web层少,而dal层则不容易变化。分层模式主要是利用系统中不同关注点所面对的问题,每个层次的特性明显不同,这些都是可以才哟过分层的思路来设计。从系统分层到架构分层,都可以看到其背后隐藏着系统内部的矛盾。
不止在IT领域的系统设计存在这个问题,在组织架构上也面临着同样的问题。大公司都会存在一套特定的业务流程满足公司内所有的部门。但有一些部门涉及到的业务要求快,有一些业务要求稳,这两个就是矛盾。这也是金融互联网公司内部面临的主要问题,互联网要求简单,快速,创新,金融则是复杂,稳定,保守。如果解决这些矛盾,也是这类公司面临的问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库