Благодаря 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 пока не трогаем по ряду причин:
- Мы всё ещё поддерживаем iOS 7. Да, Swift уже поддерживается на этой версии операционки, но работать со Swift’овыми зависимостями весьма затруднительно.
- Swift всё ещё нестабилен, и нам не хочется повторять героические подвиги по адаптации новых версий языка, хорошо описанные командой разработчиков Firefox.
- Использование Swift в данный момент существенно увеличивает размер приложения, а мы гордимся тем, что весим всего около 20 Мб.
- Мы активно используем динамические свойства языка Objective-C, а в Swift аналогов нет.
В качестве примеров применения динамизма Objective-C приведём следующие:
- Написание юнит-тестов на утечки памяти. Это возможно благодаря нашей библиотеке POSAllocationTracker. Возможность использования в юнит-тестах выгодно отличает её от фейсбучного аналога в лице FBAllocationTracker.
- Автоматическое обнаружение доступа к объекту из неправильного потока. Имплементировано в объекте 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 и так далее. Погнали!
Автор: Mail.Ru Group
Здраствуйте. Я выходил в облоко через однокласники,т.к я удалил профиль в однокласниках немогу выйти в облоко. Как это исправить? Чтоб иметь доступ к тем файлом?
Я не могу зайти в облако так как забыла и логин, и пароль, и номера телефона уже нет как вастановиться можно помогите (((