Spring 集成会导致响应式应用程序阻塞吗?

Can Spring Integration cause a Reactive Application to block?

我将 Project Reactor 用于非阻塞 IO 数据管道,并且我正在考虑使用 Spring 集成作为抽象层来管理管道中的所有流和组件。我目前正在使用 Project Reactor 实现 Kafka 消费者,我开始怀疑 Spring Integration wrap 是否会在阻塞和背压方面损坏我的管道。

我想知道在完全非阻塞应用程序中使用 Spring 集成及其 类 是否安全,如果有任何陷阱我应该注意。

在大多数情况下Spring集成组件是无状态的,因此在多线程(或非阻塞)环境中使用它们是安全的。如果你使用一个真正执行阻塞 IO 操作的特定通道适配器,你可能会遇到一些问题,例如文件写入或 JDBC INSERT。在这种情况下,您需要考虑为此类操作切换到不同的线程,以免阻塞您的反应流。

查看 Project Reactor 中的相应配方:https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking

出于该线程切换目的Spring 集成提供了ExecutorChannelQueueChannel 实现。然而 FluxMessageChannel 在某些情况下会非常适合。

有限的背压在 Spring 集成解决方案中没有意义,因为一切都被视为流,无限的数据流。因此在大多数情况下 Spring 集成依赖于自然背压,在我们处理当前之前我们不会请求更多。

请试一试,不要犹豫,回来给我们一些反馈!