Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > PHP: Общие вопросы > выполнение алгоритма в определенное время |
Автор: Alix36 10.7.2011, 12:39 |
Предположим есть такая задача. В неком хранилище (Таблица в базе, стэк в кэше) храниться список отложенных задач. Нужно написать к ним обработчик. Вопрос как лучше это сделать. Варианты 1) Хранилище: БД? память? файл? Поскольку задачи могут быть запланированы даже на соседние секунды, то запрос к бд придется делать ежесекундно, что может пагубно сказаться на БД, даже если каждый запрос будет возвращать по 2 строки. С файлом еще хуже, мало того что может сильно обидеться контроллер диска на ежесекундное чтение/добавление, так еще и интерфейс обращение не такой удобный. Выбор однозначно память? или все таки вариант с БД имеет право на жизнь? 2) "Выполнятор": Cron, демон Насколько плох ежесекундный вызов cron'ом какого-либо скрипта? Хотя плюсы демона мне тоже не очевидны. Как стоит реализовывать демона, выполняющего отложенные таски? Как вечный цикл, проверяющий "просроченные" таски? тогда обращение к хранилищу будет чаще чем ежесекундно... Даст ли реализация с демоном какие-либо преимущества? или все же демоны хороши исключительно для отлова входящих "сигналов"(пакетов, сообщений) |
Автор: ivashka 10.7.2011, 12:51 |
Как по мне то однозначно БД только таблица MEMORY (если нужно что бы надежность была выше, задания хранятся в обычной таблице, а при старте скрипта копируем в таблицу мемори). В таком случае будет и интерфес удобный, и скорость норм, и хард дольше и лучше жить. На счет реализации, то как я понимаю будет пхп, тогда вариант с демоном. Логика следующая, запускается демон, смотрит есть ли задачи к выполнению, если есть, передает берет задачу, форкается и форк исполняет задание, главный процесс смотрит дальше есть ли задачи. Такой вариат у меня работает без перерыва уже 9 месяц. |
Автор: ivashka 11.7.2011, 11:36 |
По поводу второй таблицы: если у вас сервер упадет, все данные с мемори удалятся, соответственно и выходит 2 таблицы. Одна допустим innoDB вторая Memory. Выгребать все таски не знаю стоит ли, дело в том, что в таком случае вы не сможете добавить заданий во время работы. Лучше выгребать хотябы по 5, или другое количество, но не всю, хотя вариант, выгребать все, проходится, слипнуться, выгребать все и т.д. вполне вменяем. А зачем вторичный процес держать вечно, лучше форкать, одно задание одному ребенку. |
Автор: solenko 11.7.2011, 13:05 |
Это задачи, которые нужно выполнять "как только получится", или "строго по расписанию"? Если как только получится -- http://www.amqp.org |
Автор: Alix36 12.7.2011, 16:32 | ||||
Я имел ввиду, что если у нас появляется inno-таблица то теряется смысл memory-таблицы. Зачем дублировать информацию, если и так уже храним в стабильной таблице.
как только задача "просрочилась") В любом случае вопрос именно в решении на php, а не в отдельном демоне. |
Автор: baldina 12.7.2011, 16:50 | ||
почему? просто интересно в принципе неплох. cron как таковой очень мало нагружает систему. и уж по крайней мере не надо думать о "тредах и слипах" cron+БД+скрипт на любом языке позволят решить задачу быстро. если упрется в эффективность, тогда рассматривать другие варианты такое решение позволяет провести быстрое прототипирование, сосредоточиться на главном. а что известно про задачи и их количество? скажем, если задач немного, но они ёмкие, механизм вызова не влияет на загрузку, и наоборот про БД думаю беспокоиться не стоит, её для того и придумали, штоб работала. ежесекундный запрос для базы, возвращающий 2 короткие записи - сущий пустяк. к тому же в таком режиме оно вероятно в кэше поселится. |
Автор: Alix36 12.7.2011, 18:55 | ||
форкать все равно нужно будет, если будут массивные задачи. и по несколько в секунду, их нужно разносить на форки. или каждую секунду выбирать по 1 таску, тогда получим накопление очереди, точнее можем получить вопрос просто в основном теоретический. Просто ради того, что-бы узнать что можно, что нельзя и что лучше. |
Автор: srt 12.7.2011, 18:59 |
Alix36, как тебе удобно, так и сделай крон или крен - пофик |
Автор: baldina 12.7.2011, 19:03 |
форкать в баше попроще чем в php ;-) |
Автор: srt 12.7.2011, 19:11 |
отложенные задачи - отложенные задачи реализовать либо по времени либо по событию ну дык |