2

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

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

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

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

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

4

1 回答 1

6

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

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

反应器的流利风格可以轻松替换 Spring Batch,但是反应器本身它不提供任何处理事务的方法,也不是 Spring,如果 jdbc 当前实现它将始终阻塞,因为驱动级别不支持非阻塞处理。无论如何都围绕如何处理交易进行了讨论,但据了解,这件事还没有最终决定。

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

因此,我相信 Reactor 不会帮助您解决性能问题,并且可能会出现另一种方法。

我的建议是:

  • 在 Spring Batch 中使用并行处理
  • 找到最佳块数
  • 查看您的索引(不仅创建而且删除它)
  • 查看您的查询
  • 避免不必要的转换
  • 更重要的是:剖析它!瓶颈可能是你不知道的东西
于 2017-05-04T11:34:46.043 回答