欢迎来到我们关于公司在生产中使用Elixir的系列案例研究。请看我们迄今为止发布的所有案例。
Community是一个平台,能够利用简单的短信与你想接触的人进行即时和直接的沟通。像保罗-麦卡特尼、Metallica和巴拉克-奥巴马这样的人物都在使用Community,它将小企业、明星和高知名度的个人直接与他们的受众联系起来。
Community由Erlang Ecosystem驱动,Elixir和RabbitMQ发挥了核心作用。本文概述了该系统和用于处理诸如这条推文等事件引起的百万用户高峰的工具。
使用Elixir的第一步
Tomas Koci和Ustin Zarubin是Community最初实施的两位工程师。该公司正在从他们用Go编写的产品转向,他们认为这种语言对于他们正在构建的产品来说表现力不够。因此,当面临在SMS基础上开发一个社交信息平台的挑战时,他们愿意尝试不同的栈。
他们与Elixir的第一次接触是一次偶然的机会。当他们的室友提到Elixir时,他们正在谈论他们面前的挑战。不久之后,事情就开始了。他们都有物理学背景,所以他们发现函数式范式相当直观。Erlang虚拟机也起源于电信业,而他们正在构建一个以电信为中心的产品,这让他们更有信心。
除了技术方面,他们也开始活跃在Elixir社区。Tomas回顾说。"我们开始参加在查塔努加举行的Elixir聚会。我们认识了许多开发者,听说了一些生产案例,并了解到像Bleacher Report这样的公司是如何大规模使用Elixir的。从那时起,他们就决定尝试一下Elixir了。
他们在2018年1月开始了他们的原型,目的是为了让几十个用户入职。他们一边学习Elixir,一边开发系统,并与潜在用户联系。
他们的第一个挑战是在2018年5月,当时他们的一个用户向数百万观众公布了他由社区管理的电话号码。托马斯仍然记得那一天。"那是一个星期六的晚上,大约11点,我们看到了大量的用户涌入。这让我们大吃一惊,10个小时后,超过40万用户注册了。大量的用户涌入给系统带来了意想不到的压力,特别是当涉及到他们的上游整合时。他们不得不给系统打补丁,以确保他们不会使外部系统超载或超过他们必须遵守的API限制。
这一事件也让他们了解到系统在规模上必须处理的峰值和流量模式的类型。早期的工程人员杰弗里-马蒂亚斯(Jeffrey Matthias)敦促他们把应用程序分成不同的服务,这样就可以很容易地单独扩展每个服务,他和托马斯决定让这些服务通过消息队列进行通信。
下一个数以百万计的用户
到2018年10月,该公司获得了资金,新雇用的五人工程团队,开始将原来的应用程序拆分成可以处理需求急剧增加和规模化运作的服务。不久之后,他们的下一个挑战就到手了。Metallica刚刚与该平台签约,他们要在2019年2月1日与他们的粉丝进行提前发布。
团队很高兴地报告说,公告是成功的,他们这边没有发生任何小插曲。然后,他们是五个后台工程师,处理了从架构设计和开发到建立和运营整个基础设施的所有问题。
社区于2019年5月正式揭幕,不久后吸引了数百名音乐明星。14个月后,巴拉克-奥巴马在推特上向数百万人公布了他由社区提供的电话号码。
目前的架构
今天,有60多个职责分明的服务为社区提供动力,例如。
- 社区领导人和成员之间的信息枢纽
- 用户数据管理
- 媒体服务(视频、音频、图像)
- 社区内部团队的系统
- 数据科学和机器学习
- 计费、管理等
这些服务绝大多数都运行Elixir,Python覆盖了数据科学和机器学习的终端,Go则负责基础设施方面。
RabbitMQ处理服务之间的通信。这个由Erlang支持的消息队列负责广播消息并作为其RPC骨干。服务之间的消息通过protobuf-elixir库用协议缓冲区进行编码。
最初,他们使用GenStage库与RabbitMQ对接,但在去年他们已经迁移到更高级别的Broadway库。他们的工程师之一Andrea Leopardi概述了他们的挑战。"我们的系统在接收和传递数据时必须处理不同的流量模式。传入的数据可能在任何时候到达,并且容易出现由社区内的行动驱动的特定事件引起的峰值。另一方面,我们在与合作伙伴的协调下发送短信,他们对数量、速率限制等有不同的限制"。
他继续说。他继续说:"GenStage和Broadway在提供处理这些要求的抽象方面一直是至关重要的。他们提供背压,确保高峰期永远不会超过系统的负荷,并保证我们发送的信息永远不会超过我们的交付伙伴所定义的数量"。由于他们在不同的服务中反复实现相同的模式,他们发现Broadway为他们提供了理想的抽象层次。
他们需求量最大的服务,即消息中心,只由五台机器驱动。他们使用Apache Mesos来协调部署。
团队的成长
Community的工程团队在过去的两年里有了稳定的增长。今天,他们有25个后端工程师,大部分是Elixir开发人员,公司的员工也扩展到120人以上。
早期加入的Karl Matthias认为,他们所面临的挑战和在新语言上工作的兴奋感对招聘人才有积极作用。他详细介绍说。"我们试图雇用最好的生产工程师,有时他们知道Elixir,有时他们不知道。我们的团队普遍认为学习Elixir是一种积极和令人兴奋的经历"。
团队也对Elixir提供的稳定性感到高兴和自信。卡尔补充说。"每次出错时,Elixir监督员都会支持我们。他们会自动重新建立与RabbitMQ的连接,处理掉的数据库连接,等等。该系统从未出过差错,以至于我们的基础设施层不得不启动,这让人感到很新鲜。"
社区团队以一句奇怪的话结束了我们的谈话。他们刚刚关闭了该系统的第一个实施方案,那个在星期六晚上突然收到四十万用户的峰值的方案。托马斯总结说。"我们在学习Elixir时实现的服务一直在生产中正常运行和操作,甚至在所有这些里程碑之后,这相当令人惊讶。而这对我们所有的服务来说通常都是如此:一旦部署,我们就可以大部分时间忘记它们"。