热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

重构系统的套路明确重构目的

2019独角兽企业重金招聘Python工程师标准重构系统的套路系列:重构系统的套路-写有组织的代码重构系统的套路-提高并发能力重构系统的套路-微服务化本篇说下重

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

重构系统的套路系列:

  • 重构系统的套路-写有组织的代码
  • 重构系统的套路-提高并发能力
  • 重构系统的套路-微服务化

本篇说下重构系统的套路中的,明确重构的目的。

我们进行系统重构会抱着不同的目的,比如为了系统稳定性,为了系统中某些功能负载能力更强,为了系统更便于维护,或是为了系统更便于持续集成提升RD和QA的人效。

不同的重构目的会有不同的重构方式和不同的执行标准。

比如为了系统稳定性的重构,我们更需要关心的是系统稳定性指标,我们需要在整个服务链路上进行梳理,梳理出核心链路,核心链路的耗时控制及QPS,如果不能在整个链路上下游达成统一,往往会造成一些未知且不可控的问题。

比如如果某个服务进行稳定性重构,独断专行的设置了对下游服务的耗时,上线后,整个服务虽然稳定性提升,但是下游服务由于不合理的超时时间造成数据落库失败,在整个链路上看其实这个请求也是失败的,造成的结果就是一个服务的可用性和稳定性上来了,但是整个链路的可用性却降低了,贸然全量这样一个重构,必然产生一个非常大的事故。 如果直接把一个500ms设置成100ms,结果没有在意到这个500ms是一个数据上报功能,其实对核心业务不影响,但是因为降低了400ms造成上报数据系统超时,最终统计数据有误,造成金融结算金额错误,所以一个小小的修改超时时间造成了一个如此大的问题。

如果重构的目的是为了负载能力,比如为了半年整个订单量翻一倍,QPS提升三倍,我们首先需要对现有系统进行压测,发现系统瓶颈,通过完善的监控系统进行耗时稳定代码和逻辑评估,针对性优化。 同时需要对整个重构服务所依赖的缓存,持久化存储,redis,mq等系统容量进行评估,系统中线程池进行评估,而所有的评估都是建立在对对应中间件所服务目的来实现的。

比如我们用redis集群做幂等服务,因为多服务同步之间通过定时任务触发,定时任务触发后可能因为大数据量造成请求挤压,高峰期挤压处理在2~5h不等,所以这个redis的key的超时时间需要覆盖到5h,梳理了程序代码逻辑就ok了吗?

结果服务上线后,整个代码逻辑跑起来没问题,可以高峰期间发现异常日志和错误数据统计不停上升,结果发现是没有正确评估系统QPS,同时没有梳理好redis的key大小,5h的超时时间使得整个key的存储瞬间达到20G+,而某个集群容量可能已经满了,而DBA来不及进行集群扩容,集群自身触发缓存清除策略,大量的key删除造成集群数据的rebalance,造成网络抖动,结果造成高峰期间集群可用性降低,当redis集群可用性降低到一定阈值之后,系统逻辑降级读db,造成了雪崩,整个数据库集群也被压倒,造成了一个重大事故。

上面这个虽然是我自己在系统梳理过程中意淫出来的场景,但我不得不再我进行类似系统重构之前,在代码逻辑角度,功能业务角度,缓存集群,mq集群,DB集群等角度考虑,我这次重构可能造成的问题,只有我们在系统重构之间能够想的比黑天鹅来的更快我们才能对系统做更多的保护,当然这一切不能交给QA同学,需要有经验的架构师有全局的视野和掌控。

如果系统重构的目的在于可维护性,和上面两点的区别在于,周期不可操之过急。 我们需要在整个业务角度去理解系统,同时对未来系统所承接的业务有所评估,这样我们才能设计出一个面向未来的系统。 编写可维护的代码和可维护的系统其实非常的难,微服务的流行和DDD的流行其实也很难根本上解决这个问题,终极的解决方案还是在将RD培养成领域专家,在领域角度去抽象和理解业务,编写领域驱动的代码,而不是简单的认为分层和多模块的搞就可以了。

如果系统重构的目标在于持续集成和发布,提升RD和QA的人效,则需要在工程和流程及文化三个角度去做。 工程上提供便于管理的git系统,全链路压测系统,集成测试环境,多泳道支撑,一键资源申请,完善的上线发版流程及快速回滚方案,QA同学具备正常的http抓包分析能力,测试代码编写能力,基本linux的shell编写能力。 RD编写测试用例,完善技术文档,覆盖功能修改点,配合qa同学观察耗时,连接建立,磁盘IO,机器load,cpu等多指标。 控制发版时间和发版粒度,指定安全发版策略等。

基于以上四点不同的重构需求,我们采取的方案和执行的角度完全不同,系统变大了之后,稳定第一。


转:https://my.oschina.net/u/1000241/blog/1926236



推荐阅读
  • Python错误重试让多少开发者头疼?高效解决方案出炉
    ### 优化后的摘要在处理 Python 开发中的错误重试问题时,许多开发者常常感到困扰。为了应对这一挑战,`tenacity` 库提供了一种高效的解决方案。首先,通过 `pip install tenacity` 安装该库。使用时,可以通过简单的规则配置重试策略。例如,可以设置多个重试条件,使用 `|`(或)和 `&`(与)操作符组合不同的参数,从而实现灵活的错误重试机制。此外,`tenacity` 还支持自定义等待时间、重试次数和异常处理,为开发者提供了强大的工具来提高代码的健壮性和可靠性。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 【系统架构师精讲】(16):操作系统核心概念——寄存器、内存与缓存机制详解
    在计算机系统架构中,中央处理器(CPU)内部集成了多种高速存储组件,用于临时存储指令、数据和地址。这些组件包括指令寄存器(IR)、程序计数器(PC)和累加器(ACC)。寄存器作为集成电路中的关键存储单元,由触发器构成,具备极高的读写速度,使得数据传输非常迅速。根据功能不同,寄存器可分为基本寄存器和移位寄存器,各自在数据处理中发挥重要作用。此外,寄存器与内存和缓存机制的协同工作,确保了系统的高效运行。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • 在Java分层设计模式中,典型的三层架构(3-tier application)将业务应用细分为表现层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。这种分层结构不仅有助于提高代码的可维护性和可扩展性,还能有效分离关注点,使各层职责更加明确。通过合理的设计和实现,三层架构能够显著提升系统的整体性能和稳定性。 ... [详细]
author-avatar
手机用户2502929415
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有