[关闭]
@sambodhi 2021-10-27T13:44:18.000000Z 字数 3607 阅读 602

WhatsApp 如何在只有 50 名工程师的情况下扩展到 10 亿用户

作者 | Quastor Daily
译者 | Sambodhi
策划 | 赵钰莹

大家好。

今天我们要讨论的是:

另外,我们还有一个关于创建螺旋矩阵的最后一个编码面试问题的解决方案。

2016 年,WhatsApp 的用户数超过 10 亿,并且负载统计数据如下:

他们仅用了 50 名工程师就成功地满足了这种规模的需求。

以下是对使之成为可能的工程文化和技术栈的深入研究。

工程文化

WhatsApp 的工程文化包括三个主要原则

  1. 简单点
  2. 保持简单
  3. 全神贯注于任务

简单点

WhatsApp 有意将工程人员保持在小规模,只有大约 50 名工程师。个人工程团队也很小,由 1~3 名工程师组成,每个团队都有很大的自主权。

就服务器而言,WhatsApp 更倾向于使用数量较少的服务器,并且尽可能在最大程度上垂直地扩展每台服务器。

之前,他们的目标是每台服务器拥有 100 万个用户(但是当他们向应用程序添加更多的功能,以及用户在每个用户基础上产生更多的活动时,这变得更加困难)。

服务器数量减少意味着故障减少,从而使团队更易于处理。对于软件来说也是如此,它们限制了生产中系统和组件的总数。也就是说,需要开发、部署和支持的系统更少。不需要开发很多系统/组件,然后进入维护模式(最终成为孤儿,直到出错)。

保持简单

WhatsApp 的口号是“刚刚够的工程”。他们避免在系统和组件上过度投资。取而代之的是,他们专注于建立足够的可扩展性、安全性和可靠性。

在进行技术选择的时候,其中一个关键因素是“什么是最简单的方法?”另外,他们避免在自动化方面的投资,除非完全必要。

全神贯注于任务

WhatsApp 的产品设计非常专注。其主要目的是提供一个具有良好用户界面的核心通信应用程序。他们避免了额外的花里胡哨的功能,或者实现那些不完全关注核心通信的功能。

简单的产品更易于维护和扩展。

技术栈

该技术栈围绕着 3 个核心组件:Erlang、FreeBSD 和 SoftLayer。

Erlang

Erlang 是 WhatsApp 后端系统首选的编程语言。Erlang 从一开始就被设计用于并行性,容错性是该语言的一个主要特点。

你可以在这里读到更多有关 Erlang 的容错性。

开发者使用 Erlang 的效率也非常高。但是,它是一种函数式语言,所以如果你不熟悉这种范式,则需要花一些时间来适应。

这门语言非常简洁,只需少量几行代码就可以完成工作。

OTP(Open Telecom Platform,开放电信平台)是 Erlang 的开源中间件、库和工具的集合。

WhatsApp 尽量避免依赖关系,但它们确实使用了 Mnesia,一个 OTP 的分布式数据库。Erlang 也带来了热交换代码的能力。无需重新启动应用就可以将新的应用代码加载到运行中的应用。这样可以让迭代周期非常快,WhatsApp 可以快速地发布补丁,并且服务的运行时间非常长。

要想知道 WhatsApp 的后端究竟是如何用 Erlang 构建的,你可以看看 2018 年的这个讲座

FreeBSD

FreeBSD 是 WhatsApp 服务器使用的操作系统。

决定使用 FreeBSD 的是 WhatsApp 创始人,这是基于他们之前在雅虎的经验。创始人(以及许多早期团队)都曾经是雅虎的一员,而雅虎广泛使用 FreeBSD。

要想知道 WhatsApp 到底是如何使用 FreeBSD 的,你可以看这个讲座。请注意,这个讲座是 2014 年的,所以其中一些内容现在可能已经过时了。

SoftLayer

SoftLayer 是 WhatsApp 在 2016 年使用的托管平台。他们选择 SoftLayer 主要有两个原因:

  1. 拥有一流的操作系统 FreeBSD。
  2. 能够订购并操作裸机服务器。

但是, SoftLayer 属于 IBM(IBM 公有云的一部分),后来 WhatsApp 从 SoftLayer 迁移到了使用 Facebook 的基础设施。2017 年,他们开始迁移。

用于提高可伸缩性的工具和技术

你可以在这里查看关于 WhatsApp Engineering 制作的完整讲座

你可以从 WhatsApp Engineering 撰写的高可扩展性的帖子中获得更多具体细节。

怎样快速学习新的编程语言和框架

这是 Hacker News 上关于快速学习新事物的一个有趣讨论。

以下是总结的一些顶级答案。

做这些练习的时候,不要复制/粘贴任何代码。你应该自己敲出代码。

技术片段

购买电子书时,你可以设定自己的价格,因此你可以支付从 0 美元到 100 美元的任何费用。

假如你曾经在使用基于 JVM 的语言工作过一段时间,你可能会遇到这样的情形:你已经达到了可以拥有的并发线程数量的极限。

对于个人电脑来说,这个限制通常是 10000 个线程左右。而在另一方面,在使用 Go 的笔记本电脑上,你可以拥有超过一亿个 Goroutine。

这篇文章探讨了为什么你可以拥有比线程更多的 Goroutine。

主要原因有二:

  1. JVM 将线程委托给操作系统线程。Go 实现了自己的调度器,使许多 Goroutine 可以在同一个操作系统线程上运行。
  2. JVM 默认每个线程有 1MB 的栈。Go 的栈大小是动态的,一个新的 Goroutine 会有大约 4KB 的栈。


这篇文章描述了 HDFS 的架构,并深入介绍了雅虎使用 HDFS 管理 40PB 数据的经验。

面试问题

实现一个 BST Iterator 类,该类表示二进制搜索树的顺序内遍历的迭代器。

实现以下方法:

以前的解决方案

提醒一下,这是我们的最后一个问题。

给定一个正整数 i,然后生成一个 n x n 矩阵,其中元素按螺旋顺序从 1 到 i^2 填充。

例:

输入:i = 3

输出:[[1,2,3],[8,9,4],[7,6,5]]

image.png

这是 LeetCode 中的问题

答案

我们可以通过创建一个 i x i 的矩阵来解决这个问题,然后以螺旋方式循环遍历它,将每个元素设置为 1 到 i^2 的值。

为了以螺旋方式进行循环,我们首先要创建 4 个变量:left、right、top、bot。

这 4 个变量代表我们矩阵的 4 个不同侧面的指针(左列、右列、顶行、底行)。

左边将指向第 0 列,右边将指向最后一列,上面将指向第 0 行,下面将指向最后一行。

当我们按螺旋顺序遍历我们的矩阵时,我们将按以下方式进行操作:

  1. 遍历顶行。现在,递增顶行。
  2. 遍历右列。现在,减去右列的值。
  3. 遍历底行。现在,递减底行。
  4. 遍历左列,现在,递增左列。

当左指针小于或等于右指针,并且顶指针小于或等于底指针时,我们将迭代这些步骤。

当我们的循环结束时,我们可以返回完成的矩阵。

下面是 Python 3 的代码。

image.png

原文链接:

https://www.quastor.org/p/how-whatsapp-scaled-to-1-billion

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注