Spring Reactor vs Transactional;处理故障并重新启动作业

时间:2016-10-23 01:22:40

标签: java spring spring-batch project-reactor

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

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

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

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

如果发布了一个事件,并且在所有听取它的相应消费者能够正确处理它之前,服务器会关闭以进行部署吗?

1 个答案:

答案 0 :(得分:5)

我最近刚开始使用reactor,所以我可能会对它有一些误解,但是我会尝试回答你。

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

反应器的流畅风格可以很容易地取代Spring Batch但反过来它自己没有提供任何方式处理事务既不是Spring,如果jdbc当前实现它将始终阻塞,因为那里驱动级别不支持非阻塞处理。关于如何处理交易还有讨论,但据我所知,没有关于此事的最终决定。

您始终可以使用事务,但请记住,您不会进行非阻塞处理,因为您需要在同一个线程中更新/删除/插入/提交,或者手动将事务上下文传播到新线程,阻止主线程

所以我相信Reactor不会帮助您解决您的性能问题,并且可能会采取另一种方法。

我的建议是:

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