
Январь 2008 года — Калифорния, США.
Инженер Ян Кум нанимается на работу в Facebook* — получает отказ.
Это был не конец — он продолжил двигаться дальше.
В следующем году он покупает iPhone и сразу же понимает огромный потенциал нового App Store.
С несколькими бывшими коллегами из Yahoo он решает создать программу мгновенного обмена сообщениями. Программе дают имя WhatsApp. Предназначение WhatsApp — стать заменой дорогостоящим SMS.
Рост популярности WhatsApp поражает воображение — каждый день в него заходит один миллион людей.
WhatsApp мог справляться с 50 миллиардами сообщений в день от 450 миллионов активных пользователей, имея в штате всего 32 инженера.
Хотя взрывной рост продукта — это приятная проблема, для её решения Яну Куму и команде разработчиков WhatsApp пришлось применить самые передовые технологии проектирования.
Разработка WhatsApp
Методики обеспечения огромной масштабируемости WhatsApp можно вкратце описать так:
▍ 1. Принцип единственной ответственности
При развитии продукта упор всегда делался на его основную функцию — обмен сообщениями.
Разработчики не стремились к созданию рекламной сети или платформы соцсетей.

Они всеми способами избавлялись от разрастания функций (feature creep).
Разрастание функций — это процесс добавления в продукт излишних функций, усложняющих пользование им.
Благодаря минималистичным требованиям к продукту, команда разработчиков смогла поставить на первое место надёжность WhatsApp.
▍ 2. Технологический стек
Для реализации основных функций серверов WhatsApp был использован язык программирования Erlang; на то имелись следующие причины:
- он обеспечивает чрезвычайно высокую масштабируемость при малой затрате ресурсов
- он поддерживает горячую загрузку
Потоки — нативная функция Erlang, в отличие от Java или C++, где потоки принадлежат операционной системе. Нативные потоки в Erlang снижают затраты на переключение контекста, потому что отсутствует необходимость сохранения всего состояния CPU.
Горячая загрузка упрощает развёртывание изменений в коде без перезапуска сервера или перенаправления трафика. Проще говоря, горячая загрузка обеспечивает чрезвычайно высокий уровень доступности сервиса.
▍ 3. Зачем заново изобретать велосипед?
Не надо придумывать велосипеды — или используйте опенсорс, или купите коммерческое решение.

Ejabberd — это написанный на Erlang опенсорсный сервер для обмена сообщениями в реальном времени.
WhatsApp был создан на основе ejabberd. Команда разработчиков дополнила ejabberd, переписав часть его основных компонентов под свои нужды.
WhatsApp использовал сторонние сервисы, например, Google Push для реализации пуш-уведомлений.
▍ 4. Сквозная функциональность
Сквозная функциональность — это элементы, влияющие на многие части продукта и которые сложно разделить. Например, это мониторинг состояния сервисов и алерты.
Огромное внимание было уделено тому, чтобы сквозная функциональность повышала качество продукта.

Continuous integration (CI) — это практика, при которой инженеры регулярно объединяют свои изменения в коде в центральный репозиторий.
Continuous delivery (CD) — это практика автоматического развёртывания изменений в коде в тестовом окружении или в продакшене.
Команда WhatsApp использовала Continuous integration и Continuous delivery для совершенствования своего процесса разработки ПО.
▍ 5. Масштабируемость
Горизонтальное масштабирование — это процесс увеличения количества машин в пуле ресурсов.
Вертикальное масштабирование — это процесс увеличения мощностей машины, например, CPU или памяти.
Диагональное масштабирование — это гибрид горизонтального и вертикального масштабирования, при нём вычислительные ресурсы добавляются и вертикально, и горизонтально.
Для снижения затрат и степени сложности эксплуатации WhatsApp использовал диагональное масштабирование.

Для управления серверами WhatsApp разработчики использовали операционную систему FreeBSD, потому что уже имели опыт работы с ней в Yahoo. К тому же у FreeBSD имеется тщательно настроенный и надёжный сетевой стек.
FreeBSD была индивидуально настроена таким образом, чтобы выдерживать по два с лишним миллиона соединений на сервер. Были изменены такие параметры ядра, как файлы и сокеты.
Ресурсы на серверах резервировались избыточно, чтобы выдерживать резкие скачки трафика и справляться с такими сбоями, как нарушения связности сети или выход оборудования из строя.
▍ 6. Эффект маховика
Разработчики измеряли такие метрики, как CPU, переключения контекста и системные вызовы, выявляя и устраняя узкие места. Такие операции выполнялись через равные промежутки времени.

Цикл непрерывной обратной связи существенно повысил производительность WhatsApp.
▍ 7. Качество
Нагрузочное тестирование — это процесс измерения производительности системы под ожидаемой нагрузкой. Оно выполнялось для выявления единых точек отказа.

Нагрузочное тестирование выполняется или генерированием искусственного трафика продакшена, или настройкой DNS для перенаправления большего объёма трафика на определённый сервер.
▍ 8. Малый размер команды
С увеличением размера команды пути коммуникации между инженерами увеличиваются квадратически. И это приводит к снижению продуктивности.
Команду разработки WhatsApp специально ограничивали в размерах — в ней было всего 32 инженера

Итог
WhatsApp считается одним из самых успешных приложений для мгновенного обмена сообщениями.
В 2014 году WhatsApp был куплен за огромную сумму в 19 миллиардов долларов тем же Facebook*, который отказал в найме Яну Куму.
По данным Forbes, собственные активы Яна Кума составляют в 2023 году 14 миллиардов долларов.
Meta Platforms*, а также принадлежащие ей Facebook** и Instagram**:
* признана экстремистской организацией, её деятельность в России запрещена;
** запрещены в России.
Telegram-канал с розыгрышами призов, новостями IT и постами о ретроиграх ?️
