LINUX.ORG.RU

Учимся красиво танцевать

 


0

0

Привет, Лор!

Пришлось в кои-то веки заняться веб-девелопментом, за день обозрел связки апачей с перлом, в итоге откопал Dancer, понравилось. Создал dancer -a MyApp, костяк готов, теперь ищу бест практисес по работе с базами. Допустим схему я набросаю, положу в корень проекта и при разворачивании запущу ее однократно из под sqlite3.

Но, во-первых, хочется чего-то более высокоуровневого, чем alter table, если понадобится чуток изменить схему на рабочем приложении. Чем пользуется лор для работы со схемой базы? Есть ли какие-то фреймворки или библиотеки, которые еще не орм, но уже умеют «добавить/удалить колонку с foreign key и целостностью», или например преобразовать тип из 15.2 в 15.3? Что-то вроде EAV, но простое и без хранения схемы в базе. Или принято глушить приложение и писать отдельный perl/sql скрипт для одноразового обновления? Возможно я вообще что-то делаю не так.

Второе, как правильно готовить многопоточность на дансере, например чтобы сложный запрос с вычислениями лочил часть базы (можно просто аккуратным мутексом), но выполнялся в фоне? То есть get'ы и post'ы чтобы выполнялись параллельно по возможности. Или нужно мутить к-н plack и уже на нем лочить. Или выкинуть это на уровень бд? Пока не пойму как все должно выглядеть, может оно и не надо, т.к. аудитория приложения планируется до 50 юзеров, время отчетов меряется максимум в секундах.

Ну и третье — куки. Я так понял дансер кладет в куки uid клиента, а по нему валяется sessions/<uid>.yml. Нормально ли все подряд хранить в сессии, не заморачиваясь с дополнительными куками, или что-то стоит хранить в сессии, а что-то только в куках? И как чистить мертвые сессии, если данных там планируется немало, да и вообще надо ли?

ps. cetjs2, добавь плиз тег dancer, если нужно.
pps. перл потому что не знаю почему, советы про рельсы и прочие вундервафли приветствуются.

★★

Последнее исправление: arturpub (всего исправлений: 1)

Не надо смешивать ui и тяжёлую обработку данных.

В одном провайдере средней руки, отчёты для клиента из билинга делались так:

  • веб-кабинет, из которого можно запросить статистику, ставит задание в очередь простым insert'ом в базу
  • фоновый демон делает отчёт, помечает задание в очереди выполненным, кладёт файлик в нужное место
  • веб-кабинет, видя, что задание готово, инклюдит это файлик

Отчёты по времени генерились от 2 до 120 секунд.

anonymous
()

Второе, как правильно готовить многопоточность на дансере, например чтобы сложный запрос с вычислениями лочил часть базы

А что, транзакции база не поддерживает?

Нормально ли все подряд хранить в сессии, не заморачиваясь с дополнительными куками, или что-то стоит хранить в сессии, а что-то только в куках?

Как минимум «Запомнить меня на этом сайте» и подобное нужно сохранять в куках.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)

Чем пользуется лор для работы со схемой базы?

Открывает соседнюю вкладку в tmux, запускает psql и пишет как нужно изменить схему. Нафига тут orm и прочее?. С sqlite вроде как не прокатит, насколько я знаю там только одно соединение можно открыть. В крайнем случае, чтобы не тушить приложение, можно сделать «админку» с одним полем для ввода sql запроса.

например чтобы сложный запрос с вычислениями лочил часть базы но выполнялся в фоне?

Многопоточность - зло. Асинхронные запросы к базе нужны (не знаю как с этим в случае sqlite), на cpan что-то есть, разной степени годности

disarmer ★★★
()
Ответ на: комментарий от anonymous

Хм, а потом аяксом дергать статус готовности или прогресс обновлять...

arturpub ★★
() автор топика
Ответ на: комментарий от no-such-file

У меня еще задач как таковых не стоит, но зная область, там будет серия select+foreach, а потом update вообще в другое место, как это предварительно грамотно заблокировать без гемора, я не знаю. Проще мутексом отрубить часть и не париться с дедлоками и прощей скульщиной.

arturpub ★★
() автор топика
Ответ на: комментарий от disarmer

Нафига тут orm и прочее?.

чтобы были автоматические миграции. Грубо говоря, ты просто загружаешь код на продакшен, твое приложение видит, что у базы неправильная структура и переделывает как ему нравится. Это супер удобно!

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

чтобы были автоматические миграции

А если я хардкорно использую PostgreSQL: десятки схем, сотни таблиц (некоторые с десятками полей), огномное количество вьюшек и триггеров (причем некоторые на Perl). Запросы к этому бывают огромными и очень сложными - чтобы не положить базу запросом, приходится очень сильно усложнять код.

Какие решения «автоматические миграции» мне помогут упростить работу с базой? Интересуют конкретные реализации.

outtaspace ★★★
()

готовить многопоточность

Если в web'е тебе понадобилась многопоточность, значит ты что-то спроектировал неправильно. Очереди сообщений, модели акторов, prefork-серверы, проброс websocket'ов, вот это все.

планируется до 50 юзеров

Бывают пиковые нагрузки, когда ты правильно все сделаешь, сможешь процессить от 50 юзеров до 5000.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

А если я хардкорно использую PostgreSQL

чтобы использовать ORM, не делай так и всё

Какие решения «автоматические миграции» мне помогут упростить работу с базой?

можно класть скрипты в формате: один файл состоит из секций «накатить» и «откатить». Каждый файл соответствует какой-то конкретной «версии» БД. Внутри БД хранится номер ее версии. Если версия БД ниже, чем версия самого последнего существующего файла, последовательно накатываются все части «накатить» файлов, располагающихся между этими версиями.

про перл я ничего не знаю, помойму в вебе ему не место, поэтому названий реализаций не скажу

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

чтобы использовать ORM, не делай так и всё

Почему не делать? Очень прикольный подход, постгресоцентризм. Я могу «не делай так», но это плохо закончится. Неужели ORM это для школьников? Для крупных проектов это решение не подходит?

про перл я ничего не знаю, помойму в вебе ему не место, поэтому названий реализаций не скажу

Да мне не за Perl. Хочу посмотреть на достаточно развитую и зрелую систему, которая мне поможет с миграциями. Можно на чем угодно, кроме изотерики.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Для крупных проектов это решение не подходит?

смысл в том, что под нагрузкой никакими особенностями БД пользоваться нельзя. Даже джойнами нельзя - сделал джойн по большому объему данных и давай досвиданья. Поэтому таблицы получаются очень простыми, и миграции получаются простыми, никаких проблем.

когда мы делали с помощью hibernate, то один из критериев того, что можно выпускать релиз было то, что hibernate правильно обновляет схему. Неправильно обновляет - выкручивайся как хочешь, но сделай такую схему, которая бы понравилась хибернейту.

но Hibernate (по крайней мере, на тот момент) не умел data migrations, поэтому данные мы двигали сами, способом, описанным в предыдущем комменте. Впрочем, любое движение данных - это экстренная ситуация, надо избегать подобных факапов.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

смысл в том, что под нагрузкой никакими особенностями БД пользоваться нельзя.

А разве я что-то говорил про нагрузку и big-data? Речь шла об ORM и обычном постгресе, пусть и прилично нагруженном. База в 10-20 гигов, в память железяки влезает целиком, данных мало и они очень сильно взаимосвязаны.

Пока вижу такой расклад:

1) Есть свежий постгрес, которым все разработчики очень довольны и который на 100% справляется. Активно юзаются DSL которые идеально заточены под процессинг реляционных данных.

2) Есть хибернейт, который делает из разработчиков анальных рабов, навязываются ограничения ORM'а с неясными перспективами (запросы которые он генерит, могут поставить базу раком). Значительная часть бизнес-логики переносится далеко от СУБД, и няшных DLS которые в ней реализованы для процессинга данных.

И все это ради эфемерных «миграций», которые нужны раз в 2-3 года, когда СУБД ставят на новое железо.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

и няшных DSL

какие они в жопу няшные, если задача формулируется в терминах объектов, а SQL оперирует какими-то нафиг неупершимися таблицами?

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

задача формулируется в терминах объектов

Возможно. Только внутри хранимки объектов нет. А вот снаружи пусть будет что угодно, связать эти два слоя (реляционный и объектный) проще простого.

а SQL оперирует какими-то нафиг неупершимися таблицами?

Ну да. Мы ведь реляционные СУБД обсуждали, а не объектные.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Только внутри хранимки объектов нет.

они и не нужны. в том числе поэтому. (но еще больше не нужны из-за отсутствия вменяемой отладки.)

Мы ведь реляционные СУБД обсуждали,

используют их для одного и того же

связать эти два слоя (реляционный и объектный) проще простого

это жутко долго и неудобно

я пробовал три подхода: чистый SQL и ручной маппинг, язык со встроенным маппингом (Scala), ORM

сделать сайт с использованием ORM гораздо быстрее, чем с помощью Scala+Anorm, а чистый SQL по скорости разработки близко не валялся рядом

stevejobs ★★★★☆
()
Ответ на: комментарий от outtaspace

И все это ради эфемерных «миграций», которые нужны раз в 2-3 года, когда СУБД ставят на новое железо.

Миграции это не про перенос бд на другое железо, а про когда схема в бд не совпадает со схемой в приложении и сама патчится до нужной версии по некоторым правилам. Происходит поначалу 2-3 раза в день, потом в месяц, и потом только в год.

arturpub ★★
() автор топика
Ответ на: комментарий от stevejobs

это жутко долго и неудобно

Кому как. Видимо удобно «выкручивайся как хочешь, но сделай такую схему, которая бы понравилась хибернейту».

сделать сайт с использованием ORM гораздо быстрее

Если делать сайт в качестве школьного домашнего задания, возможно он и быстрее. К слову - я пробовал ORM'ы на простых задачах. Только в описанной мной задаче - совсем не так.

outtaspace ★★★
()
Ответ на: комментарий от arturpub

Миграции это не про перенос бд на другое железо

Это понятно.

Разве ручного управления этим процессом недостаточно? Посмотреть diff хранимки проще простого. Ну еще можно тест написать, в котором будут описаны изменения в DDL.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Видимо удобно «выкручивайся как хочешь, но сделай такую схему, которая бы понравилась хибернейту».

этого почти никогда не случается

К слову - я пробовал ORM'ы на простых задачах. Только в описанной мной задаче - совсем не так.

я сразу стараюсь, чтобы описанная тобой задача не возникала, даже когда она очень вероятна. Вляпался - ну что, разгребай теперь всё руками.

stevejobs ★★★★☆
()
Ответ на: комментарий от outtaspace

А фиг знает. Полагаться на руки, натравливая приложение на базу в продакшене, я так ни разу не делал :) по мне лучше пусть при старте сам версии сверит и ругнется.

arturpub ★★
() автор топика
Ответ на: комментарий от outtaspace

Ускорение вот от чего возникает. Допустим, у тебя 100500 классов. Они как-то там связаны между собой. Когда у тебя есть ORM, ты просто создаешь классы, и знаешь что у них есть методы save и load. Как именно они будут это делать - не твоя проблема. Пока ты пишешь на SQL - т.е., создаешь таблицы, пишешь к ним процедурные мапинги, интегрируешь маппинги в бизнес-логику — кто то с импользованием ORM уже сделает 100500 объектов, которые будут работать сами по себе. Самый ахтунг выясняется, когда допустим у тебя в подчинении 10 джуниоров, которые что-то там колбасят в БД. И каждый из них колбасит что-то своё, по своему понимает SQL, по-своему понимает дизайн БД (как правило плохо). И потом случается говно, и это говно нужно разгребать уже тебе. А когда у тебя ORM, то всё более-менее единообразно происходит, большинство «гениальных» идей прослойку в виде ORMа не проходят. Если ты видишь по коммитам, что кто-то пошел писать свой диалект для БД, просто сразу отменяешь коммит, и объясняешь что так делать нельзя, вот есть стандартные тулзы - ими и выкручивайся.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Вляпался - ну что, разгребай теперь всё руками.

Вот это второй вопрос в рейтинге самых интересных. Ты действительно умеешь управлять сложностью проектов так, чтобы небыло сотен таблиц, тысяч столбцов, миллиардов кортежей?

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

как тебе такая идея: не использовать никаких фич БД, кроме несвязанных таблиц. Никакой реляционной алгебры, никаких хранимок, ничего. Всю логику работы с данными реализовывать в своем приложении. Тогда из вопроса про управление БД, вопрос становится про программирование вообще. Какую семантику закодируешь, такая и будет.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Пардоньте, а зачем тогда скуль вообще? Джойны и группы вручную — не очень ок для сложноагрегируемых массивов, сам скуль — не очень ок для иерархических данных. Тогда уж лучше выделить иерархичность в к-л нативный носкуль с готовым ормом, а агрегирование сделать в виде библиотеки предметной области, уже отмапленной на рбд. Или нет?

arturpub ★★
() автор топика
Ответ на: комментарий от arturpub

Ну я плавно перемещаюсь на ноускуль, но заказчики против. Типа неынтерпрайзно, студенческие поделки, итп. Например, в одном из проектов вместо ноускуля используется такой прием: последнее поле в sql-таблице - это блоб, в который записан JSON. Сначала этот json селектается в приложение, приложением уже парсится и мапится на объекты. Уродливо, зато заказчик доволен как слон, типа ынтерпрайзно, ведь лежит в оракле. (Идея этого уродства не моя, но внутри компании она используется повсеместно.). (Это не мой текущий работодатель, а предыдущий, ну чтобы вы не подумали чего плохого).

stevejobs ★★★★☆
()
Ответ на: комментарий от arturpub

Ну и наверное, это от того, что я не умею работать с SQL, и свое неосиляторство объясняю высокими причинами. Впрочем, я пока не видел никого, кто по-настоящему умел бы в SQL...

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Не переживай, сам sql нихера не умеет в бизнес логику, особенно когда нужно работать с высокоуровневыми понятиями типа «взять вон то, списать по аналитикам из вон того, результат размазать вон туда по коэффициентам из списка подразделений и приделать номера строк по порядку». 1с восьмерка попыталась что-то похожее сделать, у них поверх скуля темплейты сторедов универсальных, которые из схемы сами строятся, и хитрые вьюшки для всего этого. Для юзера выглядит как селект из параметризованной таблицы. Но все равно проще почти все втащить локально и потом раскидать. Для чистого скуля это писанина кастомных сторедов, которые ни отладить, ни проверить толком нельзя, где тут бизнес-логика - очень далеко.

arturpub ★★
() автор топика
Ответ на: комментарий от stevejobs

как тебе такая идея

Идея не нова, хорошо с ней знаком.

outtaspace ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.