Создание сценария Perl для обнаружения изменений в отдельном модуле конфигурации также в Perl

Добрый день,

У нас есть Perl-скрипт, который обрабатывает запросы геолокации от головных серверов на крупном веб-сайте. Сценарий — это брокер, обеспечивающий дополнительную бизнес-логику, интерпретирующую данные, возвращаемые продуктом COTS, который предоставляет данные для заданного IP-адреса, например. страна, тип подключения, тип маршрутизации, оператор связи и т. д.

Этот сервис Geo в настоящее время обрабатывает пиковые нагрузки около 1000 запросов в секунду на серверной части COTS. Кстати, на самом деле он обслуживает 5000 запросов. из своего выделенного уровня балансировки нагрузки/кеша, который находится непосредственно перед уровнем брокера.

Недавно мне пришлось изменить поведение этого брокера, чтобы разрешить новую категорию подключений, которые, как мы видели, происходят на сайте, что вызывает некоторые проблемы.

Оригинальная версия скрипта, не моя разработка! кстати, был построен с использованием смеси элементов конфигурации в самом скрипте и других элементов в отдельных фрагментах Perl. Как было совершенно справедливо отмечено во время экспертной оценки моих изменений, нам, вероятно, следует перенести все элементы конфигурации в отдельные, а не продолжать использовать смесь встроенных и отдельных элементов конфигурации.

Теперь я хочу пойти дальше и поместить все элементы конфигурации, созданные как отдельные хеши Perl, в один файл конфигурации.

На данный момент нам нужно остановить и перезапустить все приложение, чтобы перезагрузить новые элементы конфигурации, что, учитывая уровни трафика, немного неудобно, даже несмотря на то, что существует четыре экземпляра брокера в двух разных центрах обработки данных, поэтому мы никогда не теряем. сервис.

Я подозреваю, что мне придется прибегнуть к таймеру или, может быть, счетчику запросов и выполнить статистику по рассматриваемому файлу конфигурации. Или, может быть, даже иметь настроенный TTL для файла конфигурации и просто перезагружать его каждые десять минут или около того.

Но есть ли способ заставить Perl автоматически перезагружать более новую версию ранее загруженного файла? Я имею в виду поведение, подобное тому, которое обеспечивает модуль Apache mod_perl.

ваше здоровье,


person Rob Wells    schedule 17.10.2009    source источник


Ответы (5)


Роб, пара моментов:

1) Предпочтительно абстрагировать средство чтения конфигурации в API, а не напрямую читать из хэша Perl. Таким образом, любой вызов этого API может, в свою очередь, решить, что нужно сделать с конфигурацией (например, включен ли таймер? Изменилась ли временная метка файла конфигурации?).

Как всегда, у этого есть дополнительное преимущество, позволяющее позже изменить конфигурацию (perl имеет => xml => база данных) без изменения какого-либо программного обеспечения.

2) Учитывая, что это сервер, я бы также рекомендовал функцию перезагрузки конфигурации по запросу с помощью специального типа запроса. Это позволяет вам принудительно перезагрузить конфигурацию (например, после обновления файлов конфигурации), отправив команду на сервер вместо ее возврата.

Кстати, № 2 очень легко сделать, если вы следуете № 1, поскольку все, что нужно сделать обработчику «перезагрузки конфигурации», — это сбросить флаг «конфигурация должна быть перезагружена при следующем вызове API конфигурации».

3) Если вы настаиваете на том, чтобы конфигурация была хэшем без API (например, по соображениям производительности, чтобы исключить вызовы подпрограмм API, что правдоподобно, но вряд ли сильно поможет), вам нужно поместить конфигурацию в статическую переменную в вашем класс, и пусть этот класс предоставляет метод «установить новую конфигурацию». Затем сервер установит таймер, и при вызове таймера (или при получении команды «перезагрузить конфигурацию» от № 2) проверит, отличается ли отметка времени и/или контрольная сумма файла конфигурации от последнего вызова. и перезагрузить.

person DVK    schedule 17.10.2009
comment
P.S. Я предполагаю, что кто-то может предложить использовать связанные хэши, но у меня есть опасения по поводу производительности хэша, привязанного к файлу, непосредственно заданному вашим масштабом. - person DVK; 17.10.2009

Если вы используете довольно новую версию Linux, всегда есть маршрут inotify. Это означает, что вы можете перезагрузить конфигурацию, как только она будет записана на диск. Ознакомьтесь с Linux-Inotify. Существует также FAM для других платформ.

person Adam Flott    schedule 17.10.2009

Традиционный подход к такого рода проблемам на машинах типа Unix заключается в том, что серверная программа перезагружает свою конфигурацию при получении сигнал. Например, в документации Apache указано, что три сигнала имеют особое значение для сервера. : TERM сообщает серверу о завершении работы, HUP вызывает немедленный перезапуск, а USR1 запрашивает корректную перезагрузку файла конфигурации. Такую функциональность можно относительно просто встроить в вашу программу, при условии, что вы работаете в среде, которая поддерживает сигналы.

person Tim    schedule 17.10.2009
comment
@ Тим, у нас так много ошибок в обработке сигналов Perl, что мы практически отказались от его использования на всем сайте. - person Rob Wells; 17.10.2009
comment
Кстати, для ясности добавлен тег Solaris 10. - person Rob Wells; 17.10.2009

Всегда есть возможность переместить конфигурации в базу данных и использовать DBI плюс триггеры базы данных, чтобы сделать ее управляемой событиями, а не опрашиваемой.

person Community    schedule 17.10.2009
comment
@ Ховард, спасибо за предложение, но сейчас я думаю о том, чтобы сделать бизнес-логику отдельно загружаемым модулем, как это делается с сервером имен балансировки нагрузки lbnamed. - person Rob Wells; 18.10.2009

@DVK, ооо, хороший ответ с вашей точки зрения 1) я не думал о добавлении дополнительного уровня абстракции над конфигурацией. Я предполагаю, что преимущество того, чтобы оставить его в виде необработанных хэшей Perl, заключается в том, что не требуется слой преобразования. Я подумаю о возможных компромиссах.

Что касается пункта 2), мы обнаружили некоторые неточности с обработкой сигналов в Perl, из-за которых он не работал с HUP, поэтому мы официально объявили устаревшие HUP-сигналы Perl для всего сайта.

Но мне очень нравится ваша идея специальной команды поиска, которая вызывает перезагрузку! Я воспользуюсь этим, если вы не возражаете. Возможно, используйте «GET 127.0.0.1», так как это, вероятно, не пройдет извне! Н.Б. Наша последняя версия нашего геопротокола основана на http, поэтому мы можем легко запросить сервис из браузера.

Спасибо! \o/

person Rob Wells    schedule 17.10.2009
comment
Если вы реализуете HTTP самостоятельно, рассмотрите возможность использования совершенно нового метода вместо волшебного GET. то есть RESTART / HTTP/1.1 и, конечно же, как-то аутентифицировать его... - person hobbs; 17.10.2009
comment
@hobbs, спасибо за совет. Я мог бы сделать это, пока мы анализируем входящий запрос. Эти географические rq заблокированы очень жесткими ACL, так что обрабатываются только rq от определенных хостов. Единственная проблема, которую я вижу, связана с будущим, когда мы подумываем о замене брокера Perl выделенным модулем, работающим под Apache. - person Rob Wells; 17.10.2009
comment
# 2, я имел в виду специальную команду (обычно это совершенно новая команда, но, конечно, при необходимости можно использовать некоторое колдовское значение существующей команды). Определенно не имел в виду системный сигнал аля Apache. - person DVK; 17.10.2009