Spring 反应堆与交易;处理失败和重启作业

Spring Reactor vs Transactional; Handling failures and Restarting Jobs

我们的 Spring Web 应用程序使用 Spring Batch with Quartz 来执行复杂的作业。这些作业中的大多数 运行 在事务范围内,因为如果复杂系统的一部分出现故障,我们希望回滚任何以前的数据库工作。然后我们将调查问题、部署修复程序并重新启动服务器。

这会成为一个问题,因为其中一些作业会进行大量处理,可能需要很长时间才能完成 运行。随着执行时间开始超过 1 小时,我们发现自己无法将修复程序部署到生产中以解决其他问题,因为我们不想中断一项重要的工作。

我一直在阅读有关 Reactor 实现的内容,以解决我们的问题。我们可以做一些处理,发布一个事件,并让其他系统根据需要执行适当的操作。甜蜜!

我唯一的问题是,处理失败的最佳方法是什么?如果我发布了一个事件,而 Consumer 未能执行某些关键功能,它会在稍后重新启动吗?

如果事件已发布,并且在所有侦听它的适当消费者可以适当地处理它之前,服务器关闭以进行部署怎么办?

我最近才开始使用reactor,所以可能对它有一些误解,不过我会尽力回答你的。

Reactor 是一个库,可帮助您开发具有背压支持的非阻塞代码,这可以帮助您在不消耗大量资源的情况下扩展应用程序。

reactor 的流畅风格可以轻松替换 Spring 批处理,但是 reactor 本身不提供任何处理事务的方法 Spring 以防 jdbc 当前实现它将始终阻塞,因为驱动级别不支持非阻塞处理。无论如何都在讨论如何处理交易,但据了解目前还没有最终决定。

您始终可以使用事务,但请记住,您不会进行非阻塞处理,因为您需要 update/delete/insert/commit 在同一线程中或手动将事务上下文传播到新线程线程并阻塞主线程

所以我认为 Reactor 不会帮助您解决性能问题,可能会出现另一种错误的方法。

我的建议是:

  • 在Spring批处理中使用并行处理
  • 找到最佳块数
  • 检查您的索引(不只是创建而是删除它)
  • 查看您的查询
  • 避免不必要的转换
  • 更重要的是:介绍它!瓶颈可能是你不知道的东西