#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
Я надеюсь, что это поможет в вашем случае