Очередь задач с использованием rabbitMQ - PullRequest
0 голосов
/ 08 февраля 2019

У нас есть система, которая получает информацию об оплате счетов из банковской системы.Это работает так:

  1. В нашей системе создается счет
  2. Оплата счета производится через банковскую систему.Банковская система запрашивает реквизиты счета из нашей системы, и она возвращает реквизиты счета
  3. Банковская система проходит процесс оплаты и отправляет реквизиты платежа в нашу систему, и она будет ждать подтверждения в течение 30 секунд.Если банковская система не получает подтверждающего сообщения в течение 30 секунд, банк отменяет платеж, но не сообщает нашей системе об отмене.
  4. Наша система получает платежную информацию и сохраняет платеж.Затем отправляет подтверждающее сообщение в банк.Но иногда, из-за проблем с сетью или системой, подтверждающее сообщение не будет доставлено в течение 30 секунд, и мы не знали о статусе отмененного сообщения.

Итак, проблема в том, что наша система сохраняет платеж, но иногдане может своевременно ответить на запрос подтверждения платежа (в течение 30 секунд), в этом случае банк отменяет платеж, и наша система не знает, что платеж отменен.

Я разработал решение, которое проверяет каждый платежЕсли платеж прошел успешно (через 30 секунд после получения платежа), отправив запрос на проверку способа оплаты, Банк предоставил.Задачи (отправка идентификатора платежа в метод check_payment банковской системы - он возвращает статус платежа) выполняются в отдельных потоках с использованием пула потоков среды Spring.Но я боюсь, что это не лучшее решение, так как существует риск переполнения пула потоков в случае сбоя сети.

Какие решения вы бы порекомендовали?Можем ли мы использовать RabbitMQ для этой проблемы?

1 Ответ

0 голосов
/ 16 июня 2019

Вы, по сути, внедряете отслеживание состояния.Я бы рекомендовал изучить Cadence Workflow , способный поддержать ваш сценарий использования с минимальными усилиями.

Cadence предлагает много других преимуществ по сравнению с использованием очередей для обработки задач.

  • Построены экспоненциальные попытки с неограниченным интервалом истечения
  • Обработка ошибок.Например, он позволяет выполнить задачу, которая уведомляет другую службу, если оба обновления не могут быть выполнены успешно в течение заданного интервала.
  • Поддержка длительных пульсирующих операций
  • Возможность реализации зависимостей сложных задач.Например, для реализации цепочки вызовов или логики компенсации в случае неисправимых сбоев ( SAGA )
  • Обеспечивает полную видимость текущего состояния обновления.Например, при использовании очередей все, что вы знаете, если в очереди есть несколько сообщений, и вам нужна дополнительная БД для отслеживания общего прогресса.С Cadence каждое событие записывается.
  • Возможность отмены обновления в полете.

См. презентацию , которая охватывает модель программирования Cadence.

...