feature request: header X-Memcache

Sergey Skvortsov skv at protey.ru
Tue Aug 15 15:53:03 MSD 2006


Feature Request: header X-Memcache

Сценарий 1:
===========

В ответ на запрос, скажем:

GET /uri/to/process?foo=bar HTTP/1.1

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

Далее, backend отвечает nginx'у одними заголовками:

HTTP/1.1 200 OK
X-Memcache-Body: body::/uri/to/process::8de84b4a0f578b53dad84430c82ce443

Было бы неплохо, чтобы можно было передать и набор специфичных для
обработанного URI заголовков (e-tag, expires, etc) - не только в самом
ответе, но и сохранённые в memcached:

X-Memcache-Hdrs: hdrs::/uri/to/process::8de84b4a0f578b53dad84430c82ce443

Данный подход позволяет прозрачно модифицировать текущий код backend'а
(можно даже сделать на backend'е handler в стиле memoize uri). И,
конечно, это несколько снижает потребность в кэшировании средствами
самого nginx'а.

Сценарий 2:
===========

Технически, поскольку memcached умеет хранить expire time, проверку
входного uri можно возложить на nginx:

location /reports {
	memoize	on;

	set $memoize_key "${uri}::${hmac{md5}{secretsalt}{$args}}";

	memoize_body	"body::$memoize_key";
	memoize_headers	"hdrs::$memoize_key";

	memoize_response	on	<5m>;

	memcached_pass	127.0.0.1:4444;

	proxy_pass	...
}

Схема работы, опять же, почти аналогична вышеприведённой - но сначала
nginx сам делает lookup в memcached - и лишь если ключа нет (т.е. либо
его и не было, или уже expired), обращается к backend'ам.

Директива memoize_response могла бы запоминать ответ от backend'а для
данного memcached/missed ключа.

Вышеприведённый пример использует заимствованную из exim функцию
${hmac{<hashname>}{<secret>}{<string>}}, реализация которой в nginx была
бы бесценна сама по себе. (Собственно, хотелось бы импортировать из
exim'а очень много вкусных функций).

Собственно данная схема (в несколько ином виде) уже обсуждалась ранее
(около года назад), но вот сделать явную обработку заголовков
X-Memcache-* (аналогично как это сделано для X-Accel-Redirect) и создать
модуль memoize - было бы просто прекрасно.

Походы X-Memcache и memoize вполне независимы и легко могут применяться
вместе (и независимо реализовываться).

-- 
Sergey Skvortsov
mailto: skv at protey.ru





More information about the nginx-ru mailing list