- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

Исторически Облако начиналось как B2C-продукт с веб-, десктопной и мобильными версиями. Однако B2B — это тоже очень перспективный рынок. Поэтому у нас появилась платформа Mail.Ru для бизнеса [3], объединяющая все 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. Также эта команда работает над Скриншотером [4] и разнообразными фичами под него.
  • Две команды мобильной разработки, которые пишут клиентские приложения для iOS и Android, напрямую взаимодействующие с серверной частью.
  • Команда админов, которая всё это поддерживает, не смыкая глаз днями и ночами.
  • Также у нас есть команда тестирования и команда автотестирования, которая пишет автотесты для API.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 и так далее. Погнали!

Автор: Mail.Ru Group

Источник [16]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/oblako/257308

Ссылки в тексте:

[1] использовали: https://habrahabr.ru/company/badoo/blog/317442/

[2] Облака Mail.Ru: https://cloud.mail.ru/

[3] Mail.Ru для бизнеса: https://biz.mail.ru/

[4] Скриншотером: https://screenshoter.mail.ru/

[5] показываем видео в Облаке: https://habrahabr.ru/company/mailru/blog/272769/

[6] Изначально Облако писалось: https://habrahabr.ru/company/mailru/blog/211340/

[7] хорошо описанные: https://mozilla-mobile.github.io/ios/firefox/swift/core/2017/02/22/migrating-to-swift-3.0.html

[8] POSAllocationTracker: https://github.com/pavelosipov/POSAllocationTracker

[9] FBAllocationTracker: https://github.com/facebook/FBAllocationTracker

[10] POSRx: https://github.com/pavelosipov/POSRx

[11] POSInputStreamLibrary: https://github.com/pavelosipov/POSInputStreamLibrary

[12] нашей давней статье: https://habrahabr.ru/company/mailru/blog/216247/

[13] disaster recovery тестов: http://searchdisasterrecovery.techtarget.com/definition/disaster-recovery-DR-test

[14] Schedulable Architecture: https://habrahabr.ru/company/mailru/blog/317440/

[15] плагину для HockeyApp: https://github.com/pavelosipov/POSHockeyAppExtension

[16] Источник: https://habrahabr.ru/post/330348/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best