memcached integration idea + other ideas
Sergey Pofiriev
parf at comfi.com
Mon Oct 9 19:50:16 MSD 2006
Комментарий к оригинальной статье "memcached integration idea + other ideas"
Я забыл упомянуть важный факт:
рассматривалась схема когда
nginx стоит на dedicated машине и используется как proxy_pass & load
balancing
сам сайт имеет ~1M hits / day
вынос статики помог разгузить главные машины.
2. Static Auto Caching
Сейчас делаем sync статики через rsync -
но это неудобно и могут возникать моменты что ссылка есть а image еще не
готовы.
Предлагаемая схема кеширования статики полностью убирает всю эту
головную боль.
Более того - такую конфигурацию можно ставить для ускорения любого сайта
не меняя при этом никаких его настроек.
** еще возможный вариант использования -
географическое зеркало - accelerated зеркала US сайта в EU, Asia
3. Dynamic Data Caching.
>> Cache files according to X-cache header
>>
>> Example:
>> header("X-cache: $timeout"); // cache url call for given timeout
>> закешировать результат на $timeout sec в ключе F(URL, PARAMS)
>>
A1.
">" - comments from sjsoft
> Да и динамика судя по всему будет кэшироваться, очень странным
> образом. Как бы скрипт не будет отвечать за
> достоверность кэша вообще.
Мы говорим о memcached - а не просто memcache
Если надо обновить данные до завершения timeout (когда они сами обновятся)
достаточно просто удалить/обновить ключ в cache
A2.
> Ведь, даже если скрипт вызыван с теми же параметрами,
> он может делать запросы из базы, в которой чтолибо уже изменено. А так
> кэш будет упорно показывать старые данные.
Кеш для этого и делается чтобы лишний раз не нагружать backend
см(#A1)
Например меня вполне устроит дискретность в 1-5 минут для обновления многих страниц.
(для некоторых устоит и часовая дискретность)
>> 5. Redirect to "hash key"
>> When page returns X-redirect-cache header:
>> Return page stored in memcached key (key = value of
>>
>> "X-redirect-cache" header)
>> OR (if no page found)
>> Internal redirect to $no_key_url and return content to caller
>> in case of redirect server should pass "key" to $no_key_url ( as
>> a header or as a GET field )
достаточно необходимая функция
1. позволяет на backend разбирать что и как кешировать
самому выбирать F( URL, PARAMS, whatever )
2. позволяет на backend контролировать когда cache должен обновляться
те тот вопрос что ты спрашивал в #3
3. позволяет убрать дублирующиеся данные.
самый простой пример - www.sitename.com == sitename.com
> Если бы тока эти пункты выполнялись, было бы вообще
> зачем что либопеределывать в nginx.:
> 1) Если memcached хранит весь свой кэш в памяти и работает с ним
> существенно быстрее чем с рам-диском.
- также + см load balancing config
> 2) Если в memcached будет всегда актуальная информация
> лежать а не устаревшая и актуальность ее будет проверена
> скриптом, как в пункте 5 по хэшу.
неактуальные ключи можно всегда удалить
+ см выше
> 3) Если бы в каждом новом коде не появлялись бы
> уязвимости и баги, да не добавлялось бы тормозов. тобишь, при компиляции
> можно было бы отрезать этот модуль кому он не нужен.
уже сейчас в ngnix есть memcached support implemented as a module (see source code)
тч гемморой [ :) ] может быть только для желающих
PS: дополнительные плюсы
1. упрощение администритования nginx server
- весь контроль делается на backend
разворачивание сервера будет очень простым -
прописал memcached server(или установил на этот же сервер)
сделал config - и готово
2. Network Computing
доп сервера могут генерировать разный content и класть его в memcache
3. простота построения M-M solutions
Many Servers <-> Many Nginxs
тк не надо думать об актуальности filesystem data.
PPS: для совсем хорошего решения хотелось бы еще иметь template engine
TEMPLATE= CACHE_KEY.get_data || URL.get_data
// template can have references to other memory keys|url
output = PROCESS_TEMPLATE( TEMPLATE, SUBSTITUTIONS )
SUBSTITUTIONS - key => value hash
Example:
%key% - SUBSTITUTIONS["key"]
%%key|url% - KEY.memcached_data || URL.get_data
%/url% - subrequest to url ( URL.get_data )
example:
<html>
...
%%banners|/banner%%
...
Hello %name%, today is %date%
<h1>News</h1>
%%fp-news|/update_news%
...
</html>
+ logic:
%?key{% key defined %}%
%!key{% key undefined %}%
%?key=value{% key=%key% %}%
+ html escaping ( avoid/protect site from CSS )
My name is %key.e% // escape
<a href="%key.q%"> // quote escape
<a href="xxx?url=%key.urle%"> // urlencode
<textarea>%key.ta%</textarea>
%key!% // - smart - должен сам из template догадаться
Substitutions backend может возвращать как:
k:value
k2:multiline
multiline // subsequent lines have 1 space identation
multiline
k3:gfdgdfsdf
у нас есть *project specific* реализации такой схемы - очень удобно
appserver <-> template server <-> [nginx] <-> customers
причем templates храняться на appserver(memcached) - template server довольно простая и тупая штука
More information about the nginx-ru
mailing list