Планирование задач с помощью Redis

#java #spring #redis

#java #spring #redis

Вопрос:

Мне нужно создать программу, которая получает идентификатор платежа и отправляет запрос через 30 секунд другому веб-сервису, чтобы проверить, прошел ли платеж успешно. Программа будет получать 500-1000 транзакций в минуту, поэтому я думаю, что неэффективно использовать пул потоков Java для этой задачи.

Я думаю использовать Redis для хранения идентификаторов платежей, которые необходимо проверять. И идентификаторы должны вызываться один за другим в соответствии с заданным временем (каждый идентификатор должен вызываться через 30 секунд).

Насколько я знаю до сих пор, я могу использовать тип данных SET ключ-значение:

SET ID TIMESTAMP

Это правильный способ реализации программы? Какие-либо другие варианты вы рекомендуете?

Я использую Spring Boot и PostgreSQL для базы данных.

Комментарии:

1. Нужно ли вам запускать запрос на проверку платежа в точное время receiving_time 30 сек. или вам просто нужно запустить его в любое время через 30 сек. ? Я не ожидаю первого в качестве требования, но кто знает? Тем не менее, ваша проблема будет заключаться вовсе не в пуле потоков Java, поскольку он может легко поддерживать такую небольшую нагрузку. По-настоящему неприятной частью будет время ожидания запроса на проверку платежа и, при необходимости, обновление состояния для идентификатора платежа. Каковы требования для обработки ответа от службы проверки платежей и случаев сбоя? Каково ожидаемое время выполнения контрольного вызова?

2. запрос на проверку оплаты @cool необходимо выполнить в любое время через 30 секунд. Время ожидания запроса составляет 10 секунд, и да, он обновляет состояние платежа после получения ответа. В случае сбоя статус останется ожидающим.

Ответ №1:

Вариант использования, по-видимому, заключается в задержке обработки сообщений.Здесь можно использовать активную обработку сообщений MQ / или RabbitMQ, которые поддерживают отложенную обработку сообщений. RabbitMQ.Если это не масштабируемо для вашего варианта использования, то вы можете сохранить свое сообщение в какой-нибудь базе данных NOSQL (Cassandra) методом сегментирования с фиксированным размером корзины (скажем, событие запланировано на 10: 21: 55 утра, тогда корзина равна 10: 21:00 утра).И главный процесс выбирает подходящую корзину и распределяет среди рабочих для обработки.

Ответ №2:

Вы можете использовать redis zset (сортированный набор), который хранит элементы в порядке, основанном на заданной оценке, для получения дополнительной информации вы можете проверить, как работает сортированный набор.

Пример:

 zadd SET_NAME PAYMENT_ID ISSUED_TIME(EPOCH)
  

Затем запускайте планировщик примерно через каждые 10 секунд, который будет извлекать идентификаторы платежей из отсортированных наборов данных на основе оценки, подобной:

 zrangebyscore SET_NAME LONG.MIN_VALUE CURRENT_TIME
  

Я надеюсь, что это поможет в вашем случае