Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: ближайший mirror
Письмо получено от drmarker.
Датируется 4 февраля 2007 г., 14:19:49.
> Думаю над алгоритмом поиска "ближайшего к клиенту зеркала". Типа
> пришел клиент, сделал запрос, ему отдается 302 на сервер, который к
> нему ближе всего.
> Есть идеи? Как бы делали вы?
В nginx есть поддержка Perl для обработки запросов.
Скрипт должен делать примерно такое:
1. Взять адрес клиента из $remote_addr
2. Адрес преобразуется в подсеть, к примеру, /8.
3. В пинг-кэше ищется нужная подсеть.
4. Если подсеть найдена - редирект на указанный там адрес.
5. Если нет - даем всем зеркалам сигнал определить пинг до клиента и
вернуть результат.
6. Результаты пишем в пинг-кэш.
Пинг-кэш может быть csv файликом или даже таблицой в базе (что имхо
неплохой вариант), примерно такой структуры:
client_subnet VARCHAR(23) (с рассчетом на ipv6)
server_ip VARCHAR(23)
ping INT
updated TIMESTAMP
Соответственно, client_subnet - подсеть клиентов,
server_ip - адрес зеркала,
ping - собственно, время пинга в мсек,
updated - последнее обновление записи. Имеет смысл кроме есть/нет в
базе еще проверять насколько стары данные.
Только нужно учесть самое главное. Некоторые юзеры сидят за NAT,
параноидальным файрволом и т.п. помехами пингу. Поэтому гарантировать
вычисление корректного времени пинга хотя бы до 70% клиентов
невозможно.
В принципе, можно скормить клиенту ява-скрипт, который два раза
запросит у сервера однозначно отличающийся запрос, например,
empty_gif, один за одним.
Время пинга в этом случае будет пропорционально интервалу между
полученными запросами. Соответственно, нужен будет второй скрипт,
который будет замерять время между запросами.
--
С уважением,
Шепелев Сергей Александрович.
ICQ: 145-542-767
|