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批处理中使用并行处理
- 找到最佳块数
- 检查您的索引(不只是创建而是删除它)
- 查看您的查询
- 避免不必要的转换
- 更重要的是:介绍它!瓶颈可能是你不知道的东西
我们的 Spring Web 应用程序使用 Spring Batch with Quartz 来执行复杂的作业。这些作业中的大多数 运行 在事务范围内,因为如果复杂系统的一部分出现故障,我们希望回滚任何以前的数据库工作。然后我们将调查问题、部署修复程序并重新启动服务器。
这会成为一个问题,因为其中一些作业会进行大量处理,可能需要很长时间才能完成 运行。随着执行时间开始超过 1 小时,我们发现自己无法将修复程序部署到生产中以解决其他问题,因为我们不想中断一项重要的工作。
我一直在阅读有关 Reactor 实现的内容,以解决我们的问题。我们可以做一些处理,发布一个事件,并让其他系统根据需要执行适当的操作。甜蜜!
我唯一的问题是,处理失败的最佳方法是什么?如果我发布了一个事件,而 Consumer 未能执行某些关键功能,它会在稍后重新启动吗?
如果事件已发布,并且在所有侦听它的适当消费者可以适当地处理它之前,服务器关闭以进行部署怎么办?
我最近才开始使用reactor,所以可能对它有一些误解,不过我会尽力回答你的。
Reactor 是一个库,可帮助您开发具有背压支持的非阻塞代码,这可以帮助您在不消耗大量资源的情况下扩展应用程序。
reactor 的流畅风格可以轻松替换 Spring 批处理,但是 reactor 本身不提供任何处理事务的方法 Spring 以防 jdbc 当前实现它将始终阻塞,因为驱动级别不支持非阻塞处理。无论如何都在讨论如何处理交易,但据了解目前还没有最终决定。
您始终可以使用事务,但请记住,您不会进行非阻塞处理,因为您需要 update/delete/insert/commit 在同一线程中或手动将事务上下文传播到新线程线程并阻塞主线程
所以我认为 Reactor 不会帮助您解决性能问题,可能会出现另一种错误的方法。
我的建议是:
- 在Spring批处理中使用并行处理
- 找到最佳块数
- 检查您的索引(不只是创建而是删除它)
- 查看您的查询
- 避免不必要的转换
- 更重要的是:介绍它!瓶颈可能是你不知道的东西