Привет!
Мы продолжаем рассказывать о компаниях-разработчиках, использующих технологии Microsoft в своих проектах. В сегодняшнем выпуске — компания 2ГИС, основной офис которой находится в холодном Новосибирске и к которой автор статьи питает самые теплые чувства.
2ГИС недавно закончили большой проект, используя ядром функциональности .NET Core, Kubernetes и много Linux. Я часто получаю вопросы о том, можно ли использовать .NET Core в продакшене, каков наш опыт использования его в полностью Open Source среде. Я попросил ребят рассказать, что да как. Читайте подробнее под катом, это стоит того — это один из первых публичных и больших проектов, которые построены на .NET Core, да еще и в полном Open Source вокруг.
![](https://habrastorage.org/r/w780q1/webt/ex/02/rn/ex02rnwje0_ukjf3xsb86p28odu.jpeg)
Речь идёт от лица архитектора проекта, Дениса Иванова (на хабре DenisIvanov), Microsoft MVP по .NET, человека-бэкенда известной конференции CodeFest. Инна Савчкова (на хабре InnaSavchkova), Tech PR Manager 2ГИС, обеспечила нашему разговору красивый и понятный язык и, конечно же, тире вместо дефисов. Вопросы задавал ahriman.
Привет! Что такое 2ГИС?
2ГИС — компания, предоставляющая полную и точную информацию о 330+ городах в 9 странах. Это всё, что может понадобиться в городе: улицы, дома, компании, работающие в разных сферах, их контакты и полезные сведения о них (такие как, время работы и средний чек в ресторане или отзывы пользователей о работе туристических фирм), входы в здания, способы проезда и многое другое. Сейчас 2ГИС «знает» всё обо всех 2,3 миллионах фирм в России с точностью 95%.
В компании есть отдельная продуктовая команда, на постоянной основе анализирующая то, что нам говорят пользователи, проверяющая применимость новых идей, часть которых впоследствии становятся основой для новых фич продуктов 2ГИС.
![](https://habrastorage.org/r/w780q1/webt/0z/em/mz/0zemmzuybbekh1mteuaniaz0qlq.jpeg)
2ГИС использует широкий спектр технологий для построения своих систем и продуктов. Тем не менее, в основном это Open Source. Всё просто — оно работает на всех платформах (а еще у 2ГИС есть пачка проектов на Гитхабе — https://github.com/2gis. прим. автора)
В RnD-департаменте компании работает более 20 команд, создающих средства для сбора и систематизации информации, картографические системы и сервисы, инструменты для продажи и размещения рекламы, онлайн-, оффлайн- и приложения для мобильных устройств.
Недавно Microsoft выпустила официальный пресс-релиз о вашем проекте. Вот вы решили делать новый проект небольшой командой на .NET Core, Kubernetes & Linux. Кто решил использовать такую связку? Почему? Зачем? Какие выгоды вы видели? Какие потенциальные проблемы?
Прибыль 2ГИС получает от продажи рекламных возможностей компаниям, которых хотят быть более заметными для пользователей продуктов 2ГИС.
Одной из идей, которую требовалось проверить, была гипотеза об интересе рекламодателей к размещению видеороликов. До этого в 2ГИС можно было размещать только текстовую или графическую рекламу.
Основной целью было как можно в более короткие сроки вывести на рынок инструменты для продажи и размещения видеорекламы. Было принято решение поручить эту задачу разработчикам из команды, хорошо знающей предметную область и имеющей большой опыт в разработке внутренних инструментов продажи рекламы. Внутренние системы реализованы на .NET Framework и используют Windows-платформу для развертывания. Однако, требования к высокой доступности, отказоустойчивости и производительности сервисов видеорекламы подталкивало использовать ту же инфраструктуру и операционные системы, что и онлайн-продукты 2ГИС. К счастью, на момент старта разработки кроссплатформенный .NET Core был уже полгода как выпущен для широкого использования, и после проведения тестов и создания прототипа было принято решение использовать связку .NET Core, Kubernetes & Linux для реализации сервисов видеорекламы.
Это дало возможность силами двух программистов и аналитика выполнить задачу всего за 2 месяца. Это время включает все работы: начиная с детальной проработки требований и заканчивая релизом в боевую инфраструктуру. Кроме того, стало возможным использовать любые удобные средства разработки и операционные системы, включая Windows и macOS.
![](https://habrastorage.org/r/w780q1/webt/fv/k9/wh/fvk9whgcler56auqiuzvwgqcsra.jpeg)
Команда проекта — слева-направо инженеры и проджект-менеджер
Где находится «сердце» проекта? Как добиваетесь, что в такой структуре глобальные клиенты получают одинаковый уровень сервиса?
Кластер Kubernetes используется в 2ГИС как платформа, на которой запущены многие сервисы компании. На самом деле, таких кластеров три — два в России и один в Европе. Это грамотно управляемая инфраструктура со всеми необходимыми свойствами: балансировка, многоуровневая отказоустойчивость, детальный мониторинг и возможность получения и анализа любых логов и кастомной телеметрии с приложений. Поэтому выбор, где развертывать бекэнд-сервисы видеорекламы, по сути, не стоял.
![](https://habrastorage.org/r/w780q1/webt/el/qr/mv/elqrmvzhf55ap81_1g6dbsfxig4.jpeg)
Архитектура проекта
С точки зрения хранения, транскодинга и отдачи видеофайлов все немного иначе. Для решения этих задач мы используем сервисы, предоставляемые облачным партнером, специализирующимся только на работе с видеоконтеном. В терминах классических 3-слойных архитектур, сервис видеорекламы, созданный нами в 2ГИС — бизнес-логика, API хранения, транскодинга и отдачи видеофайлов (CDN) — это хранилище данных, а все продукты 2ГИС — это фронтенд.
В такой схеме все наши бекенды географически распределены, поэтому все клиенты получают примерно одинаковый уровень сервиса.
Возвращаясь к общим деталям проекта — расскажи о текущих показателях (пользователи, нагрузка). Проект уже в продакшене или еще тестируется?
Сервис в продакшене с апреля 2017, и сейчас у нас порядка 20000 запросов видеорекламы в сутки. Больше, чем на 80% из них мы отвечаем из кэша. Это дает нам возможность держать довольно высокие нагрузки, хотя на текущем этапе в пике мы имеем не больше 100 RPS.
Какие архитектурные решения использовали в проекте?
Если это глобальный проект, то архитектура должна быть подходящей под высокие нагрузки из различных мест. Как ты думаешь, какие архитектурные паттерны/подходы мастхэв для подобного проекта? Какие инструменты используете для мониторинга происходящего, испытывали ли трудности? DDOS?
Что касается использованных архитектурных решений и подходов, сервис видеорекламы мало чем отличается от других распределенных приложений, рассчитанных на бесперебойную работу с большой аудиторией пользователей. Есть целый набор лучших практик построения распределенных приложений, например, стоит обратить внимание на курс Джеффри Рихтера.
Самое первое, что нужно учесть — это правильное использование серверных ресурсов. Используемые потоки не должны блокироваться надолго, это достигается написанием асинхронного кода. Если одни и те же данные часто запрашиваются, нужно использовать кэш. Если таких данных немного, то хватит даже кэша в памяти. Всегда нужно держать в голове, что в распределенных системах возможны кратковременные отказы («мигания» сети, перезагрузка инфраструктурных сервисов и прочее). Тут помогают довольно простые в использовании паттерны, такие как Timeout, Retry, Fallback и их комбинации. Есть отличная библиотека Polly, которая предоставляет набор подобных готовых инструментов.
Трудности, конечно, бывают. Они случаются, когда какие-либо из инфраструктурных или партнерских сервисов уходят на профилактику или, когда случаются перебои в работе сети провайдеров. Несмотря на «молодость» .NET Core и относительно небольшое число использования этой платформы для построения подобных решений, у нас сугубо положительный опыт — мы не сталкивались с какими-либо «спецэффектами» или странным поведением приложения по причине JIT-компилятора, сборщика мусора или других компонентов CLR. Очень надеемся, что этот тренд сохранится.
Пара слов про DDoS или подобные атаки. Т.к. мы используем общую инфраструктуру компании, то все эти вопросы нам решать не пришлось. Здесь мы полностью полагаемся на высокую квалификацию наших инфраструктурных инженеров и применяемые ими решения по отслеживанию и защите.
Какие планы роста?
Сейчас видеореклама становится одним из базовых инструментов для привлечения внимания пользователей к рекламодателям, наряду с текстовой и графической рекламой. Уже есть несколько рекламных позиций, где используется видеореклама.
Мы подумываем о том, чтобы использовать собственную инфраструктуру для хранения исходных видеороликов с целью снижения в первую очередь юридических рисков. Также мы продолжаем совершенствовать внутренние процессы и системы управления и продажи рекламы в целом, и видеорекламы в частности. Все это обеспечивает повышение эффективности внутри 2ГИС.
Рост сопряжён с опасностью припадания сервиса при большой нагрузке. Что тут?
В 2ГИС построена вся необходимая инфраструктура для нагрузочного тестирования сервисов на основе Gatling-а. Все, что нужно, чтобы ее использовать — это развернуть приложение на специальных «железных» серверах, работающих под управлением Kubernetes, и написать сценарии нагрузочных тестов на Scala. Все необходимые метрики, сравнения результатов между запусками, отчеты и графики предоставляет платформа для нагрузочного тестирования.
Спасибо!
Подробнее про технологии, используемые в 2ГИС можно прочитать в корпоративном блоге компании. Технические доклады, в которых есть много реального опыта всего, что перечислено выше, лежат тут.
Мы продолжаем рассказывать о компаниях-разработчиках, использующих технологии Microsoft в своих проектах. В сегодняшнем выпуске — компания 2ГИС, основной офис которой находится в холодном Новосибирске и к которой автор статьи питает самые теплые чувства.
2ГИС недавно закончили большой проект, используя ядром функциональности .NET Core, Kubernetes и много Linux. Я часто получаю вопросы о том, можно ли использовать .NET Core в продакшене, каков наш опыт использования его в полностью Open Source среде. Я попросил ребят рассказать, что да как. Читайте подробнее под катом, это стоит того — это один из первых публичных и больших проектов, которые построены на .NET Core, да еще и в полном Open Source вокруг.
![](https://habrastorage.org/webt/ex/02/rn/ex02rnwje0_ukjf3xsb86p28odu.jpeg)
Речь идёт от лица архитектора проекта, Дениса Иванова (на хабре DenisIvanov), Microsoft MVP по .NET, человека-бэкенда известной конференции CodeFest. Инна Савчкова (на хабре InnaSavchkova), Tech PR Manager 2ГИС, обеспечила нашему разговору красивый и понятный язык и, конечно же, тире вместо дефисов. Вопросы задавал ahriman.
Привет! Что такое 2ГИС?
2ГИС — компания, предоставляющая полную и точную информацию о 330+ городах в 9 странах. Это всё, что может понадобиться в городе: улицы, дома, компании, работающие в разных сферах, их контакты и полезные сведения о них (такие как, время работы и средний чек в ресторане или отзывы пользователей о работе туристических фирм), входы в здания, способы проезда и многое другое. Сейчас 2ГИС «знает» всё обо всех 2,3 миллионах фирм в России с точностью 95%.
В компании есть отдельная продуктовая команда, на постоянной основе анализирующая то, что нам говорят пользователи, проверяющая применимость новых идей, часть которых впоследствии становятся основой для новых фич продуктов 2ГИС.
![](https://habrastorage.org/webt/0z/em/mz/0zemmzuybbekh1mteuaniaz0qlq.jpeg)
2ГИС использует широкий спектр технологий для построения своих систем и продуктов. Тем не менее, в основном это Open Source. Всё просто — оно работает на всех платформах (а еще у 2ГИС есть пачка проектов на Гитхабе — https://github.com/2gis. прим. автора)
В RnD-департаменте компании работает более 20 команд, создающих средства для сбора и систематизации информации, картографические системы и сервисы, инструменты для продажи и размещения рекламы, онлайн-, оффлайн- и приложения для мобильных устройств.
Недавно Microsoft выпустила официальный пресс-релиз о вашем проекте. Вот вы решили делать новый проект небольшой командой на .NET Core, Kubernetes & Linux. Кто решил использовать такую связку? Почему? Зачем? Какие выгоды вы видели? Какие потенциальные проблемы?
Прибыль 2ГИС получает от продажи рекламных возможностей компаниям, которых хотят быть более заметными для пользователей продуктов 2ГИС.
Одной из идей, которую требовалось проверить, была гипотеза об интересе рекламодателей к размещению видеороликов. До этого в 2ГИС можно было размещать только текстовую или графическую рекламу.
Основной целью было как можно в более короткие сроки вывести на рынок инструменты для продажи и размещения видеорекламы. Было принято решение поручить эту задачу разработчикам из команды, хорошо знающей предметную область и имеющей большой опыт в разработке внутренних инструментов продажи рекламы. Внутренние системы реализованы на .NET Framework и используют Windows-платформу для развертывания. Однако, требования к высокой доступности, отказоустойчивости и производительности сервисов видеорекламы подталкивало использовать ту же инфраструктуру и операционные системы, что и онлайн-продукты 2ГИС. К счастью, на момент старта разработки кроссплатформенный .NET Core был уже полгода как выпущен для широкого использования, и после проведения тестов и создания прототипа было принято решение использовать связку .NET Core, Kubernetes & Linux для реализации сервисов видеорекламы.
Это дало возможность силами двух программистов и аналитика выполнить задачу всего за 2 месяца. Это время включает все работы: начиная с детальной проработки требований и заканчивая релизом в боевую инфраструктуру. Кроме того, стало возможным использовать любые удобные средства разработки и операционные системы, включая Windows и macOS.
![](https://habrastorage.org/webt/fv/k9/wh/fvk9whgcler56auqiuzvwgqcsra.jpeg)
Команда проекта — слева-направо инженеры и проджект-менеджер
Где находится «сердце» проекта? Как добиваетесь, что в такой структуре глобальные клиенты получают одинаковый уровень сервиса?
Кластер Kubernetes используется в 2ГИС как платформа, на которой запущены многие сервисы компании. На самом деле, таких кластеров три — два в России и один в Европе. Это грамотно управляемая инфраструктура со всеми необходимыми свойствами: балансировка, многоуровневая отказоустойчивость, детальный мониторинг и возможность получения и анализа любых логов и кастомной телеметрии с приложений. Поэтому выбор, где развертывать бекэнд-сервисы видеорекламы, по сути, не стоял.
![](https://habrastorage.org/webt/el/qr/mv/elqrmvzhf55ap81_1g6dbsfxig4.jpeg)
Архитектура проекта
С точки зрения хранения, транскодинга и отдачи видеофайлов все немного иначе. Для решения этих задач мы используем сервисы, предоставляемые облачным партнером, специализирующимся только на работе с видеоконтеном. В терминах классических 3-слойных архитектур, сервис видеорекламы, созданный нами в 2ГИС — бизнес-логика, API хранения, транскодинга и отдачи видеофайлов (CDN) — это хранилище данных, а все продукты 2ГИС — это фронтенд.
В такой схеме все наши бекенды географически распределены, поэтому все клиенты получают примерно одинаковый уровень сервиса.
Возвращаясь к общим деталям проекта — расскажи о текущих показателях (пользователи, нагрузка). Проект уже в продакшене или еще тестируется?
Сервис в продакшене с апреля 2017, и сейчас у нас порядка 20000 запросов видеорекламы в сутки. Больше, чем на 80% из них мы отвечаем из кэша. Это дает нам возможность держать довольно высокие нагрузки, хотя на текущем этапе в пике мы имеем не больше 100 RPS.
Какие архитектурные решения использовали в проекте?
Если это глобальный проект, то архитектура должна быть подходящей под высокие нагрузки из различных мест. Как ты думаешь, какие архитектурные паттерны/подходы мастхэв для подобного проекта? Какие инструменты используете для мониторинга происходящего, испытывали ли трудности? DDOS?
Что касается использованных архитектурных решений и подходов, сервис видеорекламы мало чем отличается от других распределенных приложений, рассчитанных на бесперебойную работу с большой аудиторией пользователей. Есть целый набор лучших практик построения распределенных приложений, например, стоит обратить внимание на курс Джеффри Рихтера.
Самое первое, что нужно учесть — это правильное использование серверных ресурсов. Используемые потоки не должны блокироваться надолго, это достигается написанием асинхронного кода. Если одни и те же данные часто запрашиваются, нужно использовать кэш. Если таких данных немного, то хватит даже кэша в памяти. Всегда нужно держать в голове, что в распределенных системах возможны кратковременные отказы («мигания» сети, перезагрузка инфраструктурных сервисов и прочее). Тут помогают довольно простые в использовании паттерны, такие как Timeout, Retry, Fallback и их комбинации. Есть отличная библиотека Polly, которая предоставляет набор подобных готовых инструментов.
Трудности, конечно, бывают. Они случаются, когда какие-либо из инфраструктурных или партнерских сервисов уходят на профилактику или, когда случаются перебои в работе сети провайдеров. Несмотря на «молодость» .NET Core и относительно небольшое число использования этой платформы для построения подобных решений, у нас сугубо положительный опыт — мы не сталкивались с какими-либо «спецэффектами» или странным поведением приложения по причине JIT-компилятора, сборщика мусора или других компонентов CLR. Очень надеемся, что этот тренд сохранится.
Пара слов про DDoS или подобные атаки. Т.к. мы используем общую инфраструктуру компании, то все эти вопросы нам решать не пришлось. Здесь мы полностью полагаемся на высокую квалификацию наших инфраструктурных инженеров и применяемые ими решения по отслеживанию и защите.
Какие планы роста?
Сейчас видеореклама становится одним из базовых инструментов для привлечения внимания пользователей к рекламодателям, наряду с текстовой и графической рекламой. Уже есть несколько рекламных позиций, где используется видеореклама.
Мы подумываем о том, чтобы использовать собственную инфраструктуру для хранения исходных видеороликов с целью снижения в первую очередь юридических рисков. Также мы продолжаем совершенствовать внутренние процессы и системы управления и продажи рекламы в целом, и видеорекламы в частности. Все это обеспечивает повышение эффективности внутри 2ГИС.
Рост сопряжён с опасностью припадания сервиса при большой нагрузке. Что тут?
В 2ГИС построена вся необходимая инфраструктура для нагрузочного тестирования сервисов на основе Gatling-а. Все, что нужно, чтобы ее использовать — это развернуть приложение на специальных «железных» серверах, работающих под управлением Kubernetes, и написать сценарии нагрузочных тестов на Scala. Все необходимые метрики, сравнения результатов между запусками, отчеты и графики предоставляет платформа для нагрузочного тестирования.
Спасибо!
Подробнее про технологии, используемые в 2ГИС можно прочитать в корпоративном блоге компании. Технические доклады, в которых есть много реального опыта всего, что перечислено выше, лежат тут.