Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > perl очередь запросов mysql


Автор: burakov 19.6.2013, 11:26
Добрый день. 

назрела задача.

есть куча скриптов одинаковых (граберы).
которые должны с разных машин работать с одной базой.

и тут встала проблема очереди.

когда грабер (парсер) забирает задание из таблицы заданий.
он ставит признак "в обработке". и обращение других скриптов -клонов уже это задание не затрагивает.

но как оказалось этого мало.
возникает все таки момент одновременно обращения. к таблице и некоторые задания забираются 2 и более раз.

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

товарищи подсказали решение через блокирование таблиц mysql
LOCK TABLES `tbl` WRITE;
INSERT INTO `tbl` VALUES ...вставляем, изменяем
UNLOCK TABLES;

как то оно мне "не очень" :(.
что будет если одновременно клоны lock делать будут.

и к тому же проверку на LOCK не LOCK
преложили делать через 
SHOW OPEN TABLES

чувствую что то здесь не так.!


Ранее в многопоточных скриптах, применял решение, когда 
один поток работает с базой. и раздает все задания через
use Thread::Queue;
отлично работало.

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

как в этом случае все грамотно сделать?
и попроще smile.


Спасибо.



Автор: Jimy 19.6.2013, 14:56
http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

Автор: burakov 19.6.2013, 16:14
интересует просто личный опыт.
того.
а что будет если одновременно пойдет два таких блокирующих селекта?
Mysql сам разрулит все?. 

то есть к примеру
запрашиваю SELECT ... FOR UPDATE limit 4

всех остальных клонов-скриптов в этот момент эти 4 записи не существует?
это на уровне mysql разруливается?

Автор: Jimy 19.6.2013, 16:41
Личного опыта не имею, т.к. тоже всегда делал чтобы один поток работал с базой.
Да, внутри MySQL все должно разрулиться smile
Но эти блокировки работают только с таблицами InnoDB (в доке об этом написано, но на всякий случай уточняю).
Думаю это самое грамотное решение.




Автор: tishaishii 27.6.2013, 22:15
Думаю, лучше всего, не дублировать работу выбранных средств разработки с помощью других, менее приспособленных.
По-другому, пускай каждый делает свою работу.
Если средство разработки выполняет работу некачественно, то не стоит делать не него ставку и закладывать мину в проект, а выбрать лучший вариант.

Автор: burakov 27.6.2013, 22:39
можете рассказать? как нужно делать?
каким образом и чем организовать эту очередь.?
спасибо.

Автор: tishaishii 29.7.2013, 16:45
Распределять задачи по идентификаторам клиентов.
Например, создать процедуру, которая бы по запросу возвращала задание, предварительно установив метку "в обработке".
И клиенты могут по мере выполнения задания отправлять в центр информацию о статусе.

Автор: dimamaster 16.8.2013, 12:19
Спасибо за консультацию. На северо-западе Москвы находится http://moskva-severozapad.ru/stroginskiy-bulvar-zhivopisnoe-mesto/ , который находится в районе Строгино.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)