欢迎来到我们关于公司在生产中使用Elixir的系列案例研究。请看我们迄今为止发布的所有案例。
Brex正在重新构想财务系统,以便每个成长中的公司都能实现其全部潜力。新客户可以在几分钟内启动并运行企业信用卡和现金管理的单一战略账户。2018年6月推出的Brex在宣布其C轮融资时获得了11亿美元的估值。 到现在,Brex的估值为26亿美元,Elixir是其技术栈的核心。Brex的后端代码库中约有90%是用Elixir编写的。
为什么是Elixir?
Brex的目标是建立新一代的B2B金融服务,不受传统技术的限制。他们从第一天起就选择Elixir和Erlang虚拟机作为他们的主要技术。
Brex的首席工程师Thomas Césaré-Herriau最近帮助我们解决了这一选择背后的原因:"Erlang虚拟机的可靠性和容错性对构建金融服务来说是非常有吸引力的。Elixir在相同的虚拟机上运行,它为平台提供了很好的入职和学习体验,这使得Elixir成为Brex这样的公司的坚实保障。"
一个不断发展的架构
Brex架构是由大约40个运行在Kubernetes上的微服务组成。有一个前端应用程序,用Phoenix和Absinthe实现,与这些服务进行互动。
同步通信是通过gRPC完成的,Apache Kafka用于异步消息和广播。然而,他们并不是在一夜之间到达这个架构的,他们在这一路上有许多学习的时刻。
他们早期的教训之一是与Erlang的RPC基础设施的适用性有关。尽管Erlang确实提供了开箱即用的RPC,但Erlang的内置集群建立了一个完整的网状集群。这种设置很适合运行同质化的实例,即所有节点都运行相同的代码,但在构建孤立的微服务时就不适合了。Brex团队还想为未来做打算,他们可能会在用不同语言实现的服务之间进行通信。这些要求促使他们探索更广泛采用的RPC机制,最终确定了gRPC。
Brex也是生态系统中较早采用gRPC的人之一,这意味着他们不得不在这里和那里踏上未知的水域。现在,他们有一套明确的准则和实践,与他们如何扩大公司和Elixir团队的规模相辅相成。
团队的成长
当托马斯加入团队时,早在2018年4月,他们在旧金山的办公室只有三名后台工程师。现在,两年后,Brex有超过100名工程师--其中大部分是用Elixir编程--在纽约、温哥华和盐湖城都有额外的办公室。
尽管Elixir是一种相对小众的语言,但以前从未接触过Elixir的新员工在三周内就有了成效。
- Brex的联合创始人Pedro Franceschi
Brex的联合创始人Pedro Franceschi写了他们在招聘新工程师时的经验。"尽管Elixir是一种相对小众的语言,但以前从未接触过Elixir的新员工在三周内就有了成效。有相当数量的关于该语言的书籍/文献,可以加速提升过程。"
托马斯也表达了类似的观点。"开始使用Elixir是很快的,但掌握Erlang/OTP需要一段时间"。同时,他认识到社区中的许多框架,以及他们在内部建立的框架,抽象出了并发和容错的问题,使开发人员能够快速地交付可靠的服务。
这种快速增长伴随着它的挑战。Brex代码库开始时是一个伞状项目,这是一个Elixir功能,用于管理同一仓库中的多个应用程序,但Thomas认为他们已经超越了其能力。现在他们正在慢慢地将伞状项目分解成独立的Elixir应用程序。所有项目仍然属于一个单一的资源库(mono-repo),这个资源库也已经发展到包括其他语言。
未来的发展
随着Brex的发展,他们希望确保Elixir的采用将与他们的团队一起扩展。正如Pedro在2018年指出的那样,"缺乏类型系统使得大规模重构更加困难,因此将成为Elixir生态系统的一个重要补充。"
考虑到这一点,Brex决定加入许多其他公司,直接投资于Elixir的未来。他们聘请了Elixir核心团队的Eric Meadows-Jönsson和Hex.pm的创建者,负责Elixir的工作,增加编译器的静态检查量。Eric总结说:"多年来,Elixir团队一直在朝着这个方向不断改进编译器。我们早在Elixir v1.3就引入了交叉引用检查和未定义函数警告。此后又增加了许多其他警告和检查。Elixir v1.10引入了编译跟踪器,这使得社区可以监听编译器并运行他们自己的检查。现在,我们正在努力利用现有的结构--如模式、守卫和数据结构器--来执行更多的静态检查,而不需要明确的开发人员输入。