Январь 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 и постами о ретроиграх ?️