|
|
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
oracle 12.1 есть таблица-очередь заявок на обслуживание вида Код: plsql 1. 2. 3. 4. в эту таблицу одни процессы добавляют строки со статусом Новая, другие процессы (демоны разбора очереди, больше одного, способ реализации - Informatica или Java) должны: - захватывать одну заявку в статусе Новая по сортировке FIFO - менять ее статус на Обработка - производить некую работу - менять статус на Завершена вопрос: как правильно работать с таблицей очереди из демонов разбора очереди - так, чтобы два и более одновременно работающих демона не смогли ухватиться за одну и ту же заявку? думаем в сторону select for update (nowait?) - есть ли опыт/пример/подводные камни? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 14:58 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12- менять ее статус на Обработкачтобы потом маяться с определением потерянных записей и обрабатывать с пропуском очередности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 15:03 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12думаем в сторону select for update (nowait?) - есть ли опыт/пример/подводные камни?skip locked ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 15:06 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12вопрос: как правильно работать с таблицей очереди из демонов разбора очереди - так, чтобы два и более одновременно работающих демона не смогли ухватиться за одну и ту же заявку? DBMS_LOCK Alexus12думаем в сторону select for update Бросьте. "Тут рыбы нет." Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 15:08 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
ElicAlexus12думаем в сторону select for update (nowait?) - есть ли опыт/пример/подводные камни?skip locked С обязательным построчным фетчем курсора унутре "демона" и фиксацией транзакции по факту обновления статуса (row-by-row). ...следует обратить внимание на prefetch, который в этой модели может попортить крови при неаккуратном обращении :) Кроме того, в табличке заданий весьма желательно помимо статуса иметь атрибуты с датой (или таймстэмпом) его (статуса) изменения, а также - неким идентификатором обработчика (должен позволять однозначно найти хост и конкретный процесс ОС) на предмет отлова "зависших" заявок и самопомерших/цинично пришибленных "демонов". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 17:10 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov"Тут рыбы нет." Есть. Но надо правильно готовить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 17:10 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousКроме того, в табличке заданий весьма желательно помимо статуса иметь атрибуты с датой (или таймстэмпом) его (статуса) изменения, а также - неким идентификатором обработчика (должен позволять однозначно найти хост и конкретный процесс ОС) на предмет отлова "зависших" заявок и самопомерших/цинично пришибленных "демонов". нафига? помер - откатится , завис - вычислится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 17:59 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАнафига? помер - откатится , завис - вычислится Если обработка занимает время, то промежуточный(ные) статус(ы) "in progress" требуется для мониторинга. А при введении таких статусов требуется решать проблему нештатно отвалившихся обработчиков ("зависших" заданий). Отдельный сценарий - обработка на сервере приложений (возможно, кластеризованном) с пулом (пулами) коннектов, когда нельзя долго удерживать сессию БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 18:40 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousЕсли обработка занимает время, то промежуточный(ные) статус(ы) "in progress" требуется для мониторинга. инсерт-делит в автономке на небольшой таблице мониторинга дешевле, чем дополнительные поля и индекс на основной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 19:19 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousDВАнафига? помер - откатится , завис - вычислится Если обработка занимает время, то промежуточный(ные) статус(ы) "in progress" требуется для мониторинга. А при введении таких статусов требуется решать проблему нештатно отвалившихся обработчиков ("зависших" заданий). Отдельный сценарий - обработка на сервере приложений (возможно, кластеризованном) с пулом (пулами) коннектов, когда нельзя долго удерживать сессию БД. проблема нештатно отвалившихся обработчиков решается выборкой со skip locked не обращающей внимания на статус "in progress" ) Потому что если оно реально "in progress", то запись заблокирована обработчиком и будет пропущена, если "in progress" - наследие умершего обработчика, то возьмется снова в обработку и снова станет актуальным "in progress" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 19:34 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАесли оно реально "in progress", то запись заблокирована обработчиком и будет пропущена Это хорошо в предположении, что обработка занимает меньше суток. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 20:08 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDВАесли оно реально "in progress", то запись заблокирована обработчиком и будет пропущена Это хорошо в предположении, что обработка занимает меньше суток. то, что занимает больше суток, в очередь как правило не выносят ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 20:14 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАесли оно реально "in progress", то запись заблокирована обработчиком и будет пропущенаИ пока один проверяет in progress, другие проверяльщики и обработчики полагают отсутсвие очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2018, 21:17 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
[quot DВА]andrey_anonymousзапись заблокирована обработчиком 1. установка статуса предполагает фиксацию транзакции, т.е. обработчик должен будет блокировать строчку дважды, что усложняет логику и требует разрешения коллизий на втором раунде блокировки 2. не всякий обработчик может позволить себе удерживать сессию БД в процессе работы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 10:24 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
-2-инсерт-делит в автономке на небольшой таблице мониторинга дешевле, чем дополнительные поля и индекс на основной. it depends... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 10:25 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
спасибо всем ответившим! дополнения: авторС обязательным построчным фетчем курсора унутре "демона" и фиксацией транзакции по факту обновления статуса (row-by-row). предполагается, что каждый демон разбора очереди а) получает (через select for update) всего одну строку по порядку сортировки FIFO, меняет ей статус на Обработка и комитит, после чего запускает некий внешний обработчик с ИД этой заявки Затем происходит обработка, и обработчик последним своим писком делает апдейт статуса заявки на Завершена. Т.о.: - время лока строки заявки демоном - минимальное - демон не должен лочить больше одной строки за раз вижу на других форумах важное замечание: автор важное отличие для работы с курсорами - курсор с for update залочит все строки попадающие под условие курсора сразу при open, а если добавить skip locked, то только те строки будут залочены, которые были действительно считаны в fetch, что позволяет: ограничить коллличество залоченых строк, или возвращать открытый курсор как результат функции с ещё не залочеными строками. вопрос: как правильно в нашем случае отобрать и залочить всего одну строку, чтобы такого не происходило? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 12:42 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Если хорошо подумать, то условие "всего одну строку" в подобных задачах в большинстве случаев оказывается ничем не обосновано кроме "общих соображений" )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 13:50 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12меняет ей статус на Обработка и комититНе увидел ответа на вопрос о смысле бытия. Alexus12автор...курсор с for update залочит все строки попадающие под условие курсора сразу при open, а если добавить skip locked, то только те строки будут залочены, которые были действительно считаны в fetch...... чтобы такого не происходило?Не происходило блокировки строк for update при выполнении open и for update skip locked при выполнении fetch? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:04 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12как правильно в нашем случае отобрать и залочить всего одну строку, чтобы такого не происходило? 1. Объявляем курсор select for update skip locked 2. Парсим, выполняем (PL/SQL: open). 3. Делаем 1 (ОДИН) фетч 4. закрываем курсор, работаем с полученной строкой ...PL/SQL: можно for-loop с безусловным exit в первой же итерации Ахтунг1: никаких "rownum=1" и т.п. в запросе "skip locked" быть не должно Ахтунг2: драйвер БД может использовать различные prefetch, когда вызов fetch на стороне клиента ведет к тому, что на сервере будет вычитано (и залочено), скажем, 5 или 10 строк. Поэтому для реализации подобного механизма всякие префетчи лучше отключать (driver specific). Как-то так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:26 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАЕсли хорошо подумать, то условие "всего одну строку" в подобных задачах в большинстве случаев оказывается ничем не обосновано кроме "общих соображений" )) Ээээ... Нат, пусть у тебя в очереди 10 заданий. И 5 обработчиков. Первый дернул for update и заблокировал все 10 заданий. Модель с удержанием сессии: Остальным не досталось (т.е. по факту не более одного активного обработчика в один момент времени). Модель с коммитом: Остальные крутят холостые циклы пока первый не зафиксирует транзакцию (ненужная сериализация и избыточный поллинг). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:32 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, как сделать, чтобы первый схватил 1 строку - и остальным тоже досталось по строке? демон в общем случае - процедура на pl/sql, т.е. никаких лишних прослоек между ним и базой нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:37 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12andrey_anonymous, как сделать, чтобы первый схватил 1 строку - и остальным тоже досталось по строке? демон в общем случае - процедура на pl/sql, т.е. никаких лишних прослоек между ним и базой нет Чукча не читатель? 21679573 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 14:41 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousDВАЕсли хорошо подумать, то условие "всего одну строку" в подобных задачах в большинстве случаев оказывается ничем не обосновано кроме "общих соображений" )) Ээээ... Нат, пусть у тебя в очереди 10 заданий. И 5 обработчиков. Первый дернул for update и заблокировал все 10 заданий. Модель с удержанием сессии: Остальным не досталось (т.е. по факту не более одного активного обработчика в один момент времени). Модель с коммитом: Остальные крутят холостые циклы пока первый не зафиксирует транзакцию (ненужная сериализация и избыточный поллинг). Почему холостые? У меня очередь, которая постоянно пополняется и количество обработчиков подогнанное к числу минимально необходимых, для того, что бы количество записей в этой очереди было нулевым. Первый дернул все что есть на момент его запроса из очереди и в обработку, второй и остальные то, что добавилось позже, если кому-то не достается и это происходит часто, значит у меня обработчиков сильно дохрена и их нужно сократить. А вот за обработку по одной записи да еще в порядке очереди - поубивала бы ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:12 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАПервый дернул все что есть на момент его запроса из очереди и в обработкуНе часто можно свести обработку к bulk операциям. А в oltp-системах это часто и вредно, так как увеличивается время удержания блокировки на ключевые данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:21 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВА... А вот за обработку ... да еще в порядке очереди - поубивала бы ) Ничего, что могут быть такие задачи, события в которых обязаны обрабатываться именно в порядке их текущего расположения, с приоритетом, назначенным им в очереди? А вот параллелятся ли они вообще, и, если да, то как именно - это уже другой вопрос. И, имхо, не так много шансов, что skip locked проявится в ответе на него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:24 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАА вот за обработку по одной записи да еще в порядке очереди - поубивала бы )А в очередях с синхронным ответом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:26 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
-2-DВАПервый дернул все что есть на момент его запроса из очереди и в обработкуНе часто можно свести обработку к bulk операциям. А в oltp-системах это часто и вредно, так как увеличивается время удержания блокировки на ключевые данные. вот кстати ни разу не видела в oltp-системах по-одиночной обработки записей очереди )) ну в лучшем случае с каким-то разумным ограничением по количеству записей, да и то скорее для оперативного разгребания ситуаций с непредвиденными "скоплениями", чем для минимизации времени блокировок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:30 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
boobyНичего, что могут быть такие задачи, события в которых обязаны обрабатываться именно в порядке их текущего расположения, с приоритетом, назначенным им в очереди? ElicА в очередях с синхронным ответом? Усе может быть, но в исходном посте простейшая задачка с одним условием - не пересекаться процессам обработки, чего накручивать-то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:38 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
boobyНичего, что могут быть такие задачи, события в которых обязаны обрабатываться именно в порядке их текущего расположения, с приоритетом, назначенным им в очереди? И кстати порядок обработки событий независимо от их приоритетов определяется временем завершения обработки, а не ее начала а тут уже как бог на душу положит )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:43 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАПервый дернул все что есть на момент его запроса из очереди и в обработку, второй и остальные то, что добавилось позже, если кому-то не достается и это происходит часто, значит у меня обработчиков сильно дохрена и их нужно сократить. А вот за обработку по одной записи да еще в порядке очереди - поубивала бы ) Сценарий: обработка очереди поднимается после технологического перерыва. В очереди 100500 сообщений. Одно сообщение обрабатывается, для простоты, 1 минуту и обработка утилизирует, к примеру, условные 5% ресурсов сервера. Расскажи, сколько времени будет разбираться очередь в твоем подходе и почему нельзя использовать 95% простаивающих ресурсов для сокращения этого времени. Сценарий слегка (именно что слегка) утрирован, но аналогичные эффекты имеют место и в установившемся режиме. ...и пожалуйста, не путай процессы раздачи работы по обработчикам с, собственно, обработкой данных (это про bulk-подходы к обработке очереди - они, безусловно, возможны, но НЕ ТАК как ты описываешь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:51 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousСценарий: обработка очереди поднимается после технологического перерыва. В очереди 100500 сообщений. Одно сообщение обрабатывается, для простоты, 1 минуту и обработка утилизирует, к примеру, условные 5% ресурсов сервера. Расскажи, сколько времени будет разбираться очередь в твоем подходе и почему нельзя использовать 95% простаивающих ресурсов для сокращения этого времени. Сценарий слегка (именно что слегка) утрирован, но аналогичные эффекты имеют место и в установившемся режиме. ...и пожалуйста, не путай процессы раздачи работы по обработчикам с, собственно, обработкой данных (это про bulk-подходы к обработке очереди - они, безусловно, возможны, но НЕ ТАК как ты описываешь). DВАну в лучшем случае с каким-то разумным ограничением по количеству записей, да и то скорее для оперативного разгребания ситуаций с непредвиденными "скоплениями", чем для минимизации времени блокировок пока ты писал я уже ответила ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:53 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВА пока ты писал я уже ответила ) Механизм ограничения "разумного количества" каков? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 15:59 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousDВА пока ты писал я уже ответила ) Механизм ограничения "разумного количества" каков? ну чукча не писатель, чукча разгребатель чужих очередей ))) готового алгоритма на руках не имею ) поэтому чисто из общих соображений - суммарное время обработки "разумного колличества" <= максимально допустимое время обработки одной записи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 16:05 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВА... порядок обработки событий независимо от их приоритетов определяется временем завершения обработки, а не ее начала а тут уже как бог на душу положит )) порядок здесь ключевое слово. В разных контекстах определяемое по разному. Нельзя одним алгоритмом определить все необходимые людям порядки разом по причине непредсказуемой сложности требуемого в конкретном случае алгоритма определения предшествования. Порядок взятия в обработку "событий" и порядок, к котором завершается обработка - это разные порядки, востребованные в разных задачах. Если возникает "производственный процесс", в котором выход одного "обработчика событий" является входом для другого, то его планирование, да еще с примешиванием параллелизма, превращается в самостоятельную задачу согласования этих порядков с целью определения общей топологии, пригодной к распараллеливанию. И еще о порядке. Конечно, вопрос о том "кого убивать" можно решать и до формулировки задачи, вооружившись знаниями Прокруста о правильности роста или размере фетча. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 16:09 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
boobyпорядок здесь ключевое слово. В разных контекстах определяемое по разному. Нельзя одним алгоритмом определить все необходимые людям порядки разом по причине непредсказуемой сложности требуемого в конкретном случае алгоритма определения предшествования. Порядок взятия в обработку "событий" и порядок, к котором завершается обработка - это разные порядки, востребованные в разных задачах. Если возникает "производственный процесс", в котором выход одного "обработчика событий" является входом для другого, то его планирование, да еще с примешиванием параллелизма, превращается в самостоятельную задачу согласования этих порядков с целью определения общей топологии, пригодной к распараллеливанию. И еще о порядке. Конечно, вопрос о том "кого убивать" можно решать и до формулировки задачи, вооружившись знаниями Прокруста о правильности роста или размере фетча. а можно я вашими же словами прокоменчу ? ) boobyИ, имхо, не так много шансов, что skip locked проявится в ответе на него. Я тут вроде бы докопалась конкретно до алгоритма, предложенного Андреем, с его одиночным фетчем и со своими подозрениями, что это уж слишком :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 16:18 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВА... Я тут вроде бы докопалась конкретно до алгоритма, предложенного Андреем, с его одиночным фетчем и со своими подозрениями, что это уж слишком :) Ок. А я о том, что мамы разные нужны, мамы всякие важны. Этот алгоритм имеет право на существование в определенных контекстах. Уже хотя бы потому, что алгоритм планирования согласованной выборки множеством читателей с одной панели событий уже вшит в него неявным образом, благодаря skip locked. Это волшебство практически - всего лишь сказал skip locked, а планировщик чтения готов. Я бы не прикапывался к алгоритму, в определенных обстоятельствах, несомненно уместному. :) Точно это те, где он самый уместный или в конкретном случае могут быть варианты - это должно быть виднее топикстартеру, хочется верить, человеку разумному. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 16:31 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАУ меня очередь, которая постоянно пополняется и количество обработчиков подогнанное к числу минимально необходимых, для того, что бы количество записей в этой очереди было нулевым. А, извините, зачем тут тогда очередь? Будет гораздо проще вместо добавления в неё сразу стартовать обработчик. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 16:56 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
boobyвыход одного "обработчика событий" является входом для другого Небольшое примечание: именно этот вопрос на базе очередей (в более общем случае - просто messaging) обычно решается одним из двух способов: - в рамках модели publish-subscribe - отдельными "топиками" для различных операций, когда обработчик-"предшественник" по результатам своей деятельности размещает новое сообщение но уже в более другом "топике", на который подписан обработчик-"последователь". - в рамках модели точка-точка - "предшественник" отправляет приватное сообщение непосредственно "последователю", топология коммуникаций в этом случае может задаваться метамоделью. Есть комбинированные решения, когда обработчики "договариваются" в рамках publish-subscribe, а общаются уже в модели "точка-точка" - к примеру, такой забавный распределенный messaging как tibco rendezvous использует этот метод для возврата итогового ответа по цепочке обработчиков к отправителю. Но это уже совсем "высокие материи", ТС же просил просто равномерно раскидать однородную неприоретизированную работу по ресурсам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 17:04 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
DВАсо своими подозрениями, что это уж слишком :) Если у тебя в очереди миллионы сообщений и она реально требует крупноблочной обработки - то мое первое подозрение будет заключаться в том, что архитектор... ммм... несколько поторопился с выбором очереди как метода ipc либо не очень хорошо продумал содержимое сообщений. Но это - лишь мои подозрения , которые я ни в коем случае не намерен тебе навязывать ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 17:10 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous... ТС же просил просто равномерно раскидать однородную неприоретизированную работу по ресурсам. Вот. И DBA косвенно склоняла к чему-то, логически эквивалентному DBMS_PARALLEL_EXECUTE Что выглядит и даже работает замечательно, пригодно к наколенной-костыльной реализации имени себя любимого, не противоречит bulk collect, но требует вооружённого взгляда на очередь, по количеству звёздочек поднятых обработчиков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 17:13 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
boobyно требует вооружённого взгляда на очередь Эт точно :) Как вариант - возможно, но в реализации минимально необходимой обвязки (обработка "зависаний", динамическое изменение количества активных обработчиков (в зависимости от нагрузки и/или замена нештатно выбывших), обработка ошибок, мониторинг и т.д.) несколько сложнее, чем уже озвученный подход при не вполне очевидных преимуществах. ...это при том, что готовых решений на рынке вагон плюс маленькая тележка имени AQ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 17:22 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, вот если таки причитаться к авторТС же просил просто равномерно..., то окажется, что в разборщиках там Java и Informatica заявлены. Поделить и властвовать - здесь упирается в вопрос общего управления - 1) кто-то же им должен будет делить всё скопленное добро, "координировать" так сказать. 2) При полностью случайном наполнении очереди может оказаться, что этот же кто-то должен понимать, когда пора заново пинать заснувшую информатику. skip locked информатике не противоречит (надеюсь) в силу изначального нацеливания на асинхронную работу клиента очереди. по части AQ - у меня совсем куцые представления. С одной стороны, AQ - он и есть skip locked. Бери да пользуйся. Информатике он в силу жизни поверх skip locked тоже не противоречит. С другой, у меня стойкое впечатление, что AQ хорошего повара требует. И, некоторые регламенты работы с очередями гораздо лучше ложатся на поделить и властвовать на костылях, чем на AQ. PS Вот не возникает у людей даже тени сомнения в том, что должны работать Java и Informatica. Ну, и раз не возникает, то skip locked (или AQ, если мир иначе не видишь) - несомненный фаворит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 18:05 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
boobyandrey_anonymous, вот если таки причитаться к авторТС же просил просто равномерно..., то окажется, что в разборщиках там Java и Informatica заявлены. Справедливости ради - ТС разное заявляет 21679600 boobyпо части AQ - у меня совсем куцые представления. Это просто очереди в вендорском исполнении с готовым API (PL/SQL, java, C). К ним могут быть присобачены синхронные PL/SQL обработчики (по механизму callback, иногда удобно) Могут быть интегрированы с JMS, если хочется. Свои ньюансы (иногда толстые) - безусловно присутствуют (как, впрочем везде), но явных противопоказаний в отношении поженить с java или ETL я с ходу не вспомню. По skip locked - поверх этого дела по хорошему следует накрутить свою API-обертку, но не особо сложную. С учетом замечаний 21678450 и известной аккуратности вполне можно скрестить и с ETL, и с абстрактным java-приложением. К преимуществам обоих подходов перед сторонними серверами очередей следует отнести возможность органично сочетать обработчики PL/SQL с обработчиками на сервере приложений. К недостаткам - замороченность интеграции в случае, когда серверов БД становится более одного, особенно если зоопарк. Тут лучше предпочесть сторонний messaging. Впрочем, можно интегрировать эту беду а-ля AQ. ...а вот адекватно прикрутить тот же DBMS_PARALLEL_EXECUTE в качестве движка очереди при наличии внешних аппликух... ...я бы, пожалуй, постарался с подобной темы соскочить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2018, 18:47 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Уважаемые, всем спасибо за глубокую дискуссию! Задача в итоге шире, чем в первом посте, поясню: I планируется 2 очереди: 1) очередь заявок на обработку. Заявка - это крупный объект для общения между АС. Эта очередь должна получать новую заявку из внешнего по отношению к данной АС мира, никак не завися от ограниченности ресурсов АС (демон занят и тп). 2) полученная заявка должна захватываться демоном заявок, после чего по метаданным внутри АС производится ее декомпозиция на конкретные работы (работа - многошаговый процесс, в общем случае описанный как набор атомарных SQL в таблицах этой АС, соотношение Заявка - Работы = 1:М) 3) результат декомпозиции - работы - следует сложить во вторую очередь Работ, которую будут разбирать и исполнять демоны второго рода (исполнители работ). Почему предполагается так: 1) ресурсы (кол-во демонов) ограничено. 2) Кол-во работ (SQL) в каждой заявке разное, время на их исполнение достаточно велико (от минут до часов) 3) !!! в очередь могут добавляться заявки с повышенным приоритетом, и их нужно будет обработать раньше тех, что попали в очередь до нее, но с низким Т.о. целевой процесс предполагается таким: Демон заявок: 1) схватил первую заявку из очереди, выяснил, что у нее 5 работ внутри - добавил эти 5 работ в очередь работ 2) схватил следующую заявку ...- и т.д. пока заявки не кончились - встал на ожидание новой строки (кстати посоветуйте как эффективнее. SLEEP?) здесь вроде как не проблема с балк-операциями (сразу хватать все заявки) Демон работ (запускается одновременно указанное лимитированное кол-во демонов параллельно): 1) схватил работу, выполнил, отчитался о результате статусом 2) схватил следующую работу .. и т.д. здесь нельзя балк - работы долгие, выполняются пошагово. А далее следует большое НО ;) в угоду скорости внедрения очередь работ отложена на второй этап, Демоны работ эмулируются шелл-файлами линукса и прочей требухой. Из ограничения "не более Н работ одновременно" получаем более жесткое ограничение "нельзя исполнять более одной заявки вида Х одновременно" и необходимость запускать в параллель демонов очереди по числу видов заявок, каждый из которых не имеет права запустить на исполнение более одной заявки своего вида. это не дает сделать массовый обработчик, как предлагает DBA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 18:14 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12Задача в итоге шире, чем в первом посте Если появились приоритеты и ресурсы на реализацию велосипеда ограничены - то имеет смысл использовать готовый транспорт. К примеру, этот: https://docs.oracle.com/database/121/ADQUE/aq_intro.htm#ADQUE2440 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2018, 19:18 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Задача напоминает работу разделяемого сервера Oracle, диспетчер принимает запросы клиентов, помещает их в память, первый свободный процесс сервера берет запрос из памяти, выполняет его и помещает результат в память, откуда результат забирает диспетчер и возвращает клиенту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2018, 12:39 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorЗадача напоминает работу разделяемого сервера Oracle, диспетчер принимает запросы клиентов, помещает их в память, первый свободный процесс сервера берет запрос из памяти, выполняет его и помещает результат в память, откуда результат забирает диспетчер и возвращает клиенту.Допустим. Но кому и как это поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2018, 20:12 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
ElicДопустим. Но кому и как это поможет? Если автор почитает про работу выделенного и разделяемого серверов, начнет лучше понимать что ему делать со своей задачей. Например, при продолжительности полной обработки задачи указанной автором, модель разделяемого сервера применять бессмысленно, никакого выигрыша от этого автор не получит. Две очереди тоже бессмысленны, только лишние затраты на разработку и поддержку диспетчеризации и демонов. Alexus12, В простейшем варианте лучше не оставлять заявки в таблице очереди, я бы сделал три таблицы, входящие заявки - из нее демон берет заявку, вставляет строку в таблицу обрабатываемых заявок вместе с атрибутами демона обрабатывающего заявку и удаляет строку из входящих, после завершения работы демон вставляет строку в таблицу выполненных заявок и удаляет из таблицы обрабатываемых. Также не мешает иметь фоновый процесс который периодически будет проверять обрабатываются ли обрабатываемые заявки и живы ли демоны, если демон упал или прибили, нужно вернуть заявку во входящие и перезапустить демона, а также сбросить сообщение в лог ошибок обработки. С приоритетом вопрос сложнее, можно иметь какое то количество резервных демонов, которые не задействованы при обработке задач вплоть до момента когда все основные заняты и поступает заявка с высшим приоритетом. Есть конечно плохое решение, фоновый процесс мониторит входящие на предмет появления задач более высокого приоритета, если все демоны заняты, убивает демона который меньше всего по длительности на этот момент отработал, его заявку обратно помещает в очередь, а демона перезапускает, в результате чего демон подхватывает задачу с высшим приоритетом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 01:30 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorElicДопустим. Но кому и как это поможет?Если автор почитает про работу выделенного и разделяемого серверов, начнет лучше понимать что ему делать со своей задачей. Например, при продолжительности полной обработки задачи указанной автором, модель разделяемого сервера применять бессмысленно, никакого выигрыша от этого автор не получит. Две очереди тоже бессмысленны, только лишние затраты на разработку и поддержку диспетчеризации и демонов.Ты слишком самонадеян, новичок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 07:43 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, я только за встроенную функциональность ;) но опыта по AQ нет, у вас есть? кто может сказать, есть ли проблемы с: 1) приоритетами (нам сообщения нужно выбирать по сортировке "сначала по приоритетам asc, потом по дате появления в очереди asc - т.е. если появится сообщение с более высоким приоритетом, оно должно схватиться следующим - минуя более старые неразобранные с низким)? 2) есть ли проблемы с постановкой очереди на паузу (например, один из обработчиков не работает в дневное время - его сообщения должны копиться в очереди, а потом, когда он проснется, пойти разгребаться дальше)? в соседнем топике видел проблему, когда подписчик не хотел видеть сообщения, которые появились во время его сна... 8-( 3) с расширением метаданных (как выглядит процесс "добавить в очередь новое поле" - нужно остановить всю очередь (включая тех, кто туда пишет - а это много АС и они не в нашей власти!!!) или можно онлайн - типа redefinition)? 4) как именно лучше выгребать очередь и ПОЧЕМУ: а) по job по таймеру пинать читателя, внутри которого стоит атомарный dequeuе (проблема сна так решается легко) б) подписать его (но тут проблема сна + исполнителей будет ограниченное кол-во и нужно этим управлять - как?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 11:31 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
5) можно ли организовать логику dequeuе "ждать Х секунд, если ничего не пришло - выйти из ожидания?" вопросов много, вот и отложили AQ на вторую итерацию... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 11:46 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
А что, кляуза WAIT не работает со SKIP LOCKED ? Может все-таки обратится к первоисточнику? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 12:11 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12, AQ: 1) для работы с приоритетами очередь должна быть создана с явным указанием на это. Тогда в индекс включается поле приоритета. На "схватываемость" новых сообщений во время dequeue влияют опции навигации. 2) Если обработчик не обрабатывает, очередь будет копиться. 3) Онлайн изменить очередь без остановки нельзя. Впрочем, это вопрос не столько к очереди, сколько к метасинхронизации писателей и читателей. Пайлоад может быть как anydata, так и raw. Так и просто ссылка на данные в перманентных таблицах. Также писатель и читатель могут вызывать процедуры, а не непосредственно ссылаться на очередь. Вариантов версионировать метаданные множество. 4) Подписка нормальный способ для внешнего обработчика. Внутренний plsql-callback использует до 20 обработчиков на всю БД и не управляется нормально. Кроме того, может молча перестать работать при временно инвалидации обработчика. Проще держать джобы с ожиданием dequeue. 5) можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 12:48 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровА что, кляуза WAIT не работает со SKIP LOCKED ? Может все-таки обратится к первоисточнику?А какой смысл в wait X skip locked? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 12:50 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
-2-, большое спасибо! есть ли (кроме доки) примеры/ссылка хорошая - где почитать, как все это правильно развернуть, чтобы не наступить на известные грабли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 13:24 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus12есть ли (кроме доки) примеры/ссылка хорошая - где почитать С доки начните. В свое время мне ее вполне хватило. Сложности - в основном, связаны с администрированием AQ. На память: - Как-то админ решил снести схему, содержащую очереди, посредством каскадного drop. 9i или 10g - не помню уже. Было смешно - юзера нельзя снести поскольку в словаре остались очереди (не охвачены cascade), а очереди снести нельзя, поскольку уже не существовало базовых таблиц очередей. Хотя с тех пор, возможно, кое-какую защиту от дурака и предусмотрели. - Традиционные хлопоты с распуханием сегментов данных, если подписчик не вычитывает очередь. - Следует подбирать AQ_TM_PROCESSES под нагрузку - Не следует пихать в очереди "Войну и Мир" - по возможности следует обойтись ссылками на крупные таблицы. Если решите гонять объектные типы - то создавать их следует с явным указанием OID. Если решите использовать RAW - придется продумать формат хранения и методы преобразований. Это не вполне тривиальное упражнение, требующее не только некоторых специальных знаний, но и серьезного тестирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 14:58 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
Alexus122) Кол-во работ (SQL) в каждой заявке разное, время на их исполнение достаточно велико (от минут до часов) Как думаешь, если запустишь параллельно десять DML, каждый из которых работает час, сколько они будут отрабатывать параллельно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 15:51 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorAlexus122) Кол-во работ (SQL) в каждой заявке разное, время на их исполнение достаточно велико (от минут до часов) Как думаешь, если запустишь параллельно десять DML, каждый из которых работает час, сколько они будут отрабатывать параллельно? А что, у Вас есть универсальный ответ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 15:56 |
|
||
|
самописная таблица-очередь и select for update
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousА что, у Вас есть универсальный ответ? У Нас нет, у ТС-а наверное есть)) Если у ТС-а нет ответа, то хоть две очереди, хоть десять, его не спасут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2018, 16:19 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1883422]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
85ms |
get tp. blocked users: |
1ms |
| others: | 267ms |
| total: | 549ms |

| 0 / 0 |
