|
Повторные попытки с удвоением интервала между попытками
|
|||
---|---|---|---|
#18+
У меня вопрос не совсем про Oracle, скорее про запросы, но к разделам по разработке ИС или БД он подходит еще меньше. Есть система, которая обрабатывает запросы и формирует документы во внешней ИС. Во внешней ИС документы проходят несколько стадий, финальной стадией будет "выполнено" или "ошибка". Обработка документа занимает неизвестное время, но обычно не более 5 минут. Поэтому у меня есть еще дополнительный скрипт, который запускается каждые 5 минут, проверяет статус документов и для выполненных документов выполняет какие-то действия. Общая схема взаимодействия выглядит так. 1. В БД есть таблица для регистрации запросов: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
2. Когда поступает запрос, в этой таблице фиксируется соответствующая запись: Код: plsql 1. 2. 3.
3. Затем во внешней ИС формируется документ и его идентификатор фиксируется в таблице: Код: plsql 1. 2. 3.
4. Далее в дело вступает регулярно (каждые 5 минут) запускаемый скрипт. Он последовательно выполняет несколько запросов. 4.1. Удаляет устаревшие записи: Код: plsql 1. 2.
4.2. Документам старше суток проставляет статус "ошибка" (чтобы более не опрашивать их статус). Код: plsql 1. 2. 3. 4.
4.3. Документам старше 5 минут, у которых статус не менялся после нескольких опросов подряд, проставляет статус "ошибка". Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
4.4. Затем получает список текущих документов (в статусе ожидания и старше 5 минут): Код: plsql 1. 2. 3. 4.
4.5. Для каждого из текущих документов во внешней ИС опрашивается статус и вносится в таблицу: Код: plsql 1. 2. 3. 4. 5.
В принципе сейчас все работает, как часы. Но есть некоторые пожелания. Обычно через 5 минут документ уже обработан и у большинства записей UPDATE_RETRY=1. Если этого не произошло, то причин может быть три: - внешняя ИС не успела обработать документ, нужно повторить еще через 5 минут - перебои связи, могут быть до нескольких часов - перманентная ошибка Вот со вторым пунктом сложности. Если скрипт выполняет пункт 4.5 каждые 5 минут, то 5 попыток наступят через 25 минут. То есть через полчаса пункт 4.3 проставит в таблице статус "Ошибка" и более опрашивать статус этого документа не будет. И если это был часовой перерыв связи, то документы в этом периоде нужно будет проверять вручную (или вручную задать им STATUS=0). Более правильным являлось бы удвоение временного интервала между повторными проверками - например первая проверка через 5 минут, вторая через 10, третья через 20, четвертая через 40, пятая через полтора часа, далее перевод в статус "Ошибка". Как бы это сделать правильно? Код: plsql 1. 2. 3.
Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2019, 11:08 |
|
Повторные попытки с удвоением интервала между попытками
|
|||
---|---|---|---|
#18+
Добавить второй стобец UPDATE_RETRY2. Заполнять как показано ниже. Перевод в статус "Ошибка", при значении 5 в обеих стобцах (5 минут x 20) UPDATE_RETRY UPDATE_RETRY2 1011202122303132334041424344505152535455 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2019, 12:34 |
|
Повторные попытки с удвоением интервала между попытками
|
|||
---|---|---|---|
#18+
ViewerЗаполнять как показано ниже ... пардон, на заполнять, а менять значения в строке ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2019, 12:36 |
|
Повторные попытки с удвоением интервала между попытками
|
|||
---|---|---|---|
#18+
Alibek B.- перебои связи, могут быть до нескольких часов Вот со вторым пунктом сложности. Исключение исключению рознь. Обрабатывайте ошибки связи (они глобальные по отношению к документам) отдельно, не продвигая счетчик обращения к отдельным документам. Заодно предусмотрите способ реакции на технологические перерывы в работе удаленного сервиса. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2019, 16:01 |
|
Повторные попытки с удвоением интервала между попытками
|
|||
---|---|---|---|
#18+
ViewerДобавить второй стобец UPDATE_RETRY2. Да, подумав я понял, что без второго столбца не обойтись. Alibek B.Так? Ну а этот вариант в любом случае был неправильный, т.к. счетчик попыток все равно увеличивался каждые 5 минут и через 5 минут запись выпадала из под действия проверок. andrey_anonymousИсключение исключению рознь. Ну в идеале было бы неплохо более точно определить причину ошибки (ошибка транспорта или ошибка сервиса), однако это существенно усложнит и увеличит код, который сейчас достаточно простой для понимания и компактный. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2019, 10:17 |
|
|
start [/forum/topic.php?fid=52&msg=39789706&tid=1882680]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 275ms |
total: | 403ms |
0 / 0 |