我正在将 Project Reactor 用于非阻塞 IO 数据管道,并且我正在考虑使用 Spring Integration 作为抽象层来管理管道中的所有流和组件。我目前正在使用 Project Reactor 实现 Kafka 消费者,我开始怀疑 Spring Integration 包装是否会在阻塞和背压方面损坏我的管道。
我想知道在完整的非阻塞应用程序中使用 Spring Integration 及其类是否被认为是安全的,以及是否有任何陷阱我应该注意。
我正在将 Project Reactor 用于非阻塞 IO 数据管道,并且我正在考虑使用 Spring Integration 作为抽象层来管理管道中的所有流和组件。我目前正在使用 Project Reactor 实现 Kafka 消费者,我开始怀疑 Spring Integration 包装是否会在阻塞和背压方面损坏我的管道。
我想知道在完整的非阻塞应用程序中使用 Spring Integration 及其类是否被认为是安全的,以及是否有任何陷阱我应该注意。
在大多数情况下,Spring Integration 组件是无状态的,因此它们在多线程(或非阻塞)环境中使用是安全的。如果您使用真正执行阻塞 IO 操作(例如文件写入或 JDBC INSERT)的特定通道适配器,您可能会遇到一些问题。在这种情况下,您需要考虑为此类操作切换到不同的线程,以免阻塞您的反应流。
请参阅 Project Reactor 中的相应配方:https ://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking
为此,Spring Integration 提供了一个ExecutorChannel
和QueueChannel
实现的线程切换目的。然而,这FluxMessageChannel
在某些情况下非常适合。
有限的背压在 Spring Integration 解决方案中没有意义,因为一切都被视为流,无限的数据流。因此,在大多数情况下,Spring Integration 依赖于自然的背压,在我们处理当前之前我们不会请求更多。
请尝试一下,不要犹豫,给我们一些反馈!