寻找我们的下一个(建筑)

员工软件工程师Dan Weinand分享了握手下一步的愿景,并概述了我们的工程团队在重新想象我们的核心架构时所采取raybet雷竞技下载的实用方法。

raybet雷竞技下载握手在过去的八年中得到了显著的发展和发展。握手成立于2014年,最初是作为一个就业公告板和职业服务支持软件,今天,握手是一个成熟的关系平台,拥有500多名员工。raybet雷竞技下载越来越明显的是,流量和组织规模的持续大幅增长要求对我们的架构采用一种新的方法。是时候提出新的愿景了,我们称之为“下一步握手”。raybet雷竞技下载

从历史上看,握手一直是一个独raybet雷竞技下载立的Rails应用程序,这在早期支持快速开发。然而,随着我们的代码库和团队的成长,这个基础变得更具挑战性。代码的所有权并不总是很清楚,这导致团队在进行更重要的更改时感到自主权有限,或者代码最终没有任何主。考虑到这一点,很明显,我们需要分解我们的整体,以推动更明确的所有权和更大的自主权。

其他公司在发展自己的庞然大物时走的是两条老生常谈的道路:microservices或者一个模块化的庞然大物.两者都有各自的取舍。模块化整体提供了整体的所有好处,以及更清晰的边界。另一方面,他们在使用不同技术或独立扩展应用程序部分方面的能力有限。此外,这些界限在实践中很难执行。微服务提供了技术选择的灵活性和伸缩独立性,代价是需要处理完全分布式系统的所有复杂性。此外,错误的边界可能会创建一个分布式整体,将分布式系统的所有复杂性与整体的所有耦合结合在一起。

考虑到这些问题,我们后退了一步,决定首先关注如何定义我们的边界。

定义我们的边界

分解一块巨石是一个包含许多步骤的漫长过程。考虑到这一点,以及我们专注于建立明确的所有权界限,我们优先考虑逻辑上的分离,而不是物理上的隔离。我们希望我们的代码和数据有组织和模块化,即使它们共享一个代码库或数据库。逻辑隔离是物理隔离的前提条件,它使我们在需要的时候进行物理隔离。何时何地进行物理隔离是由我们的规模需求决定的。

为了确定如何在逻辑上分解我们的应用程序,我们求助于久经考验的方法领域驱动设计(DDD)。DDD被大大小小的公司使用了十多年来处理甚至是最复杂的业务领域,DDD为我们提供了战略设计基础,自信地打破我们的系统。具体来说,DDD提供了a的概念限界上下文.每个有界上下文都是不同的,它与其他上下文的关系是显式建模的,而不是拥有单一的域模型。

在定义边界上下文时,我们决定将它们与业务的子域对齐;这确保了我们的技术边界不会与业务和用户的需求不一致。它还避免创建人工边界,这些边界在技术上有意义,但在不同的用例之间过于一般化或引入过多耦合。

此外,将这些上下文映射到业务子域可以使它们更简单地与我们的组织结构保持一致。为了与我们明确所有权和增加自主权的目标保持一致,我们希望每个有界上下文都由单个团队拥有。

合理精简我们的服务

在决定如何将这些边界转换为代码时,我们希望具有前瞻性和实用性。采用模块化整体策略可以满足我们首先实现逻辑分离的目标,但也可以消除边界上下文的物理隔离的可能性。而采用微服务则需要我们从第一天起就将每个服务进行物理隔离。此外,由于微服务往往非常集中,它们会比我们定义的边界上下文更小。

我们一致使用miniservices.就我们的目的而言,迷你服务是逻辑上分离的服务,它们可以在物理上独立运行,也可以组合在一起,共享一个运行时或其他资源。迷你服务还代表了一个完整的有界上下文;这给了我们很大的灵活性来逐步分解我们的应用程序并与我们的目标相匹配。

有时,某个特性或用例对性能非常敏感,以至于需要将其分离出来,甚至可能用另一种语言编写。对于这些特殊情况,我们允许创建微服务。对我们来说,微服务必须在物理上完全独立,并且它们映射到更广泛的有界上下文的单个特性或用例。我们将这些微服务视为私有实现细节。每个有界上下文仍然为系统的其余部分提供单一接口,而不管它们是否包含任何微服务。

平衡自主与合作

虽然我们希望实现自动驾驶,但我们也达到了需要横向工作的规模。我们希望构建可以跨各种产品特性重用的核心功能,而不必多次重新实现或组合在一起以简化构建新特性或探索新业务线。我们还想继续让我们的产品体验以用户角色为导向,同时全面维护我们的交叉功能。

为了实现这些,我们开发了一种分层的方法,将我们的有界上下文映射到:

  • 体验——特定的用户体验
  • 产品-产品特点
  • 平台-特定于握手的可重用功能raybet雷竞技下载
  • 基础设施——不特定于握手的通用功能raybet雷竞技下载

每一层都代表着越来越具体的关注领域,从我们的通用基础设施一直到用户直接交互的体验。底层的有界上下文可以为上层的多个上下文服务。例如,一个给定的产品特性可能用于多种体验,或者多个产品特性可能构建在单一平台功能之上。

为了简化关系并避免有界上下文之间的循环依赖,给定上下文只能同步依赖于它下面的层中的上下文。

对等上下文之间的协作或反向的协作是通过事件驱动架构.任何上下文都可以监听域的事件由另一个上下文发布。域事件表示一个操作的记录,以及在系统中是谁或什么原因导致了该操作。域事件可以用来触发副作用,但也可以在上下文使用物理上隔离的数据存储时提供一种传输状态的方法。

展望未来

分解一块巨石是一项巨大的工程,可能需要数年时间才能完成。然而,通过像我们上面所概述的实用方法,握手将具有灵活性,以适应我们不断增长的组织和不断扩大的系统规模的需求,同时继续交付重要raybet雷竞技下载的产品更新。


我们已经开始了这段旅程,我们将分享更多关于我们一路进步的故事。我们已经建立了握手下一步的基础,但还有很多工作要做。raybet雷竞技下载我们正在寻找有才华的技术团队成员加入我们的努力,加速这项工作到新的高度。如果你想亲身体验,我们正在招聘

找到适合自己的工作。
得到聘用。