八个人如何扩展高负荷项目。 不飞溅的经验


照片: 亚历克斯·史密斯 | 不飞溅

下午好

我叫Victor Pryazhnikov,我在Badoo的功能部门工作。 我们部门的主要任务是开发站点和应用程序用户可以看到的功能。 当我看到Unsplash联合创始人Luke Chesser的一篇文章时,她对他们感兴趣,因为他们能够用一个非常小的团队开发一个相对较大的项目,这让我很感兴趣。 作者的态度使他的实用主义印象深刻,并以某种方式提醒您您不是Google ,所以我决定翻译它。

Unsplash开发中最有趣的事情之一就是产品的规模和受欢迎程度。

在通常的一天,我们的API处理来自unsplash.com和数以千计的第三方应用程序的1000万个请求数百万个事件通过我们的数据处理管道6000万个更新被添加到Feed中,并提供6000万个图像。

同时,我们的团队相对较小:两名设计师,三名与前端一起工作的人,两名与后端一起工作的人和一名数据工程师。 我们没有单独的DevOps工程师,每个团队成员都将大部分时间都花在试验和开发新功能上,以确保产品的进一步开发。

尽管我们在Unsplash方面已经取得了很多成就,但我们仍处于他作为产品和业务的旅程的开始。 我们仍然有需要证明的事情,这意味着整个团队需要专注于解决Unsplash特有的问题,而不是解决任何其他公司存在的问题,例如组织计算,网络安全,构建基础架构,管理依赖等

在过去的三年中,我们制定了一套原则,使我们能够专注于增长并避免规模问题。 不幸的是,对于那些正在寻找灵丹妙药的人来说,它不会在这里出现:这只是常识和我们从他人那里借来的一套原则。

1.使用无聊的明显解决方案


还是要务实。

在着手引入新工具之前,先尝试数据库(RethinkDB,RocksDB等),新模式(“一切正常!”)或新架构(“微服务,帮助!”),然后尝试所有显而易见的选择。

在后端,很少有问题无法使用标准的,众所周知的工具和经过验证的模式有效地解决,例如缓存,批处理,异步处理和必要数据的初步准备。

2.专注于解决用户问题,而不是技术


Unsplash是产品,而不是技术公司。 我们从投资者那里获得了很多钱,专注于解决产品和市场的问题,而不是试图通过使用通用技术将运营成本降低3%。
我们花时间使用现成的技术,以帮助解决用户的问题并扩大Unsplash社区。 这些是Unsplash特有的任务,如果我们成功创建了一些新的有价值的东西,则可以将优化推迟到以后,这些3%的优化可以成为增长的主要来源。

我们已经了解了Unsplash的规模和一个小团队,图像的使用和人工智能,未来的功能,我们的潜在同事可能会因为我们使用了许多现成的技术,服务和框架而感到困惑。 这使我们现在付出了更多,但是它使我们可以将这些技术的内部开发推迟一段时间,并将其转移到我们未来的同事的肩膀上。

布置代码,配置服务器,系统依赖项,数据处理和分析,图像处理和个性化的过程是我们选择的领域的示例,这些领域不是我们专注于我们的工程资源,而是为它们中的每一个使用现成的第三方服务。

3.花钱解决技术问题


关注产品问题的另一面是获得现成技术和第三方服务的额外费用。

在我们团队内部这成了一个笑话。 他们说,我对任何问题的第一反应将是以下问题:“您是否尝试过用金钱解决它?”。 但这不是开玩笑,而是我最喜欢的解决问题的方法之一。

使用简单且重复性的解决方案来优化与基础结构和技术相关的成本是一个普遍的问题,以至于没有任何一家有投资者的产品公司应该照顾它,直到感觉到主要指标的增长不再是其首要任务。

当我们花钱解决技术问题时,我们会解开团队的力量,让团队专注于重复出现的复杂问题,例如寻找一种方法来在当前季度中将用户群的规模增加40%。


因此,这是我们遵循的三个相当简单但抽象的原则。

但是在实践中它们看起来像什么?

如果您查看Unsplash架构,您会发现它非常简单且几乎无聊(至少按2017年的标准)。


组成Unsplash的主要部分的简化图

我们尽可能使用Heroku来简化核心应用程序的布局,配置,测试,支持和扩展。 Heroku是一种魔术,它将应用程序的各个部分与开发过程分开,因此我们的团队成员无需熟悉它就可以开发和布置实验。

我们积极地减少为应用程序的业务逻辑编写的代码量(图中的紫色区域)。 在编写它时,我们会积极使用其他人创建的框架,这些人作为各自领域的专家,已经开发出可以在95%的用例中成功工作的解决方案。

我们在生产中积极使用Redis,Elasticsearch和Postgres。 过去,我们尝试了其他数据库,但始终返回到这三个数据库,因为我们确信我们了解它们在负载下的行为。

我们还积极使用任务队列,异步处理许多操作,例如在不同源之间更新,聚合和同步数据。

对于数据处理,我们使用Snowplow (一个用Scala编写的开放式集成框架),它使我们的团队无需考虑组织进入和退出,而无需考虑处理本身。

我们还使用整套云监视服务,例如DatadogNew RelicSentryLogentries ,而不是部署和维护我们自己的StatsD或ELK堆栈。

我们将托管图像的主机和基础设施外包给了imgix后者是处理动态图像的领先公司。 如果他们添加了一些新功能,则我们的团队将对URL进行一次更改-并且我们的用户也可以访问此功能。

我们利用用户在构建和优化高负载个人磁带方面的经验,在Stream服务中记录用户的所有操作。 Stream为我们简化了数十亿个动作的处理,并提供了用于进入和退出的简单API,其工作效率如此之高,以至于我们的团队将花费数月甚至数年自行创建。

我们不会自己训练图像识别算法,而是使用TinEye进行反向图像搜索,并使用Google Vision进行图像识别和分类。

我们将所有行为事件记录在Vero (用于处理通知和邮件列表的平台)中,这使我们能够将与之相关的工作转移给非开发人员的同事手中。 基于对用户行为的可用数据的复杂使用,他们自己可以创建具有高度个性化的字母。



同时,我们将重点放在Unsplash可以提高我们核心能力的那些部分上。

在过去的一年中,我们将单个Ruby on Rails应用程序拆分为Rails API,Node.js + React Web应用程序,并创建了一个单独的数据应用程序,该应用程序收集和处理我们所有的内部和产品指标。

这使我们的团队可以创建在仅由Rails组成的旧堆栈中几乎无法实现的功能。 在分享了我们应用程序的问题和技术之后,我们的团队还获得了在每个领域使用最佳工具的机会:

  • 在前端,我们将React和Webpack与小型Express服务器一起使用,以支持服务器渲染和代理API请求。 我们故意不使用诸如react-railswebpacker之类的临时黑客将前端团队的工具绑定到后端。 毫无疑问,JavaScript社区发布了使用前端的最佳工具,因此直接使用JavaScript可以使我们的团队迅速为用户提供高质量的功能。
  • 在后端,我们的团队将继续使用最佳框架来开发简单的Web应用程序:Rails。 Ruby on Rails生态系统为后端功能提供了最好的工具,并且由于该框架得到了广泛使用,因此有人已经找到了有关此框架的任何问题,并将其记录在案,而且很有可能已经找到了解决方案。
  • 在数据方面,我们的团队使用小型Express服务器来收集和组织数据处理。 处理本身在Snowplow中进行,该Snowplow在AWS集群中运行,那里有用于简化配置和部署的现成映像。 这使我们唯一的数据工程师Tim可以将大部分时间用于将数据传输到Snowplow并从那里获取结果,从而使其他团队成员易于理解并获得见解。

我们积极参与编写测试 ,使用Scientist和Datadog之类的工具来衡量性能,以实验形式安排变更并尽可能地利用我们的基础架构使工作自动化

我们正在开发基于GraphQL新内部API,以加速彼此不依赖的实验,新功能和新产品的迭代,因为我们意识到,基于REST的API在数据,设计,前端和后端团队之间没有高度协调的情况下就会崩溃-更好我们将这段时间花在功能上,而不是JSON更改上。

尽管进行这些更改很有趣,但是我们之所以不要进行更改,是因为我们想消除程序员的烦恼,而是因为它解决了我们无法解决的实际问题,使我们无法快速交付功能和进行开发。

我认为大多数读过这个地方的人都会想到以下三个结论之一:

  1. 取消飞溅非常简单,因此可以使用此方法。 我做的事情要复杂得多,因此我们不得不做不同的事情。
  2. 我是开发人员。 听起来很无聊-我想创建一个新的高负载图像识别系统!
  3. 好酷! 我不在乎,只要给我美丽的免费照片即可使用。


结论为1的人是正确的:有些公司做的事情比我们做的复杂得多。 但是它们并不多。 我们都创建了相同的系统,但专注于其他一些事情,这就是为什么所使用的解决方案可以以框架的形式抽象出来并在不同的项目中重用的原因(因此,关于招聘的大多数职位彼此非常相似)。

结论为2的人,这取决于您发现有趣的东西。 如果您想突破技术的界限,那么就去一家以实现这一目标为使命的公司工作。 它们并不多,但是大多数其他公司根本不这样做。

对于结论编号为3的人,我会说:“是的,没错!” 最后,这就是我们要做的所有事情。

Badoo接近作者谈论的原理。 主要区别在于我们的项目规模更大,而为我们使用外部服务通常非常昂贵。 此外,我们的许多解决方案都非常简单,我们试图通过将引入和运行新技术的成本与我们将从中获得的收益进行比较,来仔细地应对它们的变化。 我们的某些解决方案是在很早以前就创建的,因为它们是在很早以前就创建的,但是仅出于时尚的考虑而过渡到类似的新解决方案将不会花费在解决方案上的资源。 同时,如果我们知道新技术可以带来真正的好处(例如, PHP 7GoCassandraTarantoolExasol ),我们将准备引入新技术。

Source: https://habr.com/ru/post/zh-CN416981/


All Articles