У меня есть таблица баз данных с ~ 50 тыс. Строк в ней, каждая строка представляет задание, которое необходимо выполнить. У меня есть программа, которая извлекает задание из БД, выполняет задание и возвращает результат в дБ. (эта система работает прямо сейчас)Лучший способ использовать таблицу БД в качестве очереди сообщений/заданий
Теперь я хочу разрешить нескольким задачам обработки выполнять задания, но не забудьте, что никакая задача не выполняется дважды (поскольку проблема с производительностью не в том, что это вызовет другие проблемы). Поскольку доступ путем в sproce, мой нынешний, хотя это заменить сказал sproce с чем-то, что выглядит как этот
update tbl set owner=connection_id() where avalable and owner is null limit 1;
select stuff from tbl where owner = connection_id();
BTW; Задачи работника могут отбросить связь между получением задания и представлением результатов. Кроме того, я не ожидаю, что БД даже приблизится к тому, чтобы быть шеей бутылки, если я не испортил эту часть (~ 5 рабочих мест в минуту)
Есть ли проблемы с этим? Есть лучший способ сделать это?
Замечание: "Database as an IPC anti-pattern" здесь только немного, потому что 1) Я не делаю IPC (нет процесса, генерирующего строки, все они уже существуют прямо сейчас) и 2) основная проблема, описанная для этого анти-шаблона заключается в том, что он приводит к ненужной нагрузке на БД, поскольку процессы ожидают сообщений (в моем случае, если нет сообщений, все может завершаться, когда все делается)
Правый - плохой = синхронный IPC с блокировкой на dbms SELECT как прочитанный. Вы, по-видимому, делаете это как стратегию введения асинхронности. – dkretz 2008-11-18 00:21:59
BTW, если вы хотите поместить читателя (ы) на таймер, полезно, чтобы они проверяли нечасто, но если они находят работу, они могут слить очередь перед сном снова. – dkretz 2008-11-18 00:23:31
Обратите внимание на мое редактирование: если они не найдут никакой работы, они никогда не найдут работу. Но если это не так ... – BCS 2008-11-18 00:26:23