
Overall
0
Activity
Funds Held
Trading Pairs
0
Registered Location
-
Followers
0
如何将关键的微服务成功迁移到monorepo
TL; DR:
背景
Coinbase Payments团队的任务是使客户拥有愉快的经验,使他们能够将资金进出加密货币经济。在设计支付系统时,我们考虑了几个因素,包括但不限于可伸缩性,安全性和备用支付处理器。
目前,我们与付款合作伙伴集成了多种微服务。这些服务的代码存在于许多小型存储库中。随着Coinbase在地理上的扩展,我们支持更多的付款方式,这通常意味着更多的微服务。但是,我们的大多数微服务都遵循既定的设计模式,从而导致频繁的代码复制。
我们一直在考虑以下高级目标来改进系统和工具的方法:
- 减少对付款项目进行更改的成本。
- 确保付款服务及时获得安全更新和修复。
- 增加付款服务中的代码重用。
- 与整个工程范围内的计划保持一致。
今年早些时候,Coinbase Engineering决定使用Bazel monorepo 。付款团队选择利用我们的开发人员生产力团队通过迁移我们的微服务为Bazel monorepo构建的安全性,可靠性功能和世界一流的工具。我们的第一个计划是将关键的Ruby on Rails服务迁移到主要的欧盟/英国付款铁路,该铁路每年将约200万笔价值3.5B美元的付款处理成monorepo。
挑战性
但是,将已经部署的付款系统迁移到monorepo必须解决各种挑战,例如:
- 已经实时处理付款。
- 遵守预定义的SLO和SLA。
- 添加和部署了新功能和错误修复。
- 与我们无法控制的第三方服务的集成。
为了克服这些挑战,我们从定义成功的迁移开始。定义了以下标准:
- 我们的项目应该使用新的monorepo工具:我们的服务是Ruby on Rails应用程序,我们为SDLC使用标准的Rails工具。但是,在Monorepo中,我们使用Bazel进行构建和测试。因此,我们需要更改许多配置以与新工具兼容。
- 我们的项目CI应该从monorepo开始工作:在monorepo中,我们在项目CI中采取的步骤数量有所增加。我们需要花时间了解这些步骤是什么。 Monorepo还使用了其他CI系统。我们的迁移项目涉及进行更改以成功适应新的CI系统,并添加配置和代码以将这些其他步骤传递给迁移的服务。
- 我们的服务部署应该在monorepo上进行:Monorepo使用其他部署工具,因此我们需要确保可以使用新工具在开发,测试和生产环境中成功部署我们的项目。
- 我们的服务与以前一样连接到相同的AWS资源:根据将钱从付款人转移到收款人的付款网络,付款会经过多个州。这些状态中的一些是中间状态,在支付达到其最终状态之前,我们无法承受丢失此类信息的风险。我们还没有计划将数据迁移作为该项目的一部分来进行奢侈。因此,至关重要的是,我们拥有合适的工具来从monorepo部署服务,该服务可以连接到相同的缓存和数据库。
在确定了这些关键要求之后,我们还维护了两个存储库之间的git commit历史记录,并将其作为个人的高标准。我们花了大约六周的时间才开发出新工具,使我们的项目与这些工具兼容,并迁移了所有业务逻辑。
下一步是准备部署并停止所有对我们旧存储库的提交。然后,我们将该服务部署到开发中并测试端到端付款流程。一旦团队感到满意并确信工具和功能上存在100%的均等性,我们便开始将服务部署到生产中。因此,使用新工具的过程很顺利,我们还培训了新工程师从事这项服务。
结论
我们设法将第一个付款微服务迁移到monorepo,今天,它已成功处理了与以前相同的付款量,没有任何错误。
将来,我们计划将更多服务迁移到monorepo中,以解决围绕依赖性管理和代码重用的挑战。我们还与基础架构团队紧密合作,以填补所有空白并添加新功能,然后再迁移更多Ruby服务。关注我们,以获取更多文章,讨论未来几个月我们monorepo的深入组成。
如果您有兴趣解决诸如此类的复杂技术难题,那么Coinbase正在招聘。
Bazel monorepo中的支付服务最初发布在Medium上的Coinbase博客上,人们在其中通过突出并响应此故事来继续进行对话。