我们的Spring Web应用程序使用Spring Batch和Quartz来执行复杂的工作。大多数这些作业都在事务范围内运行,因为如果复杂系统的一部分失败,我们希望回滚任何以前的数据库工作。然后,我们将调查问题,部署修复程序,然后重新启动服务器。
它成为一个问题,因为其中一些工作会进行大量处理,并且可能需要很长时间才能运行。由于执行时间开始超过1小时标记,我们发现自己无法将修复程序部署到生产中以解决其他问题,因为我们不想中断重要工作。
我一直在阅读Reactor实施,以解决我们的问题。我们可以进行一些处理,发布事件,并让其他系统根据需要执行适当的操作。甜!
我唯一的问题是,处理失败的最佳方法是什么?如果我发布了一个事件而消费者未能执行某些关键功能,它会在以后重新启动吗?
如果发布了一个事件,并且在所有听取它的相应消费者能够正确处理它之前,服务器会关闭以进行部署吗?
答案 0 :(得分:5)
我最近刚开始使用reactor,所以我可能会对它有一些误解,但是我会尝试回答你。
Reactor是一个库,它可以帮助您开发具有反压支持的非阻塞代码,这可以帮助您扩展应用程序而不会消耗大量资源。
反应器的流畅风格可以很容易地取代Spring Batch但反过来它自己没有提供任何方式处理事务既不是Spring,如果jdbc当前实现它将始终阻塞,因为那里驱动级别不支持非阻塞处理。关于如何处理交易还有讨论,但据我所知,没有关于此事的最终决定。
您始终可以使用事务,但请记住,您不会进行非阻塞处理,因为您需要在同一个线程中更新/删除/插入/提交,或者手动将事务上下文传播到新线程,阻止主线程
所以我相信Reactor不会帮助您解决您的性能问题,并且可能会采取另一种方法。
我的建议是: