【问题标题】:Task queue using rabbitMQ使用rabbitMQ的任务队列
【发布时间】:2019-02-08 09:38:34
【问题描述】:

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

  1. 发票已在我们的系统中创建
  2. 发票的支付是通过银行系统完成的。银行系统向我们的系统请求发票详细信息并返回发票详细信息
  3. 银行系统完成支付过程,并将支付细节发送到我们的系统,它会等待确认消息30秒。如果银行系统在 30 秒内没有收到确认消息,银行会取消付款,但不会通知我们的系统取消。
  4. 我们的系统收到付款信息,并保存付款。然后 将确认消息发送到银行。但有时,因为网络 或系统问题,确认消息将不会在 30 内发送 几秒钟后,我们就没有意识到已取消的消息状态。

所以,问题是我们的系统保存了付款,但有时无法按时响应付款确认请求(在 30 秒内),在这种情况下,银行取消了付款,我们的系统不知道付款已取消。

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

您会推荐哪些解决方案?我们可以使用 RabbitMQ 解决这个问题吗?

【问题讨论】:

  • 我不确定 RabbitMQ 是否适合这个项目。另一方面,必须考虑部署更多可能具有潜在风险的软件产品所涉及的风险,我的意思是安全风险、漏洞。
  • 请更好地说明您正在尝试解决的实际问题以及所考虑的架构。流程的哪一部分受到网络中断的负面影响?您正在并行执行哪些任务?
  • @noxdafox 感谢您的评论。我已经更新了我的答案。希望现在更清楚了。

标签: rabbitmq message-queue


【解决方案1】:

您实际上是在实施有状态的编排。我建议您研究一下Cadence Workflow,它能够以最少的努力支持您的用例。

与使用队列进行任务处理相比,Cadence 提供了许多其他优势。

  • 内置指数重试,无限期间隔
  • 故障处理。例如,如果在配置的时间间隔内两次更新都无法成功,它允许执行通知另一个服务的任务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖。例如,在发生不可恢复的故障时实现调用链或补偿逻辑 (SAGA)
  • 提供对当前更新状态的完整可见性。例如,当使用队列时,您都知道队列中是否有一些消息,并且您需要额外的数据库来跟踪整体进度。使用 Cadence 记录每个事件。
  • 能够取消正在进行的更新。

请参阅 the presentation,了解 Cadence 编程模型。

【讨论】:

    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多