Мы открываем техно-блог компании Avito. Многие знают бренд, но не так много тех, кто знает, как сервис устроен с технической стороны. В своём блоге мы приоткроем завесу неизвестного и расскажем о технической кухне сервиса.
Начнем с небольшой истории о том, что проект представляет из себя сегодня, чем занимается команда инженеров и, что мы планируем делать в ближайшем будущем. Еще мы собрали в этом посте множество ссылок на уже опубликованные материалы, доклады и презентации нашей команды, которыми давно хотели поделиться. Хотите знать, где живут ваши объявления? Добро пожаловать под кат!
Начало
Очень сложно начинать короткий рассказ о компании с насыщенной историей так, чтобы ничего не забыть и не сильно вдаваться в детали. Детали оставим для будущих статей, в которых постараемся подробнее раскрыть те или иные вопросы. Если у вас есть особые или интересные темы, о которых вы бы хотели услышать от разработчиков Avito, пишите о них в комментариях — мы обязательно затронем эти вопросы.
Как и в случае многих больших проектов, история Avito начиналась с небольшой команды. Первая версия сайта была запущена в 2007-ом году, и первые шаги были полны проб и ошибок. В текущем виде сайт сформировался лишь два года спустя. Сервис начинал создаваться силами всего 4 разработчиков, которые занимались абсолютно всем, от инфраструктуры до клиентской части. Сайт 2009-го года вряд ли можно было бы отправить на конкурс «Лучший сайт чего-бы-то-ни-было». Но этот результат до сих пор вызывает чувство ностальгии у причастных к нему. Как и определенную гордость, ведь это было сделано малым количеством ресурсов, но достаточно для того, чтобы заявить о себе и заложить фундамент успешной компании.
Сложно представить, но до 2012-го года размер команды разработки практически не менялся. Однако проект становился все больше, и это стало необходимостью. Так с 2012-го команда начала активно расти, увеличиваясь в разы. Появилось деление на специализации, направления, проекты, команды, группы. Сейчас над Avito трудится департамент из более чем 250 специалистов.
Avito сегодня
Сегодня Avito стабильно входит в топ-5 площадок рунета, топ-3 мировых классифайдов по версии различных источников. Ежемесячно через web и мобильные приложения сервис обслуживает более 35 миллионов пользователей, которые ежедневно публикуют около миллиона новых объявлений (в “бэк-офисе” их накопилось уже более миллиарда), совершают более 100 тысяч сделок. По данным Яндекса, в некоторых городах России (например, в Москве), по числу просмотров страниц Avito опережает всех, включая социальные сети.
Avito является высоконагруженным проектом. Немного цифр, чтобы оценить масштаб: 300+ серверов, 10TB в postgres, 270TB картинок, 13Gbit/s трафика вечером в пике, около миллиона запросов к бекенду в минуту. Поэтому экспертиза в области обработки данных является одной из самых критичных для наших бизнес-процессов. При этом стоит понимать, что такие объемы данных нужно не только накапливать и хранить, но и обрабатывать, фильтровать, классифицировать и обеспечивать поиск по ним. Эффективно справляться со всеми задачами не может один-единственный инструмент, потому используется ряд решений, таких как: PostgreSQL, Tarantool, Vertica, MongoDB, Redis и прочие системы хранения. Мы обязательно поделимся рассказами про особенности архитектуры в будущих статьях. Пока же можно ознакомиться с докладами, в которых наши коллеги делятся своим опытом:
- Видео-запись доклада «PostgreSQL в архитектуре Avito», Михаил Тюрин (PostgreSQLRussia Meetup 2014)
- Слайды доклада «Avito.ru объявления и postgres», Михаил Тюрин (DevConf 2015)
- Видео-запись доклада «Сегментация пользователей на Tarantool», Юрий Самсонов (Tarantool Meetup 2015)
- Слайды доклада «Большая база объявлений», Михаил Тюрин (PgConf 2015)
Много данных — это хорошо для сервиса, но большая проблема для пользователя – как найти нужное? В этом помогает систематизация объявлений и поиск по ним. Поиск — наиболее сложная задача. И проблема здесь не столько в объемах данных, сколько в человеческом факторе. Дело в том, что пользователи постоянно ошибаются, как в описании объявлений, так и в поисковой строке. Одна из основных задач — нивелировать ошибки в описании и понять, что же имел в виду пользователь, указывая что-то в поисковой строке.
Для устранения ошибок в описаниях используются различные справочники и алгоритмы коррекции, а так же более продвинутые подходы вроде компьютерного зрения. Последнее, например, с очень высокой вероятностью (по некоторым категориям более 95%) определяет, правильно ли пользователь выбрал категорию. Кроме того, Avito регулярно привлекает специалистов по машинному обучению для участия в конкурсах (на платформах machinelearning.ru, boosters и kaggle), целью которых является поиск наиболее эффективных алгоритмов для решения различных прикладных задач.
Для полнотекстового поиска используется Sphinx, и мы регулярно делимся опытом его использования, активно участвуем в развитии технологии.
- Видео-запись доклада «Атличнаи дивчачьи каньки»: исправляем ошибки», Андрей Смирнов (SphinxSearch meetup #2, 2016)
- Видео-запись доклада «Бэк-офис в Avito: миллиард объявлений на 10 серверах», Вячеслав Крюков (SphinxSearch meetup #2, 2016)
- Слайды доклада «Архитектура поиска в Avito», Андрей Смирнов (BackendConf 2016)
- Видео-запись доклада «Sphinx tips & tricks», Роман Павлушко (SphinxSearch meetup, 2015)
- Видео-запись доклада «Допиливаем Sphinx на чистом С», Виталий Леонов (SphinxSearch meetup, 2015)
Как уже упоминалось, ежедневно пользователи добавляют около миллиона новых объявлений. Но мало кто знает, что более половины из них являются спамом. Традиционно для этого используется модерация. Занятный факт: первую версию системы модерации написали всего за одну неделю, да так удачно, что с тех пор ни разу не пришлось её как-то радикально переписывать. Но, несмотря на улучшения, очевидно, что с таким объемом информации сложно справиться вручную. Поэтому используются более продвинутые методы, например, нейронные сети, которые постоянно обучаются на основе действий модераторов. Тем не менее, противостояние между спамерами и системой модерации бесконечно, и этому мы посвятим отдельный пост.
Минутка рекламы… а точнее, поговорим о ее показе. Экономические и этические вопросы оставим для других блогов. Здесь же интересна техническая составляющая этого вопроса. Дело в том, что рекламодателям и площадкам интересна только целевая аудитория. Для ее определения используется сегментирование аудитории. Проблема в том, что пользователей и их запросов огромное количество, а чтобы определить категорию пользователя, необходимо учитывать множество критериев. При этом время на определение категории ограничено, а ее нужно вычислить и передать рекламным площадкам, провести между ними аукцион и определить рекламный блок к показу. Все это опять же связано с большим количеством данных и требованиями к времени (все должно происходить за доли секунды). Подробнее мы об этом уже рассказывали на конференциях и митапах.
- Видео-запись доклада «Успеть за 100 миллисекунд: контекстная реклама на Sphinx», Дмитрий Хасанов (BackendConf 2016)
- Видео-запись доклада «Контекстная реклама в Avito: что под капотом», Вадим Аюев и Андрей Остапец (Python Data Science meetup 2016)
- Видео-запись доклада «Построение рекомендательной системы на Python», Василий Лексин (Python Data Science meetup 2016)
Данные — не единственное сложное место. Бизнес и рынок диктуют все новые условия, которые превращаются во все более сложную бизнес-логику. Исторически сложилось, что бизнес-логика сервиса реализована на PHP. В прошлом году мы перешли на новую его версию — PHP7, и уже чувствуем как сервера выдохнули и стали напрягаться в три раза меньше. Сегодня PHP — не единственный серверный язык, который используется в Avito. Изначально проект был монолитным, но он уже давно развивается в сторону микросервисов. В зависимости от задачи и нагрузок используются различные языки, такие как Python и Go.
Какие бы сложные задачи не решались на стороне сервера, это все скрыто от обычного пользователя. А то, что видят пользователи, работая с сервисом, делается силами фронтенд команды. Изначально сайт создавался на традиционных для того времени технологиях, серверный рендеринг и jQuery. Но не так давно мы полностью отказались от jQuery в пользу браузерных API и небольших библиотек, решающих конкретные задачи, а годом ранее начали переход на ECMA2015. Помимо этого появляются все больше веб-приложений (SPA), которые реализуются на React и basis.js. Фронтенд-разработчики так же участвуют в open source проектах (таких, например, как CSSO), создают инструменты и делятся своим опытом на конференциях:
- Видео-запись доклада «Как сделать ваш JavaScript быстрее», Роман Дворнов (Highload++, 2016)
- Видео-запись доклада «Фронтенд в Avito», Александр Лобашев (WSD Москва, 2015)
- Видео-запись доклада «МРТ для данных», Анастасия Горячева (WSD Екатеринбург, 2016)
- Видео-запись доклада «Сжимаем CSS», Роман Дворнов (DUMP, 2016)
- Видео-запись доклада «О том, как не надо тестировать», Иван Стрелков (FrontTalks, 2016)
- Видео-запись доклада «Иструментируй это», Роман Дворнов (FrontTalks, 2015)
- Видео-запись доклада «Блеск и нищета Proxy-браузеров», Александр Зубов (Mobile Frontend Meetup, 2015)
Компания Avito появилась практически вместе с зарождением мобильной платформы, какой мы знаем ее сегодня. Конечно же, сначала была только веб-версия, потом появилась веб-версия, адаптированная для мобильных устройств. Но нативные приложения – это нативные приложения, и у них есть своя специфика, которая зависит от платформы. Сегодня мобильным приложениям уделяется очень большое внимание — и мы уверены, что этот тренд будет сохраняться. Отдельные команды разрабатывают сразу несколько приложений под iOS и Android. Ребята подходят к вопросу разработки ответственно, делятся своим опытом на конференциях и наработками на GitHub.
Обе команды, и iOS, и Android, используют самый современный стек технологий. Во-первых, это Swift и Kotlin, которые уже практически полностью заменили в наших продуктах тяжелое наследие Java и Objective-C. Во-вторых, это инвестирование в развитие и продвижение различных инженерных практик — CI, CD, Code Review, автоматизация тестирования. В-третьих, это чистая и масштабируемая архитектура, которая позволяет нескольким группам разработчиков развивать крупный проект без возникновения коллизий и оперативно реагировать на нужды пользователей.
- Видео-запись доклада «Introducing Application Coordinator», Андрей Панов (CocoaHeads, 2016)
- Видео-запись доклада «DeepLink’и в Avito», Артём Разинов (Встреча iOS-разработчиков в Avito #2, 2016)
- Видео-запись митапа «Android development with Kotlin» (2016)
- Слайды доклада «Advanced Swift Generics», Максим Соколов (Mobius 2016)
- Интервью с Максимом Соколовым «Пора ли переходить на Swift» (2016)
- Слайды доклада «Оптимизация скорости компиляции большого проекта на Swift+Objective-C», Иван Бондарь (Встреча iOS-разработчиков в Avito, 2016)
- Видео-запись доклада «Удобный и расширяемый роутинг в iOS-приложении», Тимур Юсипов (Встреча iOS-разработчиков в Avito #2, 2016)
Вначале дизайн Avito рисовали менеджеры и разработчики, но с появлением мобильных приложений стало понятно, что надо развивать это направление в компании. Сейчас у нас 15 дизайнеров интерфейсов: команда Avito и команда профессиональных инструментов Acti.
Дизайн и разработка интерфейсов для такого большого продукта — очень сложный и интересный процесс. Вся работа строится в плотном взаимодействии с разработкой, есть множество ограничений со стороны платформы, и их надо учитывать. Дизайнеры всегда стараются найти оптимальное решение с точки зрения удобства пользователя, бизнеса, разработки и сроков.
Ребята не только рисуют макеты, но и пишут собственные приложения, плагины, разрабатывают сложные интерактивные прототипы, участвуют в разработке дизайн-платформы. На некоторые каверзные вопросы дизайнеры ответили в статье на vc.ru.
Тестирование в Avito появилось не сразу, первые QA-специалисты присоединились к команде в 2012-ом году. Сегодня в ней более 40 человек, треть из которых — автоматизаторы. Набор инструментов достаточно стандартный: PHP + PHPUnit, Selenium, Selendroid. Для организации взаимодействия между тестировщиками и разработчиками используется самописный инструмент “Avito.Cthulhu”, который позволяет хранить тест-кейсы, распределять задачи, отслеживать задачи, вернувшиеся на тестирование.
Итак, мы вкратце пробежались по отдельным направлениям разработки сервиса, хотя многое ещё осталось за кадром. Обещаем в скором времени исправить этот недостаток!
Вместо заключения
Узнать больше про техническую кухню Avito можно из докладов наших разработчиков на ведущих конференциях и митапах. Кроме того, мы регулярно организуем встречи разработчиков в нашем офисе и хостим ивенты независимых сообществ, таких как MoscowJS, CocoaHeads, PostgreSQLRussia, Tarantool, Moscow SPA meetup и других. Анонсы всех событий и новости мы публикуем в нашем технологическом твиттер-канале AvitoTech, там же выкладываем ссылки на итоговые материалы. Записи со встреч, которые проходили в нашем офисе, можно найти на нашем Youtube-канале. Пишите в комментариях, с какой стороны вам было бы интересно узнать об Avito, и мы это обязательно учтём ваши пожелания при подготовке следующих постов. До новых встреч!
Автор: Avito