Счастье контент-редактора и беззаботная жизнь разработчика с технологией Сache Dependencies

Счастье контент-редактора и беззаботная жизнь разработчика с технологией Сache Dependencies

Начну это сообщение с поучительной истории smile:)

Ко мне за помощью обратились знакомый, ИТ директор крупной компании, для которой сайт - это часть бизнеса. Мол "Серега, у нас сайт укладывает сильный сервер. Не мог бы ты заехать на часок и помочь разобраться, в чем дело, это мы накосячили, или это ваш Битрикс тормозит. "

Типовая ситуация, согласитесь smile:) Святое дело помочь, тем более находятся они от нас в 10 минутах пешком.

Приехал, сели с ИТ директором и двумя разработчиками, смотрим, чем располагаем.


Первым делом проверили конфигурацию системы. Конечно, все оказалось настроено не так, как нужно. Чуток увеличили размер APC руками админа и установили MaxClients, и система стала значительно лучше себя вести.

Но не летает, прямо скажем. А сервер-то мощный. Должен же летать, рассуждаю я.

Проверил параметры монитора производительности по первым двух закладкам. Система теперь более менее. Битрикс настроен правильно. И что важно для этой истории, монитор производительности показывает, что Автокеширование включено! А иначе бы мы показали, что Битрикс настроен не оптимально smile:)



Смотрю главную страницу сайта, которая отрабатывает за 1-3 секунды. Страница сложная, содержит два-три десятка компонентов с данными из инфоблоков. Проект-то большой. Открываю страницу в режиме разработки и включаю отладку. О боже, 980 SQL запросов на главной странице!

Как так, работает же Автокеширование, такого быть не может, если только... да, если только у каждого компонента на главной странице не установлено "НЕ КЕШИРОВАТЬ".



Моему гневу нет предела! "Кто делал вам сайт?". QSoft - отвечает веб-разработчик.
Я пять минут еще возмущаюсь и бурно объясняю суть вопроса с автокешированием и квалификацию разработчика, достаю телефон и начинаю набирать телефон Миши Токовинина, объясняя, что сейчас-то я им скажу все, что думаю про их хваленую разработку, и тут.... "ЭТО СДЕЛАЛ Я",- громко говорит второй разработчик.

Немая пауза,тишина, все смотрят на него с вопросом smile:) я отключаю телефонный звонок.

"Да достали меня контент редакторы, мы заносим данные, а они сразу не появляются на сайте. Ну я по всему сайту прошел и отключил кеширование в компонентах" (Это чтобы монитор производительности не жаловался, что Битрикс не оптимально настроен, если бы он просто выключил Автокеширование одной кнопкой smile:) )

Ну хорошо, говорю я, но можно было проблему решить двумя способами:
1. Дать контент редакторам права на кнопку "Обновить" в панели инструментов.
2. Настроить события в инфоблоках, чтобы они чистили кеш при изменении данных.



Но что-то разработчик не знал, что-то поленился делать. И это очень типичная ситуация сегодня.

Проект мы, конечно, вылечили за 30 минут. Стал он летать, железки освободились и стало понятно, что к своим 50 тысячам посетителей они еще спокойно прибавят в два три раза больше трафика и справятся.

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

Решение должно удовлетворять 95% сайтов и не должно требовать программирования от разработчика! А 5% сайтов возможно захотят что-то настроить и перепрограммировать штатный механизм, и такую возможность нужно сохранить.

Ну и самое главное.

Контент редактор должен видеть изменения на сайте СРАЗУ после их выполнения!

Есть, правда, еще один важнейший критерий для реализации. Цена реализации механизма в терминах производительности должна быть крайне незначительной, чтобы отслеживание зависимостей или обновление информации не создавало нагрузку на проект.

Первый модуль, с которого мы решили начать - конечно, инфоблоки.

Много вариантов решения мы перепробовали и обсудили. Часть обсуждений прошла на форуме и в нашей соцсети. Большинство решений не подходили в силу высокой цены реализации. Иногда это становилось ясно уже после реализации и тестов.

Решение пришло, когда мы с Максимом Смирновым обедали smile:)

Как это реализовал Максим, я точно не знаю smile:) Попробую объяснить, как это задумывалось и в чем принцип.

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



Все компоненты написаны на API функциях. Например, для получения данных из инфоблоков мы обращаемся к классу инфоблока и по API через разные методы Get... получаем данные.

Т.е. мы знаем с вами, что на некоторой странице с определенным уникальным URL-ом размещен компонент с именем, например bitrix:news.line, он вызвал API функции определенных инфоблоков и после этого выполнил кеширование информации на уровне компонента.

Мы решили, что этой информации достаточно, если немного подумать smile:), чтобы построить зависимость между данными и местом их представления. Мы автоматически сохраняем необходимую информацию о зависимостях в новый механизм главного модуля - Сache Dependencies.

Теперь вернемся к контент редактору.

Мы точно не знаем где и как будут меняться данные. На публичных страницах, в административном интерфейсе или через импорт-экспорт данных из 1С, или любыми другими методами. Но мы знаем, что для этого будут вызваны методы класса инфоблоков которые выполняют модификацию. Это значит, мы можем обратиться к механизму Сache Dependencies и сообщить ему, что изменились такие-то данные. А механизм Сache Dependencies сам отследит, где на сайте представлены данные, которые используют только что изменившийся контент. И если зависимость есть и данные сохранены, то неактуальные данные будут удалены, и сам компонент обеспечит обновление информации.

Для успешного и быстрого функционирования технологии Сache Dependencies пришлось доработать механизм хранения данных в кеше. В результате доработки технология Сache Dependencies удаляет зависимый кеш мгновенно и не создает нагрузку при поиске зависимой информации на сайте.

Технология Сache Dependencies, как и весь продукт, может хранить кеш как в файлах, так и используя Memcached, APC, eAccelerator. Для этого достаточно просто изменить один из конфигурационных параметров.

Таким образом мы добились поставленной задачи!

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

Как давно я хотел такой механизм smile:)

Да, пока технология автоматически не включена на всех сайтах.
Если вы хотите попробовать, вам необходимо в файле /bitrix/php_interface/dbconn.php вписать строчку:

define('BX_COMP_MANAGED_CACHE', true);

Да, не забудьте обновиться до версии 9.1.

Думаю, что к сентябрю эта технология будет включена по-умолчанию, а в настройках продукта появится еще одна общая кнопка вроде Автокеширования. smile:) Возможно мы решим объединить технологии и создадим Автокеширование 2.0 smile:)

Счастье контент редактора теперь не зависит от квалификации разработчика!

Добавляйте новости и сразу обнаруживайте их там, где они должны были появиться smile:)

Механизм автоматически включается начиная с версии 9.1 главного модуля. Пока Сache Dependencies работает только для инфоблоков. Но мы планируем расширить ее на все контентные модули продукта. Возможно, Максим создаст отдельный API, чтобы разработчики сами могли регистрировать зависимости и отслеживать их, используя технологию Сache Dependencies. Техническое описание технологии вы можете прочитать у Максима в блоге http://dev.1c-bitrix.ru/community/blogs/oracle/2071.php

На днях мы выпустили новый мастер Интернет-магазина и я уверен, что клиенты по настоящему оценят возможности Сache Dependencies. Оценят - в смысле не заметят ее smile:) Это одна из тех скрытых технологий, которая после своего появления становится просто чем-то саморазумеющимся. Мы просто добавляем товары, и они сразу оказываются на сайте. Мы изменяем товар, и он уже тут. Но при этом все кешируется, никаких лишних запросов. Наилучшая производительность.

0
Иван Левый
07.08.2010 14:14:45
Реально нужная вещь! Спасибо.
Ответить Ссылка 0
1
Лебедев Олег
07.08.2010 15:02:02
Мучает вопрос: почему столько лет пришлось ждать_? smile;-)

Теперь бы еще проблеме каммент-спама чутка внимания уделили... (мечтает smile;-)
Ответить Ссылка 1
1
Сергей Рыжиков
07.08.2010 15:18:48
А не все так просто, Олег. К сожалению, никак не удавалось ранее найти решение, которое бы не нагружало систему. Было несколько подходов, но они были сильно ресурсоемкими. Да я и сейчас не знаю, есть ли вообще у кого-то подобные технологические решения. Обычно не получается так универсально сделать.
Ответить Родитель Ссылка 1
0
Лебедев Олег
07.08.2010 15:03:26
А, еще бы фича, о которой ноют контент-редакторы -- предпросмотр для отложенных публикация. То есть, делаем статью, которая должна появиться завтра в три часа, сейчас, чтобы ее предпросмотреть и прочерить что и как, приходится сохранять с текущей датой.
Ответить Ссылка 0
0
Evgeniy Pedan
08.08.2010 11:12:31
как вы себе это представляете ?
Ответить Родитель Ссылка 0
0
Лебедев Олег
14.08.2010 16:49:39
Ммм... Например, как в Drupal: есть галка "не опубликовано" -- и пока "не опубликовано" видит только автор/админ. В "Битриксе" смешаны понятия "активировать элемент" и "опубликовать элемент", отсюда и проблема. Можно конечно играться с документооборотом, но настолько утяжелять систему и процедуры обработки инфы ради одной галки...
Ответить Родитель Ссылка 0
0
Сергей Рыжиков
16.08.2010 11:53:19
Олег, мы как раз работаем над новой версией продукта и особенно в разрезе интерфейсов. Постараемся решить эту проблему.Наш ход рассуждений примерно совпадает.
Ответить Родитель Ссылка 0
0
Сергей Рыжиков
16.08.2010 11:58:43
Олег, мы как раз работаем над новой версией продукта и особенно в разрезе интерфейсов. Постараемся решить эту проблему.Наш ход рассуждений примерно совпадает.
Ответить Родитель Ссылка 0
0
Лебедев Олег
16.08.2010 14:11:56
Но вообще проблема спама намного актуальнее smile8)

(а за кэш депенденси -- горячий респект все же, у нас девушка, которая запихивает кое-что на сайт, тоже счастлива smile;-)
Ответить Родитель Ссылка 0
0
Сергей Рыжиков
16.08.2010 15:02:48
Я рад, и за нее и за нас smile:)

А про какой спам? В блогах и форумах?
Ответить Родитель Ссылка 0
0
Лебедев Олег
16.08.2010 16:03:05
В блогах и форумах. И капча не решает, поскольку спамят школьники-блогунисты за малую копейку. Они, естественно, капчу проходят легко, люди все же, спамят не только в камментах и блогах, но и иной раз группы создают.

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

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

И еще полезно было бы -- возможность в проактивном фильтре задавать списком запрещенные подсети. Хотели тут залить список открытых прокси, откуда самые ушлые спаммеры ходят -- обматерились.

В принципе, в саппорт писал, могу отдельный документ собрать типа "кой бы хотелось видеть защиту от блого-спама".
Ответить Родитель Ссылка 0
0
Мартынов Дмитрий
07.08.2010 15:57:57
Как давно нужно было эту тему разработать. Очень много клиентов очень сильно ругали Битрикс именно за это. Да и нам ужасно не нравилось, постоянно создавать новый уровень доступа для главного модуля, чтобы для редакторов сайта выводить кнопочку "Обновить". Мелочь вроде, но как раз вот такие мелочи - самая ужасная работа.
Ответить Ссылка 0
0
Роман Забродин
07.08.2010 17:56:56
Еще попробуй объясни человеку что такое кэширование..
Круто!
Ответить Родитель Ссылка 0
0
Евгеньев Владимир
08.08.2010 07:46:25
Поддерживаю. Очень не хватало этой доработки. Спасибо, лучше позже, чем никогда.
Ответить Родитель Ссылка 0
0
Сергей
08.08.2010 14:00:20
Дык, так в версии продукта Битрикс NET в админке и вовсе нет включения или выключения Автокеширования, т.е. нет такого пункта настроек, а все настройки автокеширования компонентов в паблике по умолчанию у вас стоят отключенными (тестирую на паркинг.ру и удивляюсь тормозам...).
Ответить Ссылка 0
0
Strokatyy Oleg
09.08.2010 13:25:42
Настройка автокеширования в админ. части есть - в настройке главного модуля.
Ответить Родитель Ссылка 0
0
Юлдашев Руслан
08.08.2010 19:19:19
Спасибо огромное! В последнее время радуете решением старых, приевшихся проблем.

Немного смутило только вот это:
Цитата
Открываю страницу в режиме разработки и включаю отладку. О боже, 980 SQL запросов на главной странице!

Как так, работает же Автокеширование, такого быть не может, если только... да, если только у каждого компонента на главной странице не установлено "НЕ КЕШИРОВАТЬ".

То есть 980 запросов — это в общем-то нормально, нужно только закешировать? Это же кошмар — 980 запросов. Кеш же всё равно по умолчанию раз в час очищается, а значит будет сайт время от времени делать по 200 запросов делать, чтоб какой-нибудь компонент обновить?
Ответить Ссылка 0
0
Долганин Антон
08.08.2010 21:57:39
Цитата
То есть 980 запросов — это в общем-то нормально, нужно только закешировать? Это же кошмар — 980 запросов.

Думал никто не заметит. Тоже поулыбался smile:)
Ответить Родитель Ссылка 0
0
Сергей Рыжиков
08.08.2010 22:41:52
Меня это ужаснуло. Но никто не может указывать разработчику, как программировать и сколько компонентов ставить на странице. Это очень большая страница, общим размером мегабайт под 5, пара десятков компонентов с данными из инфоблоков. Но и это не придел smile:) я видел по 5000 запросов страницы smile:)
Ответить Родитель Ссылка 0
0
Ryzhonin Nikolay
09.08.2010 14:15:55
Я думаю дело не только в разработчике
GetList и Инфоблоки+
Ответить Родитель Ссылка 0
0
Астротенко Роман
12.08.2010 11:21:39
Класс, но мне кажется, вы действительно не решили проблему целиком, а лишь перевели в другое русло. Запросы все равно выполняются. А еще, если такой-претакой сайт, надо задуматься над структурой. Всё гениальное просто, зачем же усложнять?..
Ответить Ссылка 0
0
Сергей Рыжиков
16.08.2010 12:01:26
О чем вы, Роман? это вас не устраивает, а то, что устраивает, спрятано под грифом простой гениальности smile:)
Ответить Родитель Ссылка 0
0
Neyro
20.08.2010 11:47:28
Кеширование реально помогает. Спасибо.
Ответить Ссылка 0
0
Andrew Leshchynskyy
20.08.2010 15:43:09
Подобный механизм для своих разработок мы уже реализовали давно.


Сделали его на событиях.
Есть возможность отслеживать изменения в
- инфоблоках
- форумах
- блогах
Ответить Ссылка 0
0
Месилов Максим
10.09.2010 20:16:52
Отличная пятничная новость. Огромное спасибо разработчикам и всей команде, которая собирала этот апдейт.
Ответить Ссылка 0
1
Засядько Владимир
14.09.2010 04:19:05
Да у нас маркетолог реально все мозги выклевала начальству с просьбой сменить продукт именно иллюстрируя это, типа контент она добавляет, а он не появляется. Да согласен ...Еще попробуй объясни человекам что такое кэширование.. smile:)
Ответить Ссылка 1
0
Василенко Юрий
15.09.2010 09:26:23
Отлично! Все работает просто замечательно.

Но, охота это и в соц.сеть. У нас на главную много из нее выводится. Устали с кешем бороться smile;)

Планируется сделать для соц.сети и в какие сроки?
Ответить Ссылка 0
0
Сергей Рыжиков
15.09.2010 13:23:44
Мы планируем эту технологию использовать во всех модулях продукта.
Уже частично использовали в Корпоративном портале, в списках, в пользователях.
Частично уже и в Соц.сети использовали. Уверен, что в скором времени это будет составная часть всего продукта.
Ответить Родитель Ссылка 0
1
Неверов Евгений
17.09.2010 09:27:26
Всего лишь прицепили теги к кэшам (что, в общем-то, логичная вещь), а преподносится это всё как изобретение, тянущее на нобелевскую.

Если честно, позор, что не сделали раньше.

Если кому нужно будет удалить кэш определенного инфоблока, то:
Код
$GLOBALS['CACHE_MANAGER']->ClearByTag('iblock_id_' . $IBLOCK_ID);

$IBLOCK_ID — ID инфоблока.
Ответить Ссылка 1
1
Сергей Рыжиков
21.09.2010 09:05:25
Ну конечно, Евгений, все это написано на PHP и все логично smile:) Нобелевскую за это не дают, вы правы.

Как большинство разработчиков считаете, что если есть код и концепция, значит найдется умный разработчик, который воспользуется этим с умом. А если не воспользовался - то нобелевскую ему не давать. smile:)

Но в жизни все немного иначе.

Да, теги с кешем - это не новость. Но я не писал вам про теги с кешем, а об этом писал Максим в своем посте. smile:)

Как обычно бывает, было два пути.

Путь первый. Сделать технологию и объяснять разработчикам как этим пользоваться и как переписать свои компоненты так, чтобы они умели чистить кеш. (как делаете вы smile:) )

По этой дороге мы уже ходили. Для 40 тысяч проектов это не просто долгая дорога, а необычайно долгая дорога. Фактически я сегодня знаю, что при активном продвижении новой технологии, через полный год использование технологии на уже работающих проектах не превысит 5%. Почему? Думаю вы сами понимаете, почему разработчики и клиенты не хотят влезать в работающий проект.

Путь два. За счет архитектуры продукта суметь сделать технологическое решение доступным всем клиентам без доработки и программирования.

А мы сделали решение, которое ставится сейчас с обновлением продукта и НА ВСЕХ проектах и на ВСЕХ КОМПОНЕНТАХ и партнеров и наших делает работу удобной и простой. И теперь я знаю, что через год, эта технология будет работать на 95% проектов независимо от квалификации разработчиков сайта и его внимательности к нашим новостям и партнерским конференциям smile:)

А вот за это я уже готов претендовать на Нобелевскую премию, ну или хотя бы Битриксовскую премию smile:)
Ответить Родитель Ссылка 1
0
Суряев Валерий
22.09.2010 13:23:36
Обещанная "беззаботная жизнь разработчика" вылилась в заметное замедление работы сайта, несколько потерянных рабочих часов времени на изучение проблемы и торжественное отключение данной настройки. Поминали выдумщиков этой настройки "добрым" словом.

У нас используется на сайте в боковой колонке список последних обновлённых тем форума (сквозное размещение). Ранее обработчиком легко обновляли эту информацию на всех страницах единовременно - кеш-то был единый. Теперь этой возможности нет, на каждой странице сайта отдельный кеш компонента. Тысячи кешей одного компонента, можете представить себе "рост" производительности, ведь теперь нужно генерировать кеш на каждой странице. Можете также представить себе объём кеша!

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

Жесть, одним словом, Сергей, просто жесть!
Ответить Ссылка 0
0
Сергей Рыжиков
22.09.2010 15:49:50
Валерий, извините, не все варианты реализации сайтов удалось сразу учесть.
Проблему увидели на другом проекте несколькими днями ранее вашего поста. Решение уже в разработке, скоро выпустим.

Сможете включить управляемое кеширование и в вашем случае все будет работать без переделки компонент и не будет описанной проблемы.
Ответить Родитель Ссылка 0
0
Виноградов Вадим
03.10.2010 14:35:12
Цитата
Т.е. мы знаем с вами, что на некоторой странице с определенным уникальным URL-ом размещен компонент с именем

...

этой информации достаточно, если немного подумать smile:), чтобы построить зависимость

В результате изменения структуры компонент переносится на другую страницу, и система ломается... до истечения времени автокеширования. Так?
Ответить Ссылка 0
0
Гришанович Олег
20.10.2010 15:23:42
Приветствую, Сергей!

Не знаю проблема или нет, у меня есть обсуждения с оценками(своя реализация на основании форума, так как стандартная не подошла по ооочень большому списку несоответствий с обычными требованиями) к инфоблоку. Вобщем в итоге "мой" модуль обновляет свойство соответствующего элемента инфоблока, где хранится средняя оценка, вот так:
CIBlockElement::SetPropertyValues($arParams["ELEMENT_ID"], $PRODUCT_IBLOCK_ID, $vote, "ZVOTE");

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

Вопрос вот в чем, должен ли ваш код отрабаывать в данном случае? (при обновлении только лишь свойства готового элемента)

PS: Обновился сегодня до последней версии (Эксперт) и вписал эту волшебную строку:
define('BX_COMP_MANAGED_CACHE', true);
Ответить Ссылка 0

Цикл бесплатных семинаров
Бесплатные семинары по управлению сайтом
Академия 1С-Битрикс: обучение, сертификация, онлайн-курсы