2
2
=============================
3
3
4
4
В процессе обработки заданий могут возникать исключительные ситуации. Это могут быть как внутренние
5
- ошибки — результат криво написанного кода, так и внешние, когда запрашиваемые сервисы и внешние
5
+ ошибки — результат криво написанного кода, так и внешние - когда запрашиваемые сервисы и внешние
6
6
ресурсы временно недоступны. Во втором случае неплохо иметь возможность повторить попытку выполнить
7
7
задание через некоторое время.
8
8
9
9
Для того чтобы это сделать существует несколько способов.
10
10
11
+
11
12
Опции повторного выполнения
12
13
---------------------------
13
14
26
27
Опция ` ttr ` устанавливает резервное время для выполнения заданий. Перед выполнением задание попадает
27
28
в резерв и будет находиться там не дольше чем задано в ` ttr ` . Если задание не выполнилось успешно,
28
29
и требуется повторная попытка, оно вернется назад в очередь. Если выполнилось - будет удалено
29
- из резерва. Опция ` attempts ` устанавливает максимальное кол-во попыток. Если попытки закончились,
30
+ из резерва. Опция ` attempts ` устанавливает максимальное количество попыток. Если попытки закончились,
30
31
и задание не выполнилось удачно, оно так же будет удалено из резерва.
31
32
32
- Устанавливая ` ttr ` важно учесть чтобы этого времени было достатчно , иначе воркер убьет процесс
33
+ Устанавливая опцию ` ttr ` , важно учесть, чтобы этого времени было достаточно , иначе воркер убьет процесс
33
34
выполняющегося задания по таймауту прямо во время выполнения.
34
35
35
- Описанные опции действуют глобально на все задания в очереди, а, чтобы для отдельных заданий это
36
- поведение переопределить, существуют дополнительные возможности.
36
+ Описанные опции действуют глобально на все задания в очереди. Чтобы переопределить поведение для отдельных
37
+ заданий, существуют дополнительные возможности.
38
+
37
39
38
40
RetryableJobInterface
39
41
---------------------
40
42
41
43
Индивидуальный контроль повторного выполнения реализован интерфейсом ` RetryableJobInterface ` , код
42
- такого job-объекта может выглядеть так :
44
+ такого job-объекта может выглядеть следующим образом :
43
45
44
46
``` php
45
47
class SomeJob extends BaseObject implements RetryableJobInterface
@@ -61,15 +63,16 @@ class SomeJob extends BaseObject implements RetryableJobInterface
61
63
}
62
64
```
63
65
64
- Методы ` getTtr() ` и ` canRetry() ` имеют более высокий приоритет чем общие настройки очереди, и дают
65
- возможность реализовать индивидуальный алгоритм повторного выполнения задачи если предыдущая попытка
66
+ Методы ` getTtr() ` и ` canRetry() ` имеют более высокий приоритет, чем общие настройки очереди, и дают
67
+ возможность реализовать индивидуальный алгоритм повторного выполнения задачи, если предыдущая попытка
66
68
завершилась неудачей.
67
69
70
+
68
71
Обработчики событий
69
72
-------------------
70
73
71
74
Еще один способ задать резервное время и необходимость повторного запуска невыполненной задачи
72
- предполагает использовать события ` Queue::EVENT_BEFORE_PUSH ` и ` Queue::EVENT_AFTER_ERROR ` .
75
+ предполагает использование событий ` Queue::EVENT_BEFORE_PUSH ` и ` Queue::EVENT_AFTER_ERROR ` .
73
76
74
77
Событие ` Queue::EVENT_BEFORE_PUSH ` можно использовать, чтобы задать резервное время:
75
78
@@ -91,13 +94,14 @@ Yii::$app->queue->on(Queue::EVENT_AFTER_ERROR, function (ExecEvent $event) {
91
94
});
92
95
```
93
96
94
- Обработчики событий выполняются после методов ` RetryableJobInterface ` , и, следовательно, имеют
97
+ Обработчики событий выполняются после методов ` RetryableJobInterface ` и, следовательно, имеют
95
98
наивысший приоритет.
96
99
100
+
97
101
Ограничения
98
102
-----------
99
103
100
- Не все драйверы поддерживают повторное выполнение одинаково хорошо . Полноценную поддержку
104
+ Не все драйверы одинаково хорошо поддерживают повторное выполнение заданий . Полноценную поддержку
101
105
обеспечивают драйвера: [ Beanstalk] , [ DB] , [ File] и [ Redis] . [ Синхронный драйвер] , как отладочный,
102
106
не будет повторять невыполненные задания. [ Gearman] не поддерживает повторное выполнение вообще.
103
107
А [ RabbitMQ] имеет только свою базовую поддержку повторов, при которой номер попытки узнать
0 commit comments