2017-06-25 68 views
0

林学习阿卡流,但显然其相关的任何流框架:)发送到服务器的消息在源达到绑定后实现流处理会发生什么?

报价阿卡文档:

无流仅仅是定义如何在异步边界移动 数据没有一个共同的机制损失,缓冲或 资源耗尽

现在,从我的理解是,如果前,直到流,让我们例如http服务器,请求会来当接收方wasent完成了一个请求,所以新的请求将被收集到一个缓冲区中,该缓冲区将保存等待的请求,然后存在一个问题,即该缓冲区的大小未知,并且在某些时候如果服务器过载我们可以放弃正在等待的请求。

然后,流处理开始发挥作用,它们将缓冲区限制为可控制的......所以我们可以预先定义我们想要的消息数(在我的示例中为请求),并且我们可以在一次。

我的问题是,如果我们的服务器实现一个源代码最多可以有3条消息,那么如果第四个代码发生什么事情呢?

我的意思是当另一个服务器会打电话给我们,我们已经处理了3个请求......他的请求会发生什么?

回答

2

你所描述的实际上并不是Reactive Streams实现解决的主要问题。

使用常规网络工具解决了请求数量方面的背压问题。例如,在Java中,您可以将网络库的线程池(例如Netty)配置为某种并行性级别,并且该库将负责尽可能多地接受请求。或者,如果您使用同步套接字API,则更简单 - 您可以推迟在服务器套接字上调用accept(),直到为所有当前连接的客户端提供服务。无论哪种情况,任何一方都没有“缓冲区”,只是直到服务器接受连接,客户端才会被阻塞(在阻塞API的系统调用中,或在异步API的事件循环中)。

Reactive Streams实现解决的问题是如何处理更高级别数据管道中的背压。反应性流实现(例如akka流)提供了一种构建数据流水线的方法,其中当数据消费者速度缓慢时,生产者也会自动减慢速度,并且这将适用于任何类型的底层传输,无论是HTTP,WebSockets,原始TCP连接还是进程内消息。例如,考虑一个简单的WebSocket连接,其中客户端发送连续的信息流(例如来自某个传感器的数据),并且服务器将该数据写入某个数据库。现在假设服务器端的数据库由于某种原因变得很慢(网络问题,磁盘过载等等)。服务器现在无法跟上客户端发送的数据,也就是说,在新的数据到达之前,服务器无法及时将其保存到数据库中。如果您在整个流程中使用反应流实施,则服务器会自动向客户端发送无法处理更多数据的信号,并且客户端将自动调整生产率以避免服务器过载。

当然,这可以在没有任何反应流实施的情况下完成,例如,通过手动控制确认。但是,与许多其他库一样,Reactive Streams实现为您解决了这个问题。它们还提供了一种定义这种管道的简单方法,通常它们具有用于各种外部系统(如数据库)的接口。特别是,这样的库可以在最低级别实施背压,直到TCP连接,这可能很难手动完成。

对于反应流本身,它只是一个API的描述,它可以由一个库实现,该库定义了常用术语和行为,并允许这些库可以互换或轻松交互。您可以使用规范中的接口将阿卡流管道连接到Monix管道,组合管道将无缝工作并支持Reacive Streams的所有背压功能。

+0

感谢您的一个很好的答案! –

相关问题