Get Mystery Box with random crypto!

Расскажу об небольшой доработке Albireo Framework , позволяюще | maxsite

Расскажу об небольшой доработке Albireo Framework , позволяющем ему работать в режиме очень большого количества http-запросов.

Чтобы было понятно, кратко остановлюсь как работает Albireo.

Когда происходит обращение к сайту, Albireo последовательно выполняет функции, среди которых readPages(). Здесь получаются данные из всех php-файлов страниц.

Она циклично обходит все php-файлы каталога albireo-data и вытягивает из них всю служебную информацию. Формируется массив, который сохраняется в файловом кэше. Таким образом при повторном обращении в реальности данные уже берутся из кэша.

Но с кэшем всегда есть проблема его устаревания. Изменили файл, что-то удалили, добавили, кэш приходит в негодность. Чтобы отслеживать такие изменения используется алгоритм, когда функция кэша сканирует файлы и получает их имена и дату модификации. Формируется «снимок» (snapshot) всего каталога (включая подкаталоги), на основании которого вычисляется полином CRC32 и сохраняется в отдельном малюсеньком файле кэша.

То есть когда произойдёт любое изменение в каталоге albireo-data, кэш сразу же это определит сравнивая новый и старый snapshot. Если они не совпадают, значит что-то изменилось и кэш отмечается невалидным. Он строится заново.

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

Если мы имеем «типовую» посещаемость сайта (до тысячи или десятка тысяч хитов в сутки), то любой сервер даже не пикнет о нагрузке. Но что если посещаемость увеличивается на порядок?

Предположим у нас будет посещаемость в 10 обращений в секунду. Все эти 10 http-запросов в итоге создадут некоторую нагрузку на диск сервера в функции, которая проверяет snapshot'ы. Хотя десяток одновременных запросов к диску не создадут для него сверхвысокой нагрузки, но что если увеличить посещаемость до 100 запросов в секунду? А если 500 или 1000?

Чтобы проверить свои догадки, я смоделировал такую нагрузку и получил, что при 500 запросов в секунду страница может формироваться примерно 17 секунд. Это на моём обычном ноутбуке с обычным HDD. На настоящем сервере, скорее всего, время будет меньше, но сейчас речь идёт об относительных числах.

Главная сложность в том, что дисковые операции достаточно затратная операция для сервера, поэтому даже простое сканирование файлов, требует некоторого времени. Очевидно, что 500 запусков функции (в цикле) создаст существенную нагрузку. Чтобы её снять, нужно сделать так, чтобы формирование «снимка» происходило только в первом обращении, а остальные 499 считали, что snapshot верный и его не нужно проверять.

Именно такую штуку я и реализовал в Albireo Framework. В файле конфигурации можно использовать ключ cacheTimeL1 (время в секундах), например 60. Если к сайту будет много обращений в течение этой минуты, то snapshot кэша будет обновляться не чаще, чем эти же 60 секунд. В теории возможна ситуация, когда данные изменились, но кэш это не определит при условии, что между изменениями прошло менее 60 секунд. Поэтому для таких ситуаций можно уменишить время cacheTimeL1. Эффективным будет даже несколько секунд. Если указать 0, то никаких задержек не будет (сайт будет работать как и раньше). По умолчанию используется 10 секунд.

Насколько это ускоряет работу сайта? Если честно, то я и сам не ожидал такого результата.

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

Если у нас происходят редкие обращения к странице, например раз в минуту, то в обычном режиме время обхода файлов будет от 0.034sec до 0.15sec. Если же это повторное обращение за время cacheTimeL1, то скорость работы увеличивается до 0.001000sec — ускорение в 30-100 раз.

Теперь многократно увеличим кол-во запросов: