Порядок выполнения в Hazelcast IScheduledExecutorService ⇐ JAVA
-
Anonymous
Порядок выполнения в Hazelcast IScheduledExecutorService
Мы используем Hazelcast IScheduledExecutorService для планирования задач, и наши задачи проверяют определенное условие, и если условие не выполняется, они перепланируют себя через постепенно увеличивающиеся интервалы (повторные попытки).
Обычно требуется несколько десятков проверок, чтобы это условие стало истинным
При высоких нагрузках у нас есть много задач, срок действия которых истекает одновременно, и они истекают быстрее, чем планировщик успевает их обработать, и получается, что в этой ситуации новые задачи выполняются раньше тех задач, которые были запланированы. раньше (повторные попытки), поэтому очередь задач, подлежащих выполнению, только растет, а те задачи, которые могли уже закончиться (повторные попытки), не выполняются вообще. Их можно будет выполнить только тогда, когда нагрузка уменьшится и новые задачи перестанут поступать, что означает, что все задачи успешно завершаются только в конце пика, а не завершаются успешно на протяжении всего пика с просто более длительным временем завершения. Для иллюстрации: задача A предшествует B, B перед C и т. д. Для завершения каждой задачи требуется две секунды, поэтому каждая задача завершается повторной попыткой только после того, как уже запланирована другая новая задача.
1, 2, 3 — время (в секундах с начала), в которое задачи (и повторы) должны выполняться согласно расписанию.
Начиная с момента 2 в пуле есть несколько задач, срок действия которых уже истек и поэтому они готовы к выполнению, и вместо того, чтобы выполняться от самого старого времени к самому новому, они выполняются противоположным способом.
>
расписание в этом порядке
A - B - C - D - ... выполнение в этом порядке
A(1) - B(2) - C(3) - D(4) - ... - D(5) - C(4) - B(3) - A(2) ожидаемый порядок выполнения
A(1) - B(2) - A(2) - C(3) - B(3) - D(4) - C(4) - D(5) - ... или даже лучше
A(1) - A(2) - B(2) - B(3) - C(3) - C(4) - D(4) - D(5) - ... Есть ли способ заставить IScheduledExecutorService сначала выполнять те задачи, срок действия которых истек раньше всего? Есть ли способ установить ручные приоритеты для выполнения этих задач, когда срок действия нескольких задач истек? Затем мы могли бы добавить более высокий приоритет тем, которые имеют больше повторов и поэтому для нас важнее, чтобы они выполнялись первыми.
Мы используем Hazelcast IScheduledExecutorService для планирования задач, и наши задачи проверяют определенное условие, и если условие не выполняется, они перепланируют себя через постепенно увеличивающиеся интервалы (повторные попытки).
Обычно требуется несколько десятков проверок, чтобы это условие стало истинным
При высоких нагрузках у нас есть много задач, срок действия которых истекает одновременно, и они истекают быстрее, чем планировщик успевает их обработать, и получается, что в этой ситуации новые задачи выполняются раньше тех задач, которые были запланированы. раньше (повторные попытки), поэтому очередь задач, подлежащих выполнению, только растет, а те задачи, которые могли уже закончиться (повторные попытки), не выполняются вообще. Их можно будет выполнить только тогда, когда нагрузка уменьшится и новые задачи перестанут поступать, что означает, что все задачи успешно завершаются только в конце пика, а не завершаются успешно на протяжении всего пика с просто более длительным временем завершения. Для иллюстрации: задача A предшествует B, B перед C и т. д. Для завершения каждой задачи требуется две секунды, поэтому каждая задача завершается повторной попыткой только после того, как уже запланирована другая новая задача.
1, 2, 3 — время (в секундах с начала), в которое задачи (и повторы) должны выполняться согласно расписанию.
Начиная с момента 2 в пуле есть несколько задач, срок действия которых уже истек и поэтому они готовы к выполнению, и вместо того, чтобы выполняться от самого старого времени к самому новому, они выполняются противоположным способом.
>
расписание в этом порядке
A - B - C - D - ... выполнение в этом порядке
A(1) - B(2) - C(3) - D(4) - ... - D(5) - C(4) - B(3) - A(2) ожидаемый порядок выполнения
A(1) - B(2) - A(2) - C(3) - B(3) - D(4) - C(4) - D(5) - ... или даже лучше
A(1) - A(2) - B(2) - B(3) - C(3) - C(4) - D(4) - D(5) - ... Есть ли способ заставить IScheduledExecutorService сначала выполнять те задачи, срок действия которых истек раньше всего? Есть ли способ установить ручные приоритеты для выполнения этих задач, когда срок действия нескольких задач истек? Затем мы могли бы добавить более высокий приоритет тем, которые имеют больше повторов и поэтому для нас важнее, чтобы они выполнялись первыми.