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 集成提供了ExecutorChannel
和QueueChannel
实现。然而 FluxMessageChannel
在某些情况下会非常适合。
有限的背压在 Spring 集成解决方案中没有意义,因为一切都被视为流,无限的数据流。因此在大多数情况下 Spring 集成依赖于自然背压,在我们处理当前之前我们不会请求更多。
请试一试,不要犹豫,回来给我们一些反馈!
我将 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 集成提供了ExecutorChannel
和QueueChannel
实现。然而 FluxMessageChannel
在某些情况下会非常适合。
有限的背压在 Spring 集成解决方案中没有意义,因为一切都被视为流,无限的数据流。因此在大多数情况下 Spring 集成依赖于自然背压,在我们处理当前之前我们不会请求更多。
请试一试,不要犹豫,回来给我们一些反馈!