Как стать автором
Обновить

Комментарии 5

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

Для before_render в продуктивной среде можно убрать создание снапшота данных в stash, если передается много данных. Реагировать на ошибки в нем тоже можно иначе и более легким с точки зрения производительности способом.

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

В моих приложениях у меня всего несколько десятков пользователей и среднее время отдачи страницы клиенту около 0,5 секунды, из которых половина уходит на ожидание ответов от API сервисов, поставлющих бОльшую часть данных.
Если уж Вы начали давать конкретные советы, добавлю свои пять копеек.

Я бы рекомендовал добавить use EV; до загрузки Mojo (т.е. даже не в AppName.pm, а в скрипте-пускалке проекта) — от используемого event loop очень сильно зависит стабильность, производительность и разные побочные эффекты (например, реакция на fork()), поэтому лучше обеспечить использование нужной реализации event loop, а не надеяться на автоопределение и потом сутками ловить странные баги проявляющиеся только на одном сервере, где случайно забыли поставить EV.

Если проект может потребоваться запускать и нормально (под hypnotoad) и как обычную CGI, но код хочется писать не думая об отличиях между ними (в т.ч. используя асинхронные операции и event loop), то в скрипт-пускалку нужно добавить этот хак (вместо «WebSite» в паре мест там должно быть имя пакета приложения, т.е. в Вашем случае это «AppName») чтобы CGI нормально обрабатывала неблокирующие запросы (с $c->render_later;).

Так же при использовании EV в скрипт-пускалку стоит добавить эти строчки, чтобы при возникновении необработанного исключения где-то в глубинах приложения оно упало, а не попыталось продолжить работать как ни в чём не бывало:
$EV::DIED = sub { warn $@ if !$SIG{__DIE__}; exit 255 };
Mojo::IOLoop->singleton->reactor->unsubscribe('error');

use Mojo::Base 'Mojolicious';
делает ненужным
use utf8;
и, скорее всего (если не используются IO::File и mro 'c3'), ненужным
use Modern::Perl;

$r->any('/(*everything')->to('user#main');
Здесь опечатка (скобка не закрыта, либо её можно было вообще не открывать), но главное то, что этот роутинг не совпадёт с корнем сайта — чтобы (*everything) стал опциональным нужно добавить в stash ключ с этим именем (т.е. обеспечить значение по умолчанию если placeholder не задан):
$r->any('/*everything')->to('user#main', everything=>undef);

use base 'Mojolicious::Plugin';
use Modern::Perl;
Аналогично вышеупомянутому, лучше заменить на:
use Mojo::Base 'Mojolicious::Plugin';

if $user_login eq $user foreach (@{$self->config->{PrivilegedUsers}->{Administrators}})
Извините, это не моё дело, каждый пишет как ему удобно, и это не связано с Mojo, но… для таких проверок в перле вообще-то существуют хеши. И даже если в конфиге хеш задавать тупо присваивая всем ключам значение 1 неудобно, массив из конфига можно отконвертировать в хеш одной операцией map{$_=>1}@admins при запуске приложения. Кроме того, этот код работать не может — во-первых нельзя использовать постфиксный if внутри постфиксного for, и во-вторых даже если переделать foreach на обычный, то вместо $user вероятно должна быть $_, иначе какой смысл в foreach? Судя по всему код реального проекта был не очень внимательно изменён для статьи, ниже ещё есть похожие проблемы, например перед вызовом $c->RedmineReport(); создаётся, но никак не используется %snapshot.
За 5 копеек спасибо, будем знать.
Код действительно местами скипался исключительно для наглядности. Буду внимательней в следующий раз. (:
Видимо, надо таки дописать (немного осталось для первой версии) свой клон бложика, писанный на Mojo (изначально планировался новостной блок для более крупного проекта) и на его примере написать о том, как я писал свой «велосипед».
А то, я смотрю, тема становится популярной.

Автору спасибо, почерпнул интересного
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории