公司系统做了一年多,慢慢也有点规模了。从最初只有一个APP + 一个server的模式,到现在有多个子系统,多个客户端。这个过程中,积累了一些想法,本文简单总结一下
系统拆分的好处
基本上,比较小的系统,单进程集中部署就可以了。集中部署不代表一定不好,在系统规模很小的时候,或许是最适合的,因为调用关系简单,开发也比较容易。但是系统慢慢变大了以后,我认为拆分系统,分布式部署就变得更为合理了。
拆分系统至少有这些我体会到的好处:
1、停掉系统的一个部分,只会影响相关业务,不会造成整体业务中断。特别是一个新的模块上线,尚未稳定的时候,可能会有错误挂掉,或者主动重启维护等,如果是集中部署,就会造成整个系统都不可用。但是分布式部署的情况下,只会中断小范围的业务。当然,就算是集中部署,利用集群,分批重启,也可以实现同样的目的
2、对压力大的节点,可以单独部署集群。比如我们的系统,数据同步模块的负载是最高的,那么就可以针对这个子系统单独部署集群,其他负载低的模块,可以部署在一起,或者单独部署,都比较灵活。当然,要实现水平伸缩,对系统设计本身也有要求,比如至少要实现无状态服务等
3、代码分离,便于权限控制。一般来说,集中部署的代码也是在一起的,如果希望负责子系统A的小组,不需要接触到子系统B的代码,那么分成2个代码库就非常容易实现。相反,如果代码都是在一起的,控制就比较困难。因为不能只开放一部分代码给开发人员,这样不利于在本地搭建开发环境
4、按责任田制度,小团队维护特定模块。跟上面一点比较类似,每个小团队的责任边界比较清晰
按业务垂直拆分系统
拆分系统也要根据实际情况,有不同的选择。我们早期的时候是根据业务,垂直拆分子系统,比如划分成微站,数据同步,连锁等。这样做的好处是,每个子系统都是可以独立跑起来的,比如说把微站子系统运行起来,微站的页面就都能访问了,数据也是该系统自己负责读写的。但是缺点也很明显,就是冗余的代码比较多。比如连锁和微站,2个子系统都需要查询企业信息,那么就各自都写了这部分代码,其实接口几乎是一模一样的,存在很大的复用空间。重复行为基本上都是不好的,这个应该说是开发人员的共识
网状结构
后来做了一点调整,基本上子系统还是按照业务拆分的。但是每个子系统都对外提供服务,比如基础数据查询模块,提供了查询企业信息的接口。连锁和微站子系统,自己就不重复查了,而是以HTTP方式,调用基础数据查询模块的这个接口。这种方式的优缺点和上一种方案大致相反。消除了重复代码,但是模块之间存在依赖关系。如果基础数据查询模块不跑起来,那微站模块虽然能跑起来,但是相关的数据就没有了
而且这样调用关系会比较复杂一点,因为本地调用都变成了HTTP接口调用,意味着业务模块,需要知道去哪里调用所需的服务,可能需要配置很多IP地址(如果依赖很多外部服务的话)。并且这个IP地址是经常需要变化的,不同的开发人员,本地的开发环境地址都不一样;开发环境和生产环境的地址也不一样;生产环境的集群配置变化了,也可能造成地址的变化。系统的复杂性变得比较高
星型结构
再后来为了解决这个调用的问题,TOPO演进为星型结构,有一个中心节点。业务模块把所有的内部请求都发到这个中心节点上,由中心节点负责转发到服务提供者上。这样对于业务模块来说,就不需要知道服务提供方的实际地址,只要把所有请求都发到中心节点上就可以了。映射的工作由中心节点来完成,需要类似这样的映射:
service1 192.168.1.110:8080/svc1
service2 192.168.1.110:8080/svc2
service3 192.168.1.111:8080/svc3
……
这个工作,在服务的数量和复杂度不是太高的时候,只需要一个简单的路由就可以了,不需要专门的服务治理方案。比如我们早期采用的就是nginx,把nginx当做内部的服务中心来使用,借助server_name,proxy_pass,up_stream等特性,已经足以满足需求。但是当服务的数量和复杂度达到一个量级,就需要有专门的方案,来处理服务的注册、发布、寻址、负载均衡、队列、失败重试等需求了
分享到:
相关推荐
总结来说,系统拆分是大型项目开发中必须面对的问题,它能帮助团队更好地应对代码量激增、协同困难等问题。Dubbo作为分布式服务框架的一种选择,以其强大的功能和优秀的性能,在服务治理领域占据了一席之地。然而,...
Word2021主控文档完成多人协同文档编辑 ...我们之所以要使用主控文档,主要在于主文档中进行的格式设置、修改、修订等等内容都能自动同步到对应子文档中,这一点在需要重复修改、拆分、合并时特别重要。
通过对各子系统的拆分成本和目标成本的比较,设计团队发现镜架部分具有较大的成本降低潜力。于是,他们采取了无边框设计,不仅满足了消费者的时尚要求,还有效降低了成本。 在设计和成本控制方面,吴良材眼镜公司...
5. Facade(外观):为子系统中的一组接口提供一个一致的界面,Façade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(对外统一接口)。适用场景:要为一个复杂子系统提供一个简单接口;是,子系统...
在实际应用中,如“高校信息管理系统”,这个复杂的系统可以被划分为多个子系统,如人事管理、设备管理、教学管理、财务管理、学生管理等,每个子系统又可以进一步细分为更小的模块,如学籍管理、成绩管理、数据查询...
2. **组件系统**:Vue.js的组件系统允许开发者将UI拆分成可重用的部分。在这个时钟应用中,可以创建一个`Clock`组件来封装时钟的逻辑和展示,然后可能还有`Date`和`Week`子组件分别处理日期和星期的显示。 3. **...
循环群的子群研究尤其重要,因为循环群的子群必然是循环的,这一点可以通过生成元的选取来证明。 ### 正规子群与商群 正规子群是群论中一个重要的概念,它是对子群概念的一种拓展。如果一个群G的子群N在G中保持左...
它要求我们从整体到局部,根据不同的角色和顺序,系统地梳理出活动的每一个步骤。这种思考方式有助于运营人员将复杂的工作简单化,从而更高效地组织工作、提高效率。 试想,当运营工作中出现突发情况,面对问题时,...
总结来说,Vue实现购物车详情页面的要点在于利用组件化开发思想,将页面拆分为多个可复用的子组件,并通过数据绑定和事件处理将业务逻辑与页面展示相结合。在实例代码中,还需注意组件之间的通信、数据的验证以及...
在流水线中,每个运算步骤被拆分成多个子步骤,每个子步骤可以同时在不同的乘法运算中进行。这种并行处理的能力显著提高了CPU的吞吐量。 ### 总结 计算机中的乘法运算是通过基础的硬件操作——加法和移位——来...
这份"JavaScript性能优化技巧分享共8页.pdf.zip"压缩包文件很可能是对一些关键优化策略的总结,虽然我们无法直接查看具体内容,但根据标题和标签,我们可以探讨一些常见的JavaScript性能优化方法。 1. **延迟加载...
总结起来,微前端架构通过拆分大型应用为独立的子应用,提高了开发效率、降低了维护成本,并提供了更好的扩展性和迭代能力。然而,实现这样的架构也需要开发者深入理解前端技术栈,熟练掌握组件化、路由、状态管理和...
此外,患者还重新获得了脊髓损伤水平以下关键肌肉的自主运动控制,这一点通过肌电图(EMG)来测量,导致他们的行走指数有了显著提升。结果有50%的患者被重新分类为不完全截瘫。神经功能恢复还伴随着大脑皮层水平下肢...
问题分解是为了简化问题的复杂性,将其拆分为更小、更易管理的子问题,并分别找到解决这些问题的框架。然而,由于现实世界的问题往往非常复杂,现有的问题框架可能无法完全适应,这就需要通过引入特征模型,使得能够...
设计模式是解决软件设计中常见问题的经验总结,它们在不同的上下文中被广泛重用。在Rails中,一些常见的设计模式包括: 1. **单一责任原则(Single Responsibility Principle, SRP)**:每个类或模块应只有一个职责...