В программировании практика решает очень многое, без работы над реальными проектами хорошим специалистом стать нельзя. Понимая все это, Geekbrains в рамках факультета Go-разработки запустил совместный проект с Ростелекомом. Проект заключается в разработке студентами высоконагруженного сервиса — платформы интерактивного телевидения по примеру сервиса Ростелекома Wink.
Цель — научить студентов создавать комплексные сложные сервисы, в которых сочетается несколько технологий. О том, как все это будет выглядеть на практике, рассказывает Олег olegator99 Герасимов, директор центра компетенций в «Ростелеком ИТ» и одновременно — преподаватель факультета «Go-разработки» GeekBrains.
Почему Go, PostgreSQL и видеоплатформа, а не что-то другое?
Сейчас довольно популярными являются веб-сайты и сервисы, которые спроектированы по архитектуре SPA (Single Page Application). Это означает, что создаваемые сайты и сервисы взаимодействуют с выделенным backend-приложением через HTTP REST API.
Golang используется в качестве рабочего инструмента в проекте, поскольку это язык программирования, который имеет вполне явную специализацию: разработка серверного программного обеспечения, т.е. backend-проектов. В подавляющем большинстве случаев они предоставляют REST API для фронтенда и/или мобильных приложений.
Ну, и относительно видеоплатформы все объясняется просто. Дело в том, что разработка платформы интерактивного телевидения — вполне реальная задача, с которой можно столкнуться на практике. Еще более важно то, что в ходе ее разработки нужно использовать навыки и знания из смежных областей, причем таких, которые являются важными для любого другого крупного бэкенд-проекта, причем не только на Go. В ходе работы будет разработано полноценное бэкенд-приложение, спроектировано и задокументировано REST API, спроектированы схемы и структуры данные, которые затем будут переложены на SQL БД. PostgreSQL — выбран как наиболее популярная и хорошо себя зарекомендовавшая реляционная SQL БД.
В качестве наглядного примера используется платформа цифрового ТВ от «Ростелеком» Wink. Студенты могут сравнивать реально работающий проект со своим собственным сервисом.
Какие технологии нужны для разработки проекта?
Набор основных технологий и компонентов, которые будут использоваться, достаточно большой. Если говорить про основные, то получится такой набор:
- SQL БД Postgres;
- HTTP REST API, а также реализации HTTP web-сервера и роутера.
Кроме того, бонусом идет изучение технологии In-memory DB Reindexer. Студенты изучат еще и разработку метода поиска по базе фильмов с учетом морфологии русского языка. Для этого и будет использоваться DB Reindexer.
В принципе, на рынке существует довольно много разных БД, которые можно использовать, в том числе, для разработки платформы цифрового ТВ. Но большинство будет уступать проекту с DB Reindexer по производительности. Правда, только в том случае, если речь идет о высоконагруженном проекте.
Если же разрабатывается ТВ-платформа с небольшим количеством пользователей, можно выбирать практически любой другой инструмент, возможности которого устраивают разработчика. В качестве примера можно привести Elastic Search или Mongo — их вполне хватит для обслуживания проекта, который рассчитан на сотни тысяч пользователей. Но когда база пользователей достигает уже несколько миллионов, указанные решения не стоит использовать, поскольку это приведет к значительному увеличению количества серверов. Как следствие — увеличится стоимость поддержки проекта, ввода его в эксплуатацию и обслуживания.
Работа c Reindexer из Go не сложнее работы через ORM с обычной SQL БД, а за счет встроенного Query Builder в чем-то даже и проще. На освоение работы с Reindexer и его внедрение в проект уйдет немного времени. Reindexer и Go дают возможность разрабатывать бэкенды практически любых сервисов, где требуется отображение витрины с каким-либо контентом (фильмы, товары, книги и т.п.) со сложной фильтрацией. Подобную витрину можно использовать для интернет-магазина, сайта по продаже/аренде, туристического агентства и т.п.
Инструменты для создания высоконагруженного проекта
Самый минимальный набор для разработки такого рода проектов — IDE и отладчики. Для Golang доступно большое количество хороших IDE, как платных, так и бесплатных. Я бы рекомендовал Goland или VS Code — их возможности делают разработку удобнее и нагляднее. В качестве отладчика можно взять Delve.
Что касается реализации решений для поиска «узких» мест в памяти и производительности — можно использовать встроенный инструмент Go, который называется Pprof. Он в графическом виде отображает граф вызовов, который позволяет быстро локализовать и исправить чрезмерно ресурсоемкие места.
Ну а для визуальной работы с PostgreSQL решений еще больше, включая Psequel.
Наиболее важные моменты в разработке высоконагруженных проектов — инструменты для нагрузочного тестирования. Чтобы не было потом мучительно больно — лучше проверять все задолго до продакшена. Для быстрого и поверхностного тестирования в системе CI стоит использовать Wrk с обвязкой на Python. Wrk дает возможность сгенерировать большую нагрузку на методы HTTP REST API и оценить их скорость работы.
Глубокое нагрузочное тестирование со сложными пользовательскими сценариями стоит использовать Locust. Правда, наша команда разработала для него worker на Go, поскольку штатный Worker написан на Python, и его возможностей нам не хватало.
Что требуется, чтобы считаться хорошим разработчиком на Go?
В качестве заключения расскажем о том, почему вообще стоит становиться разработчиком Go и что должен уметь хороший специалист по Go. Основное — то, что Golang можно назвать относительно низкоуровневым языком программирования, на нем можно писать весьма разнообразные проекты.
Поэтому высококлассным разработчиком можно стать в том случае, если получить хороший комплексный бэкграунд:
- принципы построения современных ОС;
- принципы работы сущностей, с которыми работают ОС, включая процессы, потоки, файловые дескрипторы и т.п.;
- уметь работать с командной строкой Unix: не просто немного разбираться, а работать;
- понимать принципы работы компонентов: памяти, центрального процессора, сети, и т.п.
Кроме того, в силу специализации Go нужно и знание смежных технологий. В первую очередь это базы данных, не зря выше по тексту этому вопросу уделено столько внимания. Разработчик должен не просто уметь работать с конкретной БД, но и понимать, какие есть еще решения, какие у них плюсы и минусы. В итоге для каждого конкретного проекта программист должен уметь подобрать правильный тип БД.
После БД идет следующий «смежный» компонент — понимание стека сетевых протоколов и принципов их работы. Хороший разработчик должен уметь дать развернутый ответ на вопрос «Вы ввели в адресной строке браузера www.google.com. Что в этом момент происходит на уровне сетевого взаимодействия?»
И на третьем месте — знания и хотя бы небольшой опыт в DevOps. Уровень должен быть достаточным для автоматизации сборки и тестирования средствами Gitlab CI, Jenkins или им подобным CI/CD системам. Требуется еще и быть хотя бы поверхностно знакомым со средствами деплоя вроде Ansible и/или Chef.
Автор: mary_arti