423.88
Rating
Mail.ru Group
Building the Internet

Задай вопрос разработчикам облачных сервисов Mail.Ru Group

Mail.ru Group corporate blogHigh performanceWebsite developmentSystem Analysis and DesignDevelopment of mobile applications


Благодаря Reddit становится популярен формат Ask Me Anything (AMA) — когда команда специалистов, ответственных за какой-то большой, популярный проект, предлагает всем желающим задавать им любые вопросы об их работе и о том, что у сервиса «под капотом», как всё устроено. Первыми формат AMA на Хабре использовали разработчики Badoo. Мы тоже решили попробовать. Надеемся, что другие компании последуют нашему примеру и начнут впускать читателей на свои внутренние кухни.


Стартовать AMA мы решили с командой Облака Mail.Ru. Это молодой, активно развивающийся проект, о котором нам всегда задают много вопросов. К тому же с момента запуска (с августа 2013 года) Облако разрослось в большую семью проектов.


Исторически Облако начиналось как B2C-продукт с веб-, десктопной и мобильными версиями. Однако B2B — это тоже очень перспективный рынок. Поэтому у нас появилась платформа Mail.Ru для бизнеса, объединяющая все B2B-сервисы компании Mail.Ru Group, в том числе Облако для архивов (Icebox), Облако для рабочих групп (Teambox) и Горячее хранилище (Hotbox).


Кто и как именно обеспечивает жизнедеятельность и процветание этого весёлого семейства, как достигается сохранность данных, за счёт чего мы добиваемся высокой скорости загрузки файлов и низкой latency — обо всём этом вы узнаете из статьи, а после сможете задать любые интересующие вас вопросы.


Для начала немного истории


Когда мы начинали писать Облако, то взяли за основу единую кодовую базу, которая использовалась и в Почте, и в Моём Мире, и в контентных проектах. Эту кодовую базу мы называем Mpop. Она представляет собой кучу библиотек, написанных на Perl. И несколько лет назад на ней жили все портальные проекты Mail.Ru Group. Когда в каком-то из проектов что-то рефакторили в Mpop, это влияло и на остальные. Постепенно каждый проект переехал на свою версию Mpop, а затем мы начали от неё уходить. Почта, например, частично перешла на Go. Мы тоже изначально жили на Mpop, но потихонечку всё переписали на свой супербыстрый Perl-сервер. У нас полностью асинхронная архитектура, мы используем AnyEvent. И если вы знаете Perl, то приходите к нам, у нас очень весело и интересно!


Как всё устроено


Структурно Облако Mail.Ru состоит из нескольких команд:


  • Команда, которая пишет серверную часть и выстраивает её взаимодействие с хранилищами и мобильными клиентами.
  • Команда разработки API, прослойки между серверами и вебом. API пользуются и Icebox, и Teambox.
  • Команда разработки Hotbox. Она разрабатывает как административный интерфейс для работы с бакетами и ключами в Hotbox, так и само S3 API.
  • Команда разработки UI (пользовательского интерфейса) и вёрстки. Отвечает за красоту интерфейса, его стабильность, скорость и функциональность.
  • Команда разработки десктопного клиента, которая делает облачный клиент под платформы Windows, Linux, macOS. Также эта команда работает над Скриншотером и разнообразными фичами под него.
  • Две команды мобильной разработки, которые пишут клиентские приложения для iOS и Android, напрямую взаимодействующие с серверной частью.
  • Команда админов, которая всё это поддерживает, не смыкая глаз днями и ночами.
  • Также у нас есть команда тестирования и команда автотестирования, которая пишет автотесты для API.

Под капотом веб- и десктопной версий Облака


Бэкенд Облака Mail.Ru написан на ANSI C, Perl, Lua и немного С++. На Perl решаются задачи, связанные с API. Например, редактирование документов. К слову, мы когда-то рассказывали на Хабре о том, как показываем видео в Облаке, серверная часть там написана на Perl + Lua.


С самого начала, когда ставилась задача создать Облако, одним из главных требований было отсутствие долгих поисков по БД, никаких seek по диску и хранения по принципу append only. На момент старта мы не нашли подходящей БД под древовидные данные, поэтому создали собственную для представления файловой системы.


Приведём немного чисел:


  • В день наши юзеры загружают порядка 100 терабайт данных.
  • У нас есть более тысячи серверов дисковых хранилищ — это более 100 петабайт данных, в них находится более 9 миллиардов файлов. Нужно оптимально обходить и верифицировать их и быть уверенными в том, что пользовательский контент хранится надёжно и без изменений.
  • Число активных пользователей ежемесячно — более 18 миллионов. Каждый день на веб заходит много сотен тысяч уников.
  • Мы меняем в среднем десять дисков в неделю, на них заново накатываем данные.
  • Пропускная способность сети — до 200 Гбит/c (при необходимости мы можем увеличить её в несколько раз). На закачку к нам сейчас идёт около 25 Гбит/с.

Изначально Облако писалось с фокусом на десктопные и мобильные клиенты. Затем стало ясно, что веб-то жжот, нужно переделывать. Облако полностью переписали асинхронно (вообще у нас вся кодовая база асинхронная, от ANSI C до AnyEvent в Perl), стало намного лучше и быстрее. Например, сейчас веб-версия Облака живёт на том же десятке серверов, что и три года назад, при том, что число пользователей существенно выросло. Только тогда они лежали в полке по ресурсам без какого-либо запаса. Другие наши новые продукты, например Hotbox, мы тоже пишем на Perl. Такие дела.


Под капотом мобильного Облака


Для написания iOS-приложения Облака мы продолжаем использовать Objective-C. Swift пока не трогаем по ряду причин:


  1. Мы всё ещё поддерживаем iOS 7. Да, Swift уже поддерживается на этой версии операционки, но работать со Swift’овыми зависимостями весьма затруднительно.
  2. Swift всё ещё нестабилен, и нам не хочется повторять героические подвиги по адаптации новых версий языка, хорошо описанные командой разработчиков Firefox.
  3. Использование Swift в данный момент существенно увеличивает размер приложения, а мы гордимся тем, что весим всего около 20 Мб.
  4. Мы активно используем динамические свойства языка Objective-C, а в Swift аналогов нет.

В качестве примеров применения динамизма Objective-C приведём следующие:


  1. Написание юнит-тестов на утечки памяти. Это возможно благодаря нашей библиотеке POSAllocationTracker. Возможность использования в юнит-тестах выгодно отличает её от фейсбучного аналога в лице FBAllocationTracker.
  2. Автоматическое обнаружение доступа к объекту из неправильного потока. Имплементировано в объекте POSSchedulableObject из библиотеки POSRx. Кстати, в ней вы можете посмотреть на боевые примеры юнит-тестов на утечки памяти.

Другие архитектурные особенности iOS-приложения:


  • Использование POSInputStreamLibrary для загрузки видеофайлов в Облако. На графике ниже отображаются два вида загрузок видеофайлов. Оранжевые столбы — загрузки, содержимое которых получено с помощью API Photos.framework. Синие столбы — содержимое получено с помощью ALAssetsLibrary и завёрнуто в POSInputStreamLibrary. Это делает загрузку тяжёлых видеофайлов экстремально быстрой, как было описано в нашей давней статье.


  • Использование disaster recovery тестов. В нашу сетевую библиотеку встроен механизм генерации случайных сетевых ошибок. Таким образом, в отладочной сборке приложению обязательно прилетят от сервиса пятисотки и четырёхсотки. Благодаря этому практически невозможно не протестировать каждую новую фичу на данные краевые случаи. Имплементация доступна в наглядном виде в объекте POSHTTPGateway из библиотеки POSRx.

Главная архитектурная задача для iOS приложения на сегодняшний день — избавление от подвисаний приложения при работе с большими облаками. В качестве инструмента для решения данной проблемы мы видим паттерн Schedulable Architecture, о котором мы не так давно писали на Хабре. Чтобы по мере его внедрения немедленно видеть результаты и быть уверенными, что движемся в правильном направлении, мы сделали мониторинг подвисаний. Сейчас у нас уже есть график самых проблемных мест в виде списка классов, в которых чаще всего происходят зависания. Выглядит он так:



Благодаря плагину для HockeyApp у нас есть полная информация о каждом зависании — стек вызовов и логи.


Android-клиент Облака полностью разработан на Java (мы пока не нашли для себя выгоды в Kotlin’e). В принципе, в архитектуре нет ничего супермодного: MVP, весь сетевой слой в сервисе, для сети используем okhttp, данные храним в SQLite, за исключением галереи. Там может быть очень много данных, и их надо быстро поднимать из кеша. Поэтому для галереи мы применяем самописную сериализацию. Для коммуникации внутри приложения есть eventbus от green robot. Для эффективной работы в фоне на новых версиях андроида используем JobScheduler’ы, а для не очень новых — GcmNetworkManager.


Для выкатки фич на процент, A/B тестирования и части аналитики используем Firebase. Для отладки взаимодействия с сервером юзаем в дебажных сборках Stetho от Facebook. В последней версии почти перешли на векторную графику в приложении. Думаю, через пару версий полностью перейдём на неё. Тесты пишем на junit, uiautomator и espresso.


Под капотом B2B-Облака


B2B-Облако — это три разных продукта:


  • Teambox — облако для рабочих групп, аналог B2C-Облака, в котором можно выделить личное пространство для каждого аккаунта в домене, создавать общие папки для отделов и групп сотрудников и настраивать доступ к файлам.
  • Hotbox — хранилище с быстрым доступом для распространения медиа- и любого другого часто скачиваемого контента с S3-совместимым протоколом доступа, распределённым хранением с множественным копированием и гарантированным SLA 99,99 %.
  • Icebox — объектное облачное хранилище для архивации и длительного хранения данных и простым веб-интерфейсом. Оно создано для хранения и доступа к редко используемым данным с поддержкой протокола S3, к которым при необходимости можно получить быстрый доступ.

B2B-Облако состоит из двух частей — фронтенда, который мы встроили в нашу Платформу для бизнеса, и бэкенда, который обеспечивает управление Облаком и его работу. Та часть бэкенда, которая отвечает за функционирование Облака, написана на Perl, поддержка управления — на Python.


Платформа для бизнеса biz.mail.ru обеспечивает доступ к управлению всех B2B-Облаков. Сама платформа — это общая административная панель для B2B-сервисов Mail.Ru: Почты для сайта, корпоративного Календаря, Агента, службы DNS и B2B-Облаков. Платформа предоставляет личный кабинет администраторов и реализована по принципу плагинов — есть общие элементы (авторизация, управление проектами и доменами, списком пользователей), есть отдельные разделы для подключаемых сервисов — Почты, Teambox, Hotbox, Icebox и других. У Платформы есть своё API и механизм проксирования запросов из бэкенда Платформы в бэкенды подключенных сервисов. Таким образом, у нас имеется общая инфраструктура, функционал которой разрабатывают разные команды программистов, а для пользователей всё управление собрано в одной административной панели.


Итак, спрашивайте!


По традиции надо обозначить время, когда мы будем отвечать на вопросы. И пусть это будут два дня, а не один: сегодня и завтра с 12.00 до 19.00 (по московскому времени). Но в случае особо ожесточённых дискуссий мы, конечно, не ограничимся этим интервалом. Задавайте вопросы про наш софт, про наши серверы, про наши команды, про наше API и так далее. Погнали!

Tags:mail.ruоблакоama
Hubs: Mail.ru Group corporate blog High performance Website development System Analysis and Design Development of mobile applications
+54
9.1k 25
Comments 91

Popular right now

Information

Founded
Location
Россия
Website
team.mail.ru
Employees
5,001–10,000 employees
Registered

Habr blog