【问题标题】:Can Spring Integration cause a Reactive Application to block?Spring Integration 会导致响应式应用程序阻塞吗?
【发布时间】:2022-01-18 17:36:34
【问题描述】:

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

我想知道在完全非阻塞应用程序中使用 Spring Integration 及其类是否被认为是安全的,以及是否有任何陷阱我应该注意。

【问题讨论】:

    标签: spring spring-boot spring-integration project-reactor reactor-kafka


    【解决方案1】:

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

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

    出于线程切换的目的,Spring Integration 提供了 ExecutorChannelQueueChannel 实现。但是,FluxMessageChannel 在某些情况下非常适合。

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

    请试一试,不要犹豫,向我们提供反馈!

    【讨论】:

    • 谢谢!!您所说的“在我们处理当前的之前我们不会要求更多”到底是什么意思?是SI特性,还是说如果源有背压能力,SI就不会中断?
    • 你理解的“源背压能力”是什么?我的观点是 SI 中没有请求限制。只是因为它适用于流媒体和热源。因此,即使他们要求,SI 中的任何反应特性都是Long.MAX_VALUE - 没有限制。当当前线程(订阅者)为正在运行的数据执行一些逻辑时,任何可能被背压的东西都是很自然的。我不知道为什么要过多谈论背压,因为你只需要专注于基于 Reactor 运算符和 Spring Integration 反应特性的应用程序逻辑。
    • 我关注这个的原因只是为了确保我理解正确。非常感谢您的帮助!
    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    相关资源
    最近更新 更多