Комментарии 5
Все же было бы интересно посмотреть насколько это «упрощение» сказывается на производительности.
+2
Нагрузочных тестирований я еще не проводил, так что аргументов в цифрах не имею.
Наибольшее влияние, по моим ощущениям, оказывают хуки и условия в маршрутах.
Для before_render в продуктивной среде можно убрать создание снапшота данных в stash, если передается много данных. Реагировать на ошибки в нем тоже можно иначе и более легким с точки зрения производительности способом.
Условия, в свою очередь, позволяют не делать теже проверки внутри каждого контроллера с ограниченным доступом.
В моих приложениях у меня всего несколько десятков пользователей и среднее время отдачи страницы клиенту около 0,5 секунды, из которых половина уходит на ожидание ответов от API сервисов, поставлющих бОльшую часть данных.
Наибольшее влияние, по моим ощущениям, оказывают хуки и условия в маршрутах.
Для before_render в продуктивной среде можно убрать создание снапшота данных в stash, если передается много данных. Реагировать на ошибки в нем тоже можно иначе и более легким с точки зрения производительности способом.
Условия, в свою очередь, позволяют не делать теже проверки внутри каждого контроллера с ограниченным доступом.
В моих приложениях у меня всего несколько десятков пользователей и среднее время отдачи страницы клиенту около 0,5 секунды, из которых половина уходит на ожидание ответов от API сервисов, поставлющих бОльшую часть данных.
0
Если уж Вы начали давать конкретные советы, добавлю свои пять копеек.
Я бы рекомендовал добавить
Если проект может потребоваться запускать и нормально (под hypnotoad) и как обычную CGI, но код хочется писать не думая об отличиях между ними (в т.ч. используя асинхронные операции и event loop), то в скрипт-пускалку нужно добавить этот хак (вместо «WebSite» в паре мест там должно быть имя пакета приложения, т.е. в Вашем случае это «AppName») чтобы CGI нормально обрабатывала неблокирующие запросы (с
Так же при использовании
Я бы рекомендовал добавить
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
.+1
Видимо, надо таки дописать (немного осталось для первой версии) свой клон бложика, писанный на Mojo (изначально планировался новостной блок для более крупного проекта) и на его примере написать о том, как я писал свой «велосипед».
А то, я смотрю, тема становится популярной.
Автору спасибо, почерпнул интересного
А то, я смотрю, тема становится популярной.
Автору спасибо, почерпнул интересного
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Полезное и приятное для разработчика в Mojolicious