Использовать ли ActiveRecord в высоконагруженных проектах?

В документации говорится:



Не злоупотребляйте Active Record. Хоть Active Record и является удобной проекцией данных в стиле ООП, но производительность при её использовании, из-за использования объектов для представления каждой строки результата, падает. Для приложений, интенсивно работающих с данными, рекомендуется использовать DAO или API для работы с СУБД на ещё более низком уровне.




1. Используете ли вы Active Record в своих проектах?

2. Есть ли open source проекты на yii оптимизированные под высокие нагрузки?
  • Вопрос задан
  • 7455 просмотров
Пригласить эксперта
Ответы на вопрос 6
p4s8x
@p4s8x
ActiveRecord это очень удобный и полезный инструмент и его можно и нужно использовать, одна из замечательнейших частей фреймворка, делающих разработку действительно быстрой и легкой.

Если возникают проблемы с производительностью:

1) Во всех проектах используем:CProfileLogRoute с настройкой CDbConnection.enableProfiling=true
Расскажет много полезного.

2) Если видим lazy Loading — не забываем добавлять в with("") нужных релейшинов, используем together() принудительно где нужно.

3) Если используем findAll() на большом количестве записей — используйте CDbCriteria.select и перечисляйте только необходимые колонки, это поможет значительно повысить производительность.

Рекомендую детально изучить изнутри — как работает CActiveRecord, CActiveFinder
Используйте расширения типа XDebug для детального профайлинга проекта.
Основные потери производительности происходят внутри метода
CActiveRecord.populateRecord — посмотрите — что происходит внутри.

4) Все редкообновляемые данные очень легко кэшировать связкой:
CTimestampBehavior + CDbCacheDependency('SELECT MAX(update_time) .... where...');
Если таблица редко обновляется, то и этот запрос будет отрабатывать мгновенно. Mysql тоже сам кэширует результаты таких запросов.

В результате — мест, где приходится отказываться от ActiveRecord остается очень мало.
Скорость отдачи страниц держим на уровне не более 0.1 с.

Если у Вас будут действительно высокие нагрузки, Вас врятли спасет один только отказ от ActiveRecord:
Посмотрите:
Yii: устройство ActiveRecord и Шардинг
Шардинг MySQL на Yii Framework

Также задумываем для одного проекта попробывать www.yiiframework.com/extension/yiimongodbsuite/ с auto-sharding
Ответ написан
Комментировать
un1t
@un1t
Я не верю что может быть затык в этом месте. Затыки бывают — БД, сеть и дисковые операции. На генерацию объектов тратиться относительно мало времени. Я знаю, некоторые крупные и действительно высоконагруженные прокеты используют внутри аццки тормозные технологии типа расширенных xslt преобразований. При этом у пользователя все летает. Это достигается кешированием и горизонтальным масштабированием.
Ответ написан
lybin
@lybin
looking for remote full time job python backend
1. Стараемся не использовать, если вдруг где становится замечено при возможности времени сразу переписывается.
Ответ написан
Комментировать
@VeMax
1. Да, но либо без фанатизма. Основная часть каждого проекта не использует AR.
2. Не встречал.
Ответ написан
kotomyava
@kotomyava
Системный администратор
Использую там, где это уместно.
Часто выполняемые операции на фронтэнде, конечно имеет смысл оптимизировать, отказавшись от AR.
Да и вообще, недурно профайлингом озаботиться, если планируются нагрузки, а иногда и если не планируются, ради интереса. =)
Ответ написан
Комментировать
@rowdyro
Для чтения (подавляющее большинство операций при нагрузках) я редко использвую AR, да это и не очень удобно, потому как вывод идет либо сразу в шаблонизатор, либо в json. Использовать в этом случае внешних ключей (соответственно join) это фейл.

А вот при добавлении/изменении очень удобно через AR проводить валидацию.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы