写点什么

Shopify 是如何迁移到模块化单体架构的?

  • 2019-08-09
  • 本文字数:1323 字

    阅读完需:约 4 分钟

Shopify 是如何迁移到模块化单体架构的?

Shopify 高级工程师 Kirsten Westeinde 在 Shopify Unite 2019 大会上讨论了Shopify向模块化单体架构的演变。这包括使用设计收益线(design payoff line)来决定何时进行此更改,如何实现更改,以及为什么将微服务排除在目标架构之外。


一个关键的结论是,单体不一定是一个糟糕的架构,它具有许多优点,比如单个测试和部署管道。在项目开始时,当必须快速交付新特性时,这一点特别有用。只有在跨越了“设计收益线”时,也就是糟糕的设计阻碍特性开发的那一点,才应该开始改进架构。就 Shopify 而言,改进其架构并不意味着转向微服务,而是转向模块化单体架构。这结合了单体(例如单个测试和部署管道)和微服务(例如代码模块化和解耦)的优点。


Westeinde 认为,单体架构是一个很好的项目起点,他说:“其实,我建议新产品和新公司开始时使用单体架构。”她列举了其中的一些优点:


  • 一个项目包含所有代码;

  • 只有一个代码库,测试和部署都很简单;

  • 所有数据都可用,无需跨服务传递;

  • 一组基础设施。


由于这些优点,Shopify 一开始只是一个小型的 Ruby on Rails 单体,随着时间的推移,逐渐发展成为一个非常大的代码库。当这种情况发生时,它意味着 Shopify 开始变得不可维护,并且因此很难交付新特性。例如,更改一段代码会对看似无关的代码造成意想不到的副作用,并且构建和测试应用程序花费的时间太长。


Westeinde 援引 Martin Fowler 的设计耐力假说(design stamina hypothesis)解释说,是时候重构他们的架构了——一旦功能开发被糟糕的设计所阻碍,设计收益线就会被跨越,这意味着投入资源来修复它是有意义的。


最初,Shopify 将微服务视为一种可选的、更易于维护的架构。然而,由于分布式系统的复杂性,它被排除在外,取而代之的是更易于维护的单体架构:


我们意识到,我们喜欢单体所有的东西,代码都在一个地方,而且向一个地方部署。我们遇到的所有问题都是由代码中不同功能之间缺乏界限所直接导致的。


Westeinde 解释说,他们意识到他们的设计目标是提升系统的模块化,比如使用微服务,同时保持一个单一的可部署单元,像一个单体。为了实现这一点,Shopify 采用了模块化的单体模式。这使得代码之间有了边界,但要使代码都在同一个位置并且部署到同一个位置。迁移路径如下:


  • 代码重组:最初,代码的组织方式类似于典型的 Rails 应用程序,顶层部件以技术组件命名,如控制器。这被更改为基于业务功能进行组织,如“账单”和“订单”,从而更容易定位代码。

  • 隔离依赖关系:每个业务组件彼此隔离,然后通过公共 API 供外部使用。他们内部开发了一个名为 Wedge 的工具,它跟踪每个组件的隔离情况。它构建一个调用图,然后计算出哪些调用(比如跨组件的调用)违反了规则。

  • 强制边界:一旦每个组件都实现了 100%的隔离,它们之间就有了强制的边界。其思想是,当代码试图访问它没有显式依赖的组件的代码时,就会出现运行时错误。以这种方式声明依赖关系也将使它们在依赖关系图中可视化。


最后,Westeinde 解释说,这个例子很好地说明了架构如何根据业务需求发展:


良好的软件架构是一项不断演化的任务,而应用程序的恰当解决方案完全取决于你的操作规模。


完整的演讲可以在网上观看,也有相应的博客文章


原文链接:


How Shopify Migrated to a Modular Monolith


2019-08-09 08:002325
用户头像

发布了 736 篇内容, 共 475.0 次阅读, 收获喜欢 1548 次。

关注

评论

发布
暂无评论
发现更多内容

万界星空科技QMS质量管理系统介绍

万界星空科技

QMS 质量管理系统 万界兴科科技QMS 质量管理QMS系统 生产质量管理

什么是云,为什么要提倡师生使用云教室?

青椒云云电脑

云教室 云教室解决方案

谷歌SEO适用于独立站优化的8个核心算法

九凌网络

什么是云电脑?云电脑超详细技术讲解

青椒云云电脑

云电脑 云电脑平台

数字技术,为企业全面预算管理贡献数智力量

智达方通

数字化转型 数字技术 全面预算

使用Terraform创建Docker镜像和容器

互联网工科生

Terraform Docker 镜像

文心一言 VS 讯飞星火 VS chatgpt (144)-- 算法导论12.1 4题

福大大架构师每日一题

福大大架构师每日一题

3D模型材质编辑器

3D建模设计

纹理处理 材质 贴图 模型材质 三维模型材质

3D数字孪生场景编辑器

3D建模设计

数字孪生 低代码平台 3d建模 3D场景编辑器 3D场景应用

Mocha Pro 2022 Plugins for mac(AE/达芬奇/Fusion/Nuke/OFX插件) 9.0.1完整激活版

mac

苹果mac Windows软件 Mocha Pro 2022 平面跟踪工具

分布式基础概念 - ZAB协议&负载均衡策略

派大星

分布式 ZAB Java 面试题

青椒云一体机,一起体验云桌面

青椒云云电脑

桌面云 云桌面

适合工业设计企业的云端图形工作站

青椒云云电脑

图形工作站

ABBYY FineReader PDF 15 for Mac「OCR文字识别工具」

彩云

macos Abbyy FineReader OCR

如何轻量化实现灰度发布

Geek_2305a8

MacBook触控板窗口管理:Swish for Mac

彩云

窗口管理工具 Swish for Mac

阿里巴巴工程师最新版 1180 道 Java 面试题及答案整理

架构师之道

程序员 架构师 java面试

3招解决时序数据高基数难题,性能多维度提升!

华为云开发者联盟

数据库 后端 时序数据库 华为云 华为云开发者联盟

云教室是什么意思?云教室与传统教室的区别?

青椒云云电脑

云桌面:优点、缺点和定义功能

青椒云云电脑

云桌面 云桌面方案

用二维码展示产品信息,轻松解决产品宣传难题

草料二维码

二维码 产品更新 草料二维码 产品宣传

NFTScan | 11.20~11.26 NFT 市场热点汇总

NFT Research

NFT\ NFTScan nft工具

营销数智化解析第7期:用友BIP | CRM 渠道工作台、伙伴管理

用友BIP

营销数智化

什么是小程序插件?

Geek_2305a8

电线电缆行业生产管理怎么数字化?

万界星空科技

数字化转型 MES系统 云mes 万界星空科技mes 电线电缆行业

从 15000 家参赛企业脱颖而出,涛思数据荣获中国创新创业大赛“优秀企业”

TDengine

tdengine 时序数据库

“火焰杯”软件测试高校就业选拔赛获奖名单揭晓,人工智能与大数据学院两名学子上榜,奖金2万元!

测吧(北京)科技有限公司

测试

企业如何保障跨境金融业务中的数据安全传输?

镭速

跨境数据传输

国内怎样申请openai 内涵120美刀的api key?内涵120美刀,月底要付120美元吗?

月满楼

ChatGPT chatgpt api

HarmonyOS位置服务开发指南

HarmonyOS开发者

HarmonyOS

Shopify 是如何迁移到模块化单体架构的?_架构_Andrew Morgan_InfoQ精选文章