Фастов + Идея + FreeBSD + Erlang = 19 миллиардов

27 февраль, 2014 - 17:25Андрей Зубинский

На фоне непрекращающихся и нарастающих успехов нашей экономики $19 миллиардов, щедро «отсыпанные» за Whatsapp, кажутся форменным издевательством и полным крахом «обнадёживающих» картин «национального спасения за счёт доходов от крупной приватизации», с которыми у нас принято носитися дурнями з писаною торбою (я не ошибся, не «як дурнi», а именно как написано).

Особенно же издевательски цифра выглядит в сочетании с организационной и исторической спецификой Whatsapp – в компании чуть больше полусотни человек персонала (львиная доля – сервис-инженеры), а основатель компании Ян Кум – наш соотечественник и многим из нас практически земляк, родившийся в Киеве и выросший в Фастове, в трудном подростковом шестнадцатилетнем возрасте в не менее трудное время популярности «кравчучек» (1992 год) перевезенный родителями в США. «Американская мечта» как она есть. Впрочем, не будем о грустном, и без него невесело.

Бизнес-версий о сделке я строить не буду, это сделали без меня, да и совершенно бессмысленны сейчас любые попытки догадок как Facebook утилизирует приобретение, как и с какими целями интегрирует обе масштабные системы. По-моему, это вообще гадание на кофейной гуще, потому что и в самой Facebook могут пока точно не знать, что же «такого» сделать с Whatsapp, чтобы в итоге получилось «нечто». Достаточно того, что все желавшие приобрести Whatsapp очевидно понимали – это «нечто» непременно может получиться в итоге. И не стоит удивляться если на пути к этому «нечто» будут многочисленные пробы и ошибки, и даже не надо удивляться, если «нечто» вообще не получится. Такие игры потому что, и они без всяких гарантий.

Не буду увлекаться и реверансами Яну Куму за гениальность ключевой идеи Whatsapp. Просто скажу – она безукоризненно гениальна. Что в с своей простоте – ну как никто до него не видел возможности заменить унылый ввод имени пользователя и пароля (ещё и с предупреждениями о надёжности последнего) тем, что всегда есть в любом телефоне (даже не обязательно смартфоне) – номером телефона и IMEI, что в естественной интеграции разных до неё миров (сугубо «телефонного» и сугубо «messengers») – ведь номера телефонов в записной книжке пользователя – это готовая нужная ему контактная база. Великолепная и гениальная идея. И эту гениальность оценили пользователи. Точка.

И не буду пытаться строить ненужные конспиративные теории относительно модели безопасности приватности пользовательских данных в Whatsapp и возможных «расширенных» использований её для всяких потенциальных big data «вкусностей». Просто констатирую её – в Whatsapp история сообщений и сами сообщения не хранятся нигде кроме телефонов пользователей, о которых сервису ничего не известно (пол, возраст, реальные имена, адреса etc), каналы телефон-сервис дополнительно защищённые (SSL, инкапсулированный в собственную «защиту» GSM или всяких там *G). Поговаривают, что необходимость в такой модели Ян Кум впитал на исторической родине, возможно, это городская легенда, но в таком варианте я лично не сильно сомневаюсь.

(В дальнейшем тексте не буду приводить ссылок, их нужно так много, что в них вообще нет нужды, а на легко находящееся с помощью любой поисковой машины и вовсе нет смысла ссылаться явно)

Я хочу о другом поговорить. Об инфраструктуре Whatsapp, о «железе», программных системах и ухищрениях инженеров, которые в сумме реализуют сервис. Потому как это и есть материальная составляющая Whatsapp, её «заводы, мосты и пароходы».

Насколько можно восстановить по разрозненным данным, аппаратная основа Whatsapp – порядка 350-400 (или даже 600-700, в зависимости от того, что понимается под «core» в упомянутых самим Кумом «8000 cores») нод единой для Whatsapp конфигурации – двухпроцессорные машины c CPU от Intel (семейства Wetrmere, шестиядерные), 100 GB оперативной памяти, SSD-накопитель, две сетевые карты – одна «смотрит портом» в публичную сеть, вторая – в приватную, в бэкенд сервиса.

Ну, вполне логичная хорошая «машина как машина» для своих задач, ничего удивительного для 2013-2014 годов. И ещё послужит прилично. Разве что забавно одно – механические накопители (HDD) в описании конфигурации вообще не упоминаются. В сочетании с приличным объёмом оперативной памяти каждой ноды и с realtime-характером сервиса в целом, факт неупоминания HDD позволяет утверждать, что реализации всех программных систем Whatsapp основаны на «in memory» модели. А вот это уже интересно. Стало быть, в 2013-2014 году действительно большая «in memory» система может работать весьма надёжно, Whatsapp никогда не отличался особыми «взбрыками» в работе и на фоне прочих больших сервисов всегда выглядел достойно. И это уже нечто полезное, например, для системных архитекторов – при правильном проектировании можно не бояться 24/7/365 in-memory архитектур, они работают.

Теперь взглянем на системное ПО, обеспечивающее работу Whatsapp. Вот здесь начинается интересное.

Во-первых, выбор ОС. Он как бы не нов для тех, кто всерьёз интересуется построением высокодоступных и надёжных систем, но может несколько удивить всех прочих – несмотря на все достоинства всех ОС семейства Linux, несмотря на постоянные заявления всяких альтернативно одарённых о «перманентном умирании» *BSD систем – Whatsapp реализован на основе ОС FreeBSD (даже известна версия – 8.3). И не просто «реализован». Сама история Whatsapp – целая отдельная замечательная история раскрытия реальных возможностей этой ОС.

Во-вторых, - выбор единой технологической основы (или платформы) для реализации сервиса. Он тоже известен – платформа Erlang.
Пока остановимся, и взглянем на цепочку эволюции реальных возможностей этой явно удачной технологической пары (я собрал их твиттера и блогов Whatsapp):

Загрузка сервиса на начальном этапе довольно непростого завоевания популярности:
200 одновременных TCP сессий на одну ноду

23 сентября 2011 года, одна нода сервиса:
1016313 (больше миллиона одновременных TCP сессий)

6 января 2012 года, одна нода сервиса:
2277845 (больше двух миллионов одновременных сессий)

31 декабря 2012 года, суммарная оценка предновогодней нагрузки:
18 миллиардов обработанных сообщений за день

Достойные показатели, и сказать нечего, и оспаривать нет смысла. И они реально нужны для решения двух задач – минимизации расходов на масштабирование системы (эту задачу в Whatsapp очевидно решали – сверхэффективная монетизация не была главной целью сервиса, и всесторонним изучением поведения с тонкими настройками ОС и программных подсистем нужно было «вытягивать максимально возможное») и обеспечения бесперебойного и качественного обслуживания 450+ миллионов пользователей сервиса при росте пользовательской базы со скоростью миллион человек в день.

Теперь вернёмся к подробностям.

Стек Whatsapp – FreeBSD 8.3 + Erlang OTP R14B03 + Yaws (реализованный на Erlang HTTP-сервер для динамического контента) + Lighttpd (HTTP-сервер для статического контента). По аналогии с общеупотребительной аббревиатурой LAMP (Linux + Apache + MySQL + PHP/Perl/Python), получаем FEYL, который хоть и похож по звучанию на «fail», но вот всем бы хорошим людям – да такие «фейлы».

Совершенно «нестандартный» стек. Причём о нечто подобное в своё время «сломали зубы» в… Facebook. Именно с поддержкой Erlang-реализации протокола своего чата в Facebook в своё время не справились из-за невозможности отыскать достаточное количество квалифицированных разработчиков. В Whatsapp начали с открытой Erlang-реализации протокола XMPP и сервера Ejabberd, но довольно быстро были вынуждены полностью переделать что сервер, что и вовсе сам протокол – он довольно давно у них собственный. После чего ещё и серьёзно модифицировали виртуальную машину Erlang для достижения требуемых показателей. Вот деталька с отказом от XMPP и переходом на собственный протокол – она ещё одна заметочка в копилку знаний смелых и умных системных архитекторов – оказывается, протоколы и прочие «условно стандартные» нюансы всего лишь инструменты, и если задачи требуют радикального изменения инструментов, совершенно незачем цепляться за «стандартность» до последнего (об очевидной ответственности за уровень и качество проектных решений молчу). Иначе за $19 миллиардов точно не купит никто.

Следует заметить, что от традиционного LAMP в технологическом стеке Whatsapp кое-что осталось. Как это ни странно для специфического и «неправильного» FEYL, последняя буква P в LAMP. И за ней стоит… многострадальный PHP, неиссякаемый источник язвительных шуток «шибко вумных программистов». В общем, доподлинно известно, что где-то там в Whatsapp PHP используется, где его рационально использовать, но точно уж не в realtime-части сервиса. Это не основная часть стека, посему места для него в аббревиатуре FEYL я и не предусмотрел. Но всё правильно – если инструмент позволяет решить задачу, то незачем его не использовать по каким-то другим причинам.

Теперь несколько слов о методике «тюнинга» FreeBSD, принятой в Whatsapp. Она строится на циклическом принципе – «пробуй-измеряй-меняй настройки». И качество измерений в ней – один из ключевых моментов. Реализованная в FreeBSD подсистема мониторинга ядра ОС, изначально разработанная в Sun, dtrace, для задач мониторинга и изучения поведения используется только в цикле разработки и отладки кода. На «боевых» нодах сервиса она не используется. Для мониторинга «боевых» нод применяется собственная подсистема (wsar), причём с одним очень забавным нюансом характера использования – на начальных этапах развития сервиса период между «измерениями характеристик» нод был равен одной минуте, но по мере роста нагрузки и уровня утилизации имеющихся вычислительных мощностей его уменьшали и довели до одной секунды – большее временное разрешение просто неинформативно для оценки состояния системы такого масштаба. На основе оценок поведения системы методом проб и ошибок подбирались и настройки, причём по словам самих инженеров Whatsapp, «экстремальная оптимизация настроек – это тёмная магия, доступная только гномам и инженерам». 

Вот такая примерно картинка получается.

Откланиваюсь