Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Go для масштабного веб-проекта

#golang #nosql #sql


Здравствуйте. Хоть у меня вопрос по го, вкратце расскажу свой путь разработчика.
Да, и еще, чтобы быть полностью откровенным упомяну: мне 16 лет. Программированием
я заинтересовался в 9 лет, и с тех пор не могу оторваться. Дело в том, что я не из
той "школоты", которые клипают один за одним сайты на вордпрессе, или пишут 88код на
php + html. Я прошел такой путь: pascal(месяца три, помог мне с основами программирования)
-> html, css, php -> c(три года назад) -> c++(спустя два месяца после начала обучения
си решил, что целесообразнее будет учить плюсы) -> java (после того, как постиг основы
ооп; в джаве после того, как через месяцев 7 захотелось познакомиться с EE, сразу перехотелось
вообще учить дальше; оно было очень громоздкое) -> php -> python (плюс немного Django)
-> php(с питоном дела шли еще не очень хорошо, а понадобилось написать систему тестирования
на тысячи две с половиной строк кода для школы) -> RoR(фреймворк потрясающий, но перестал
его рассматривать так как: проблемы с производительностью, он популярен сейчас, а такое
не будет продолжаться вечно, а мне еще учится) -> Play framework + Scala(все шло очень
хорошо, еще один веб проект, пока не дошло до углубления в скалу; хоть язык мне и понравился,
но: он слишком сложный - это раз, в нем слишком много возможностей, приходится выбирать,
не знаешь какая лучше; проблемы с concurrency по сравнению с го) -> и вот, наконец,
го. Он мне сразу понравился. 
И вот, после двух с половиной месяцев изучения го у меня вопрос: я хочу написать
масштабный веб проект. я буду его писать не в одиночку, но за бэкенд буду отвечать
только я. Во всяком случае, на первых порах. Проект совершенно новый, аналогов ему
нету. Не буду раскрывать идею, скажу только что будут частые запросы базы данных. Информация,
во всяком случае поначалу, будет только текстовая, и немного картинок. Но будет много
запросов к базе данных. Я бы мог написать его на пхп намного быстрее чем на го, но
я хочу не просто написать сайт, я хочу построить именно масштабный веб проект, будто
его будут использовать миллионы людей (хотя так вряд ли произойдет; но зато будет опыт).
Хочу разделить веб приложения на 4 слоя, ну там фронт энд, application logic , back
end, datastorage. Вопрос: могу ли я использовать как серверный язык для такого предназначения
Golang? Даст ли он мне прекрасную производительность, и не будет ли проблем с отсутствием
библиотек или возможностей языка, что приведет к невозможности продолжения написания
проекта?
Какие советы можете дать мне по строению высоконагруженого сервиса? 
И, какую лучше использовать бд: Sql или nosql. В курсе что на хэшход использовали
postgresql, но мало ли. Есть очень неплохие драйвера и для nosql, к примеру Mgo , и
для редиса видел.
Мне очень важно знать ваше мнение.    


Ответы

Ответ 1



могу ли я использовать как серверный язык для такого предназначения Golang? Еще как можете, Go для этого предназначен. Даст ли он мне прекрасную производительность Это только от вас зависит, как напишите так и "поплывет". не будет ли проблем с отсутствием библиотек или возможностей языка Даже затрудняюсь предположить, что-же такое вам может понадобится чего нельзя реализовать в Go? Но вот небольшая подборочка, вполне возможно вам что-то из этого пригодится. https://github.com/bolknote/go-gd https://github.com/go-sql-driver/mysql https://code.google.com/p/go-charset/ https://github.com/andelf/go-curl

Ответ 2



Гм. Странные у Вас выводы. Scala - довольно прост, вообще говоря. RoR - не тормозной, вообще говоря, на нем довольно большие сайты работают. Вы напрасно там быстро прыгаете. Считается, что для того, чтобы понять какой-то инструмент программирования (язык, фреймворк и пр.) как следует - нужно на нем попрограммировать 2 года. Ну при большом таланте - год-полтора. А не три месяца. Но это ваше личное дело, не буду осуждать. Вы видимо, ищите "серебряную пулю"? Волшебный инструмент, который круче других на голову? Таких нет, иначе все другие программисты давно на него бы перешли. Если проект большой, то я предложил бы базироваться на развитом web-фреймворке, не сковывающем особо программиста, например на Pyramid ( http://docs.pylonsproject.org/en/latest/docs/pyramid.html ). Фреймворк поддержит Вас и сэкономит кучу времени. Если речь идет о частых запросах к базе данных, то скорость работы от самого языка программирования бэкэнда не зависит. Если Вы поступите по умному, напишете типичную задачку из своего проекта в виде отдельного теста и проведете замер, то поймете, что процентов 95 (к примеру, может больше, может меньше, но - значительно) времени занимает работа самой базы данных, лежащая за пределами вашего бэкэнда и, следовательно, за пределами языка программирования. По сути скорость зависит от того, как именно Вы работаете с базой данных, как оптимизирована ваша программа под базу данных. Даже простейший банальный кэш на уровне бэкэнда поможет поднять производительность, скорее всего. Более того, даже выбор правильной базы данных под особенности ваших данных позволит поднять производительность до небес. Я бы отсоветовал Вам Go. К нему не так много серьезных фреймворков пока, не так много документации. А его особенности проявляют себя большим плюсом в том случае, если у Вас сложные алгоритмы на стороне бэкэнда, а не работа с базой данных. С Го многое придется писать самому, придумывать самому. Это очень сложно и получить неэффективную систему будет очень просто. Гораздо эффективнее воспользоваться готовыми инструментами, уже имеющимися для других языков. Эти инструменты придется изучить изнутри, полазить в исходном коде, это будет очень полезно для повышения вашей квалификации. Да и время сэкономит. Го-ланг - дает слишком много свободы, и с ним Вы получите ту же проблему, о которой писали выше: "в нем слишком много возможностей, приходится выбирать, не знаешь какая лучше". Кроме того, Ваш выбор усугубится тем, что готовых развитых и отлаженных библиотек и фреймворков - мало. Любому, кто даст конкретный ответ на это, можете плюнуть прямо в глаза: "Какие советы можете дать мне по строению высоконагруженого сервиса? И, какую лучше использовать бд: Sql или nosql. В курсе что на хэшход использовали postgresql, но мало ли. Есть очень неплохие драйвера и для nosql, к примеру Mgo , и для редиса видел." Ибо правильный ответ очень сильно зависит от конкретной архитектуры данных и от конкретной архитектуры системы. Правильные ответы могут быть в каждом конкретном случае очень противоположенные. Для того, чтобы более-менее правильно выбрать базу данных следует проанализировать что там за данные. Что чаще происходит - запись или чтение, в каких масштабах, простые или сложные структуры хранятся, мешают ли пользователи друг другу (один пишет то же, что в это время может читать другой), простые или сложные критерии выборок и куча еще много чего. В общем случае самым лучшим решением для снятия нагрузки с сервера является развитый механизм кэширования и статических (заранее сгенерированных) страниц. Но ни язык программирования ни база данных Вам в этом не поможет. Это только алгоритмы, которые Вы должны придумать самостоятельно под вашу конкретную ситуацию.

Ответ 3



Golang - годная вещь для разработки под web. Всё, что в других языках (веб сервера, печеньки, роутинг, и т.п.) реализовано в виде фреймворков и библиотек, в Golang есть из коробки. Язык очень простой, код получается предельно чистым и понятным. Могу порекомендовать Revel framework (в скором времени ожидается релиз), хотя и предполагаю, что ТС предпочтёт свой велосипед. Тем не менее. Revel - вещь годная. Не будет необходимости заниматься архитектурой базовых вещей (есть, по крайней мере, VC от MVC -- модель нужно притаскивать свою), есть возможность писать модульно, переопределять своими модулями (aka фильтрами) default логику базовых компонентов, да и быстрее на порядок и приятнее, чем свой велосипед (ибо позволяет сконцентрироваться на непосредственно решении задачи, нежели шашечках). А кроме того, нужно посетить баг трекер проекта, глянуть на количество issues (открытых и закрытых), людей принимающих участие в разработке (бессменный Rob & co). Колоссальное количество ресурсов, совместных усилий, общих размышлений и обсуждений. К чему я клоню? Работа одного над тем же самым будет выглядеть убогим подобием. В виде модуля в master ветке с недавних пор лежит компонент для работы с БД, поддерживаются: sqlite, mysql и postgres. В качестве ORM (хотя это не совсем ORM в классическом понимании) можно использовать gorp. Или его форк -- modl. Для примера использования первого - см. проект booking в репозитории revel, директория examples. Для любителей MongoDB г-н Jeff написал модуль для интеграции Revel с этой БД, называется (неожиданно) -- revmgo. Как образец использования могу порекомендовать приложение bloggo от этого же автора на github'е. Использовать можно что угодно, зависит от задач. Я в процессе реализации своего сервиса на Revel пришёл в выводу, что MongoDB - это, наверное, круто (так, по крайней мере, было, когда приходилось работать с Node.js), однако, Postgres решает поставленную задачу проще. Приложение было переписано. Узким горлышком в веб проектах, как правило, является БД. Однако, на этапе, когда имеется лишь идея проекта, производительность абсолютно не важна. В случае успешного проекта, к этому можно всегда вернуться, решить проблему. Кроме того, Revel включает, например, стандартный модуль кеширования: его можно использовать для временного хранения информации, которую долго доставать из базы при каждом запросе (по умолчанию для хранения используется RAM, однако, для этого легко может быть преспособлен кластер memcached или redis; возможность предусмотрена из коробки). Итак, проблемы с отсутствием библиотек - маловероятны. Язык статически типизируемый, компилируемый. Производительность ожидается высокой, потребление памяти - небольшим. На простроении высоконагруженного сервиса в вакууме фокусироваться не нужно. Лучше сервис, который просто работает, чем тот, который работает на несколько милисекунд быстрее, но только в теории ибо его ещё нет.

Ответ 4



Golang для вашего проекта подойдет отлично. Как раз для подобного и разрабатывался. Лучше использовать MognoDb, есть отличный драйвер для Go - mgo.

Ответ 5



Если есть опасения что не хватит библиотек, то уверяю, их уйма. Регистрируйся на github и bitbucket и вперёд, при поиске выбирай язык GO и на любой вопрос будут разработки и либы :) У нас в проекте в осномном mysql использовался, я сам знаю 5 библиотек под него. Сейчас потребовался потгрес, с ходу нашлось три библиотеки. Даже apache cassandra, казалось бы экзотика, но либа уже написана и прекрасно работает...

Комментариев нет:

Отправить комментарий