[Moscow.pm] Динамические возможности Perl :: помощь коллективного разума

Mons Anderson mons на cpan.org
Вт Май 4 02:58:41 PDT 2010


On Sunday 02 May 2010 15:55:02 Андрей П. Ковбович wrote:
> в приложении, работающем в режиме 24х7, есть группа объектов, которые
> занимаются какими-то своими делами, взаимодействуют друг с другом. С
> выходом новой версии приложения настала пора обновить часть классов
> (скажем обновить парочку методов, добавить несколько свойств в классе
> и в его экземплярах, поправить баги). Как это сделать в работающей
> системе?

Я когда-то делал обновление пакета на лету так:

пакет "бэкапится" (указатель на таблицу символов)
удаляем запись в %INC.
пробуем сделать requre;
если получилось - удаляем бэкап.
если не получилось, очищаем неймспейс и возвращаем бэкап.

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

Сейчас я использую в постепенный апгрейд, как это делается, например, в nginx. 
(замещение новыми процессами старых).
Кстати такой механизм работы также помогает "держать память в узде" в 
окружениях с непредсказуемыми объемами данных (напр. я качаю xml'ки и парсю 
их. они могут быть от 1к до 100м. после обработки 100м я "скушаю" кучу 
памяти, но она мне больше не будет нужна до следующей 100м xml'ки, которая 
будет, например через день. Соотв. процесс по достижении vsize > limit может 
мягко заапгрейдиться, не прерывая работу системы).


-- 
Mons Anderson aka Vladimir Perepelitsa
<mons на cpan.org> / #99779956 / quanth на irc.freenode.net


Подробная информация о списке рассылки Moscow-pm