架构设计开发的稳定性思考

最近接触了很多生产上的稳定性问题,总结了下,其实很多问题都是在前期埋下的坑。如果在架构设计、详细设计和编码的时候提前规避掉,会大大减轻后期的运维压力。这里整理下个人理解供参考,欢迎讨论。

本文主要分3个大章节介绍:

架构设计,是希望能站在项目出发点和全局的角度去看整个架构,思考合理性和系统边界的依赖关系,重点放在解决根本问题上,避免出现设计偏差。

详细设计,其实是一种文档规范,基于统一的规范认识,保证各个干系人对于问题和解决方案理解一致。一些关键图形,更能便于其他人快速理解设计意图。

稳定性,主要介绍了在工作中的各个阶段,应该要考虑的重点,对于线上发布变更的内容,要做到可监控、可灰度、可应急。

一、架构设计

1.1 基本背景

简短介绍需求目标(或技术目标),提炼出架构设计上要解决的问题重点(必要性)。

例:本次需求主要是开发一款电子合同签订工具,提供给商业拓展人员使用,提高合同签订效率,预计提效75%,每年节约成本XX元,主要的功能有电子签章、电子条款、电子合同审核流程等。

1.2 业务全景图

主要用于说明上下游关系,判断架构和依赖的合理性;

1.3 改造点

列出涉及到的应用、模块的改造点,重点、风险点、难点

二、详细设计

2.1 用例图

角色、功能、依赖描述

2.2 系统间时序图

描述系统之间的调用时序关系

2.3 系统内流程图

描述内部功能的流转、关键操作

2.4 ER图

数据模型设计、表结构变动

2.5 外部依赖

依赖的外部服务的接口、MQ、工作流

2.6 对外接口服务

对外提供的SOA接口、前端接口、MQ

三、稳定性

安全生产架构重点:灰度和变更、资损防控、攻防、容灾4大重点。

日常治理:巡检、监控治理、限流体系、预案保鲜

日常机制:故障管理、变更管理

可监控:监控是系统的眼睛,通过加入埋点、指标监控、数据监控,能及时发现系统出现的问题,及时介入处理,及时止损。

可灰度:通过流量灰度的方式,观察线上变更的运行情况,如果出现异常,能够将影响缩小到可控范围内。

可应急: 当线上出现问题时,能快速回滚、降级、切换和数据恢复,避免造成恶劣影响。

3.1 接口设计

3.1.1 依赖的外部接口

  1. 确认外部接口的QPS、RT时间,合理设计线程池和超时时间
  2. 接口是否可降级,梳理强弱依赖,弱依赖做异常自动降级
  3. 确认接口的幂等性,尽可能要求支持幂等
  4. 确认接口的交互三态(成功、失败、未知异常)确认,对每一种情况都有处理措施(补偿、告警、日志)
  5. 接口规约,字段名称、字段长度、字段类型
  6. 接口变更,必须兼容老业务;

3.1.2 对外提供的接口

  1. 提供接口的QPS、RT时间;
  2. 接口设计幂等;
  3. 接口有明确的返回值,不要通过抛异常的方式返回,约定好未知异常的处理方式;
  4. 接口规约,字段名称、字段长度、字段类型
  5. 接口变更,必须兼容老业务
  6. 确认调用方的可信度,验证合法性、完整性、真实性,考虑限流、鉴权、越权等设计;
  7. 判断接口是否需要高并发、大数据量压测,提前告知测试;

3.2 开发

3.2.1 消息

  1. 是否允许消息重复,消息投递不保证不重复,订阅端需要依据业务属性做好幂等处理;
  2. 是否允许消息丢失,如不允许,需要有核对机制;
  3. 是否容忍消息乱序,如不允许,需考虑在消费端进行排序;
  4. 是否允许消息延迟,如不允许,需考虑告警机制;
  5. 消息处理异常时,不建议抛出异常,需catch异常,防止大量报错导致的堆积;
  6. 不可丢弃的消息,考虑落表补偿或死信队列;
  7. 配置合理的consumer线程数;
  8. 引入消息,相比rpc调用,复杂度有增高,请在合理场景使用;
  9. 对线上已存在的消息进行变更,应考虑兼容,避免消息消费方异常;

3.2.2 缓存

  1. 是否可降级,考虑缓存失效或Redis不可用的情况;
  2. 注意热key和大对象场景;
  3. 是否需要预热,避免对DB的瞬时压力;
  4. 是否大流量场景,防止缓存击穿;
  5. 是否允许缓存的不一致,如果不允许,需要进行缓存同步(实时检查、定时检查);

3.2.3 SQL

  1. SQL查询必须指明要查询的字段,杜绝select *
  2. 查询条件上要有索引,避免全表扫描影响数据库性能,且查询条件必须同DB字段类型一致,避免查询过程DB进行类型隐式转换造成索引不可用;
  3. 注意分页查询,小心OOM;
  4. 文本字段,注意是否会有特殊字符,如果需要支持特殊字符,需使用utfmb4格式,防止报错;

3.2.4 编码

  1. 空指针异常不被允许;
  2. 涉及到更新外部应用数据的,建议先落地本地数据,再发起请求,调用失败后有补偿、回滚机制;
  3. cache代码块中,必须清晰打印日志,不能吃掉异常;
  4. 代码报错后的处理措施;

3.2.6 工作流

  1. 是否多机房部署,发布或切机房是否会影响;
  2. 并发调用、多次调用的影响;
  3. 未按时执行对业务的影响;
  4. 是否可监控;

3.3 测试

3.4 发布

发布前,check发布流程;

发布中,分批灰度、监控;

发布后,观察、监控;

3.5 监控

  1. 新服务需配置CPU、内存、NPE、异常量监控,关键业务异常可打点告警;
  2. 线上数据的持续核对机制;

附一张技术风险领域大图

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 软件架构师应该掌握的技能包括: 1. 软件架构设计:能够根据需求设计出合适的软件架构,并能够评估不同方案的优劣。 2. 编程能力:能够熟练使用至少一种编程语言进行开发,并能够根据项目需要选择合适的语言。 3. 项目管理:能够带领团队完成项目,包括制定项目计划、协调资源、监控进度、风险控制等。 4. 数据结构与算法:能够熟练使用常见的数据结构和算法,并能够在设计时选择合适的算法优化系统性能。 5. 系统设计:能够设计出可扩展、高可用、高性能的系统,包括网络架构、数据库设计、缓存策略等。 6. 软件测试:能够设计和执行有效的测试用例,保证软件质量。 7. 软件工程实践:熟悉常用的软件工程方法,包括版本控制、持续集成、自动化测试等。 ### 回答2: 软件架构师是负责设计和规划软件系统架构的专业人员。为了成为一名合格的软件架构师,他们需要掌握以下技能: 1. 扎实的编程基础:软件架构师应具备扎实的编程基础,熟悉各种编程语言和开发工具。只有通过编程实践,他们才能更好地理解代码实现的细节,从而更好地设计软件架构。 2. 系统设计与分析能力:软件架构师需要具备系统设计和分析的能力,能够根据需求和功能设计系统的整体架构。他们需要能够将复杂的业务需求分解为可实现的技术解决方案,并能够考虑系统的拓展性、可维护性和可靠性。 3. 基础设施和技术知识:软件架构师需要对各种基础设施和技术有深入了解,包括操作系统、数据库、网络和云计算等。他们需要了解这些基础设施和技术如何影响系统架构设计,并能够选用适合的技术来支持系统的功能和性能需求。 4. 解决问题的能力:软件架构师需要具备解决问题的能力。在软件架构设计过程中,会遇到各种技术和架构上的问题,需要能够独立思考和分析,并提供切实可行的解决方案。 5. 沟通和团队合作能力:软件架构师通常需要与业务部门、开发团队和其他技术人员进行沟通和合作。他们需要具备良好的沟通能力,能够将复杂的技术概念清晰地传达给非技术人员,并能够与团队成员合作,共同实现项目的目标。 总之,软件架构师需要具备扎实的编程基础、系统设计与分析能力、基础设施和技术知识、解决问题的能力以及沟通和团队合作能力。这些技能的掌握将有助于软件架构师在复杂的软件项目中设计出稳定、可靠和可扩展的系统架构。 ### 回答3: 作为软件架构师,他们需要掌握以下一些技能: 首先,他们需要具备扎实的软件开发基础知识和技术能力。这包括熟悉常用的编程语言、算法和数据结构,掌握面向对象的设计开发方法,并能够灵活运用各种开发工具和框架。 其次,软件架构师需要具备良好的系统设计和分析能力。他们应该具备对复杂系统的整体把握能力,能够根据客户需求和业务目标来设计合理的架构方案,并能够评估和权衡不同的技术选型和实施方案。 此外,软件架构师还需要具备良好的沟通和团队协作能力。他们需要与产品经理、开发人员和测试人员等各个团队成员密切合作,共同达成项目目标。他们还需要与各个利益相关者进行有效的沟通和协调,确保系统架构能够满足业务需求。 另外,软件架构师还应该有持续学习和创新的意识。软件行业日新月异,技术不断更新,软件架构师需要密切关注行业动态,不断学习新知识和技术,以保持竞争力,并能够提出创新的解决方案。 最后,软件架构师应该具备良好的问题解决和决策能力。在项目中,他们可能面临各种技术和业务问题,需要能够快速准确地分析问题,制定解决方案,并做出明智的决策。 总之,软件架构师应该具备扎实的开发技术和系统设计能力,良好的沟通和团队协作能力,持续学习和创新的意识,以及问题解决和决策能力。这些技能将帮助他们在软件开发项目中担当重要角色,提供高质量和可靠的系统架构

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值