dbaplus社群 前天 11:07
系统就是被这样的架构设计一步步毁掉的……
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文作者分享了软件架构设计的经验方法,强调架构决策不仅需要技术能力,更要权衡利弊、考虑长期影响,并与团队有效协作。文章通过六个常见场景,如平衡简单性与灵活性、自研与采购、单体与微服务等,阐述了在不同情况下如何做出合适的架构选择。作者还总结了八个最佳实践,包括以史为鉴、警惕技术炒作、为变化而设计等,旨在帮助开发者提升架构决策能力,打造更优秀的软件系统。

🤔 **清晰性是架构的基础**:在进行架构设计之前,务必深入理解问题,通过不断追问“为什么”、明确约束条件、与利益相关者沟通以及聚焦核心用例,确保对问题有充分的认知。

✅ **平衡多种架构模式的优劣**:在面对不同方案时,如REST API与事件驱动架构、自研与采购、单体与微服务、SQL与NoSQL等,需要根据具体场景权衡其优缺点,选择最适合当前需求的解决方案,避免盲目追求新技术。

🔄 **渐进式重构老旧系统风险更低**:对于技术债务高的老旧系统,采用渐进式重构的方式,通过包装遗留组件、逐步抽取服务、强化测试与CI/CD等手段,逐步现代化系统,相比完全重写风险更低、更可控。

📚 **持续学习和迭代优化是关键**:优秀的架构并非一蹴而就,而是通过持续学习、灵活调整和理性决策逐步打磨而成。要以史为鉴,警惕技术炒作,并为变化而设计,在实践中不断改进架构。

⚖️ **平衡短期与长期利益**:架构决策需要平衡短期交付速度与长期可维护性,避免为了快速交付而牺牲未来的可维护性。同时,要消除技术偏见,基于需求而非个人喜好选择工具。

原创 Vinod Pal 2025-05-22 07:15 广东

正确决策不仅需要技术能力,还需要权衡利弊、考虑长期影响,并与团队有效协作。

架构决策可以成就或毁掉一个软件系统。

我逐渐意识到,做出正确决策不仅需要技术能力,还需要权衡利弊、考虑长期影响,并与团队有效协作。

本文将分享我的软件架构设计方法,以及如何应对艰难的决策场景。

几乎没有完美的答案——只有最适合当前场景的解决方案。

架构始于清晰性

在开始画架构图之前,我强迫自己要彻底理解问题。

清晰定义问题是做出优秀架构决策的前提。

以下是我的方法论:

1、反复追问“为什么?”

当有人说“我们需要微服务”时,我不会直接同意。而是反复追问原因,直到理解真实需求——可能是扩展性、团队分工或快速迭代。

2、明确约束条件

性能、扩展性、团队技能、预算等因素会直接影响架构形态。

3、与利益相关者沟通

包括产品、业务和运维团队。他们可能提出隐藏需求,例如合规要求、成本限制或现有痛点。

4、聚焦核心用例

初期不纠结边缘场景,专注系统必须完美实现的核心功能。试图满足所有需求的架构往往一事无成。

5、用一页纸写清楚

这并非陈词滥调!若无法用一页纸清晰描述问题和约束,说明理解尚不充分。纸上模糊的架构,落地后必然混乱。

一、平衡简单性与灵活性

场景:团队正在开发电商平台。支付成功后需立即通知订单系统和库存系统。

矛盾点:系统需支持秒杀活动的高并发流量,同时保证可靠性。

可选方案:

1、使用REST API同步调用,确保即时响应但增加耦合性。

2、采用事件驱动架构(如Kafka),提升扩展性但引入复杂度。

你会如何选择?

我的决策思路:

当事件简单时,REST API会简单直观,但在高并发场景下可能成为瓶颈。

使用REST API,PaymentService首先调用OrderFulfillmentService,然后调用InventoryService,类似这样:

    POST /confirm-payment

    → call OrderFulfillmentService.confirmOrder(orderId)

    → call InventoryService.deductStock(orderId)

    → return response to client

    REST方案会产生的问题:

      任一服务响应延迟会阻塞整个流程

      服务宕机导致支付确认完全失败

      需处理分布式事务和重试机制

    由此看来,事件驱动架构的优势更显著:

      松耦合:支付服务无需感知下游服务

      独立扩展:库存服务过载时可单独扩容(例如库存压力大时单独扩展消费者组)

      故障隔离:订单服务宕机不影响支付主流程

      扩展性:新增功能只需订阅事件,无需修改现有代码

    尽管需处理消息队列监控、重试和去重等问题,但扩展性和可靠性收益远超成本。

    二、自研 vs 采购

    场景: 开发企业级移动应用,需支持MFA、生物识别登录和SSO,同时满足GDPR/HIPAA合规。

    可选方案:

    1、自研认证服务以实现完全控制。

    2、使用Auth0或AWS Cognito等第三方服务快速上线。

    我的决策思路:

    安全功能实现难度高且容错空间小。在此场景下,选择第三方服务更合理:

        第三方服务已通过实战检验,内置合规支持并持续更新

        自研需投入大量时间成本,并需安全专家、审计和长期维护,分散团队对核心业务的专注力

        虽然可能产生额外费用,但自研的隐性成本(如安全漏洞风险)更高

      三、单体 vs 微服务

      场景: 初创公司开发SaaS平台,需快速迭代验证产品市场匹配度(PMF)。

      备选方案:

      1、采用模块化单体架构,后期逐步拆分。

      2、直接采用微服务架构,早期引入复杂度。

      你的决策是哪一个?

      我的决策思路:

      微服务虽酷炫,但初期更适合模块化单体:

          初期产品未验证市场时,单体架构便于快速开发和调试,部署维护更简单

          明确产品方向后,再逐步拆分出微服务(如 Instagram、Facebook 均采用此路径)

          过早使用微服务会引入分布式事务、服务间通信等复杂度,拖慢早期进度

        四、SQL vs NoSQL

        场景: 开发支持动态字段的CRM系统,需平衡灵活性与扩展性。

        备选方案:

        1、使用PostgreSQL的JSON字段支持动态数据。

        2、采用MongoDB等NoSQL数据库原生支持动态模式。

        我的决策思路:

        默认选择关系型数据库(ACID事务和复杂查询优势),但若自定义字段变化频繁,NoSQL 更合适:

            NoSQL 天然支持动态模式,写入和读取更高效

            扩展性更强(尤其水平扩展场景)

            若需复杂报表,可结合 SQL 与 NoSQL 混合使用

          五、缓存策略:实时 vs 预计算

          场景: 视频推荐系统面临高并发查询压力,需快速优化性能。

          备选方案:

          1、引入Redis缓存加速重复查询。

          2、异步预计算推荐结果并存储至读优化数据库。

          我的决策思路:

          优先选择Redis缓存:

              快速见效:缓存可将查询耗时从 2 秒降至 100 毫秒以内

              改动风险低,现有架构影响小

              预计算虽更快(<10ms),但需额外存储和计算资源,适合长期稳定负载

              紧急情况下,先通过缓存缓解问题,后续再优化为预计算方案

            六、改造遗留系统

            场景: 维护20年老旧单体系统,技术债务高且迭代困难。

            备选方案:

            1、推倒重来,从零构建新系统。

            2、渐进式重构,逐步现代化。

            我的决策思路:

            完全重写风险极高:

              周期长,可能中途失去业务支持

              新系统可能引入未知缺陷

            渐进式重构更可控:

                包装遗留组件:通过接口隔离旧代码,逐步替换内部实现。

                逐步抽取服务:从低风险高价值模块开始拆分。

                强化测试与 CI/CD:确保重构不影响现有功能。

                迭代优化架构:分阶段改进,而非一次性“完美解决”。

              最佳实践总结

              1、以史为鉴:复盘历史项目,分析成功与失败模式。

              2、警惕技术炒作:不盲目跟风,只选适合当前需求的工具。

              3、为变化而设计:通过模块化和松耦合支持架构演进。

              4、小步验证:通过原型验证性能、扩展性等假设。

              5、评估可逆性:优先选择易于回退的决策。

              6、允许纠错:建立持续改进的团队文化。

              7、平衡短期与长期避免为快速交付牺牲未来可维护性。

              8、消除技术偏见:基于需求而非个人喜好选择工具。

              优秀架构并非一蹴而就,而是通过持续学习、灵活调整和理性决策逐步打磨而成。

              你在架构决策中遇到过哪些挑战?欢迎留言分享!

              作者丨Vinod Pal     编译丨Rio

              来源丨网址:https://medium.com/@vndpal/how-i-make-better-architectural-decisions-as-a-senior-developer-09ab94e0715f

              dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

              阅读原文

              跳转微信打开

              Fish AI Reader

              Fish AI Reader

              AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

              FishAI

              FishAI

              鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

              联系邮箱 441953276@qq.com

              相关标签

              架构决策 软件设计 系统重构 技术选型 最佳实践
              相关文章