鉴于 TCP 提供本机流量控制,我正在研究为什么某些系统实现应用程序级背压。
我正在阅读,特别是akka-streams和(更高级别的讨论)反应流。
是不是只是把异步通信的思想抽象出了网络,脱离了TCP协议?
其他更准确的问题:
如果应用程序(比如 akka-streams 应用程序)最终通过 TCP 进行通信,它会退回到 TCP 的本机背压吗?
反应流是否通过简单地让 TCP 处理它来在 TCP 之上实现应用程序级背压?
任何帮助和指示将不胜感激!谢谢 :)
鉴于 TCP 提供本机流量控制,我正在研究为什么某些系统实现应用程序级背压。
我正在阅读,特别是akka-streams和(更高级别的讨论)反应流。
是不是只是把异步通信的思想抽象出了网络,脱离了TCP协议?
其他更准确的问题:
如果应用程序(比如 akka-streams 应用程序)最终通过 TCP 进行通信,它会退回到 TCP 的本机背压吗?
反应流是否通过简单地让 TCP 处理它来在 TCP 之上实现应用程序级背压?
任何帮助和指示将不胜感激!谢谢 :)
我认为您问题的基本假设是 TCP 是流管道中唯一的外部通信。
假设您的流通过多个 IO 通道(例如文件 IO、数据库查询和标准输出到控制台)进行通信:
//Read Data from File --> DB Query --> TCP Server Query --> Slow Function --> Console
akka-stream 实现将通过整个管道提供异步、背压支持。因此 akka-stream 必须为调用长时间运行的函数、查询数据库、读取文件、写入控制台等提供应用程序级的背压。
您是正确的,akka 对流TCP Server
部分的实现依赖于 TCP 的 "native backpressure"。从文档中:
...通过使用 Akka Streams,您不必手动对背压信号做出反应,因为该库会为您透明地执行此操作。