1 Сценарии использования
- Закройте неиспользуемые соединения. На сервере есть много клиентских соединений, которые необходимо закрыть после простоя в течение определенного периода времени.
- Очистите просроченный бизнес данных. Например, объект в кеше необходимо удалить из кеша по истечении времени простоя.
- Обработка тайм-аута задачи. В случае взаимодействия запрос-ответ со скользящим окном сетевого протокола обрабатывать запросы, которые не отвечают на тайм-аут.
- Если заказ не оплачен в течение 30 минут после оформления заказа, заказ будет автоматически аннулирован.
- Уведомление о заказе: отправьте текстовое сообщение пользователю через 60 секунд после успешного размещения заказа.
- Когда заказ не оплачен, как вовремя закрыть заказ и вернуть товар?
- Как регулярно проверять, был ли успешно возвращен заказ в статусе возврата?
- При создании нового магазина товар не загружался в течение N дней, откуда система узнает информацию и отправляет активационное смс?
- Планирование запланированных задач: используйте DelayQueue, чтобы сохранить задачи и время выполнения, которые будут выполняться в этот день, и начать выполнение, как только задача будет получена из DelayQueue.
2 Метод отложенного выполнения задач
- Периодический опрос (база данных и т.д.)
- DelayQueue
- Timer
- ScheduledExecutorService
- Колесо времени (кафка)
- RabbitMQ
- Quartz
- Redis Zset
- Koala
- JCronTab
- SchedulerX (Али)
- Лайки задерживают очередь
2.1 Опрос
Особенности: Регулярная ротация базы данных и установка статуса.
优点:实现简单
缺点:数据量过大时会消耗太多的IO资源,效率太低
2.2 DelayQueue
Функции: Неограниченные, задержанные, блокирующие очереди
a、BlockingQueue+PriorityQueue(堆排序)+Delayed
b、DelayQueue中存放的对象需要实现compareTo()方法和getDelay()方法。
c、getDelay方法返回该元素距离失效还剩余的时间,当<=0时元素就失效了,
就可以从队列中获取到。
Зачем здесь использовать режим лидера/ведомого?
- Если это не первая нода команды, будить вообще не нужно!
- Предполагая, что время задержки еще не наступило, когда значение взято, нужно подождать, а в это время в очередь добавляется новое с меньшей задержкой и ставится в начало очереди, тогда В этот момент запускается цикл for и получается вновь добавленный элемент, значит, предыдущее ожидание напрасно, и очевидно, что можно выйти из ожидания раньше!
- Кроме того, если здесь ожидает много потоков, если время истекло, многие потоки заполнят очередь ожидания в пуле блокировки, чтобы конкурировать за ресурсы блокировки, но результатом может быть только успех, Больше пишем о бесстрашной конкуренции! (множественные ожидания и пробуждения)
2.3 Таймер и TimerTask
- Сортировка в TaskQueue заключается в выполнении сортировки кучи в следующее время выполнения в TimerTask, каждый раз выбирая первое в массиве.
- И delayQueue сортирует результаты getDelay() элементов в очереди.
Таймер — это инструмент таймера, используемый для планирования выполнения определенных задач в фоновом потоке. Можно запланировать однократное или многократное выполнение задачи. Основной метод:
2.4 Колесо времени (кафка)
Объяснение существительного колеса времени:
- Time Grid: кольцевые блоки для хранения задержки задач;
- Указатель (CurrentTime): указывает на временную сетку текущей операции, представляющую текущее время.
- Количество сеток (ticksPerWheel): количество сеток времени в колесе времени.
- interval (tickDuration): интервал между каждой временной сеткой
- Total interval (интервал): общий интервал текущего колеса времени, равный ticksPerWheel*tickDuration
В соответствии со временем истечения каждого TimerTaskEntry и временем текущего тайм-раунда выберите подходящее ведро (фактически TimerTaskList), поместите в него объект TimerTaskEntry и, если время истечения ведра обновилось, подтолкните ведро к DelayQueue и перезапустите его.
Пример: предположим, что временная сетка или сегмент с номером 0 сохраняет время истечения t, а продолжительность каждого тика (tickDuration) составляет 20 мс. В этой сетке можно сохранить только время истечения [t~t+20]. задача мс, предполагая, что в колесе времени имеется n временных сеток, каждый интервал равен 1 мс, а время истечения равно m(мс), тогда формула расчета m%n = временная сетка или ведро, в котором оно находится, например, n=10, m=34ms, тогда его ведро или временная сетка равны 4
2.5 Отложенная задача RabbitMQ
Сам RabbitMQ напрямую не поддерживает функцию очереди с задержкой, но функцию очереди с задержкой можно смоделировать с помощью следующих функций.
RabbitMQ может установить x-message-tt для Queue и Message, чтобы контролировать время жизни сообщения.Если время ожидания истекло, сообщение становится мертвой буквой. У RabbitMQ есть два способа установить время истечения срока действия сообщений в очереди. О: При настройке свойств очереди все сообщения в очереди имеют одинаковый срок действия. B: Установите сообщение отдельно, TTL каждого сообщения может быть разным.
2.6 Quartz
Почему бы не использовать Таймер?
- Таймеры не имеют механизма сохранения.
- Таймеры не являются гибкими (можно установить только время начала и интервал повторения, не зависящие от времени, даты, дня и т. д. (секунды, минуты, часы))
- Таймеры не могут использовать пул потоков, один таймер — один поток
- У таймеров нет реального плана управления
Основные понятия: планировщики, задачи и триггеры.
Отношения между тремя: планировщик отвечает за планирование каждой задачи.В определенное время или по истечении определенного времени срабатывает триггер, и начинается выполнение определенной задачи.
- Планировщик — это контейнер планировщика (штаб-квартира), который может содержать множество JobDetail и триггеров, при запуске контейнера каждый JobDetail в нем будет автоматически выполняться пошагово в соответствии с триггером.
- JobDetail — это исполняемое задание, которое само по себе имеет состояние.
- Триггер показывает, когда нужно настроиться.
- После регистрации JobDetail и Trigger в контейнере планировщика формируется сборное задание (пара, состоящая из JobDetail и Trigger), которое может быть запланировано и выполнено при запуске контейнера.
- Планировщик — это контейнер, в котором есть пул потоков, который используется для планирования и параллельного выполнения каждого задания, что может повысить эффективность контейнера.
продолжение следует. . .
Если у вас есть какие-либо вопросы по вышеуказанным вопросам, вы можете обратить внимание на паблик-аккаунт, прийти и обсудить со мной, и вы можете бесплатно получить большое количество новейших учебных материалов и видео по java, а также последние материалы интервью .
Если вы считаете, что эта статья полезна для вас, или если у вас есть какие-либо вопросы и вы хотите предоставить бесплатный VIP-сервис 1 на 1, вы можете подписаться на мою официальную учетную запись, подписаться на меня, чтобы бесплатно получать большое количество последних учебных материалов и видео по Java, а также последние материалы интервью, ваши подписки и переадресация - самая большая поддержка для меня, O(∩_∩)O: