[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