使用RabbitMQ

时间:2019-02-08 09:38:34

标签: rabbitmq message-queue

我们有一个从银行系统接收发票付款信息的系统。它是这样的:

  1. 发票已在我们的系统中创建
  2. 通过银行系统完成发票付款。银行系统从我们的系统中请求发票明细,并返回发票明细
  3. 银行系统正在处理付款过程,并将付款详细信息发送到我们的系统,它将等待30秒钟的确认消息。如果银行系统在30秒内未收到确认消息,则银行会取消付款,但不会通知我们有关取消的信息。
  4. 我们的系统接收付款信息,并保存付款。然后 发送确认消息到银行。但是有时候,由于网络 或系统问题,请确认消息不会在30天内发送 秒,我们不知道已取消的邮件状态。

因此,问题在于我们的系统保存了付款,但有时无法按时响应付款确认请求(在30秒之内),在这种情况下,银行取消了付款,而我们的系统不知道付款被取消了。 / p>

我开发了一种解决方案,通过发送请求以检查银行提供的付款方式来检查付款是否成功(在收到付款后30秒后)。使用Spring框架的线程池在单独的线程中执行任务(将付款ID发送到银行系统的check_payment方法-它返回付款状态)。但是我担心这不是最好的解决方案,因为当网络出现故障时,存在线程池满的风险。

您会推荐什么解决方案?我们可以使用RabbitMQ解决此问题吗?

1 个答案:

答案 0 :(得分:0)

您实质上是在实现有状态业务流程。我建议您研究Cadence Workflow,它能够以最小的努力来支持您的用例。

与使用队列进行任务处理相比,Cadence具有许多其他优点。

  • 构建具有无限到期间隔的指数重试
  • 故障处理。例如,它允许执行一个任务,如果在配置的时间间隔内两次更新均未成功,则该任务会通知另一服务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖性。例如,在无法恢复的故障(SAGA)的情况下实现呼叫链或补偿逻辑的链接
  • 完全了解更新的当前状态。例如,当使用队列时,您就会知道队列中是否有某些消息,并且需要其他数据库来跟踪总体进度。使用Cadence可以记录每个事件。
  • 能够取消正在进行的更新。

请参见介绍Cadence编程模型的the presentation