ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

feature request: header X-Memcache


  • To: nginx-ru@xxxxxxxxx
  • Subject: feature request: header X-Memcache
  • From: Sergey Skvortsov <skv@xxxxxxxxx>
  • Date: Tue, 15 Aug 2006 15:53:03 +0400
  • Domainkey-signature: a=rsa-sha1; q=dns; c=simple; s=y2006; d=protey.ru; h=Received:Message-ID:Date:From:MIME-Version:To:Subject:Content-Type:Content-Transfer-Encoding; b=sUuecUNVm/aBDfOu1wIEd3b+EyRO9aiHg9xkXa2Ci8IEIMcqwk5/QbFl5JjpvjW0w9rIKU4MfYlCdTiTLw+RP5lAAEZi2tFCFCUxeJQ21+4uKjxWnRRCPvOfo2qAapDw;

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@xxxxxxxxx



 




Copyright © Lexa Software, 1996-2009.