Websocket 采用码头腹板箱进行流量控制

Websocket 采用码头腹板箱进行流量控制,websocket,jetty,Websocket,Jetty,我试图使用WebSocket作为应用程序协议(这里没有浏览器),但遇到了流控制问题。。。我目前正在使用Jetty 9.1.0.RC0和WebSocketServlet以及@WebSocket 第一种情况是,消息传入的速度快于我处理它们的速度。在这种情况下,我想暂停从该套接字读取数据,让TCP背压完成它的任务。这在以前的应用程序中非常有效(当然是非websocket)。我认为Session.suspend()可能会执行我想要的操作,但它似乎没有任何影响,并且返回的标记为null 有没有办法怀疑阅读

我试图使用WebSocket作为应用程序协议(这里没有浏览器),但遇到了流控制问题。。。我目前正在使用Jetty 9.1.0.RC0和WebSocketServlet以及@WebSocket

第一种情况是,消息传入的速度快于我处理它们的速度。在这种情况下,我想暂停从该套接字读取数据,让TCP背压完成它的任务。这在以前的应用程序中非常有效(当然是非websocket)。我认为Session.suspend()可能会执行我想要的操作,但它似乎没有任何影响,并且返回的标记为null

有没有办法怀疑阅读?作为一个基于nio的连接器,Jetty将继续读取帧并对其进行缓冲,直到我能够处理它们为止,我宁愿暂停读取,也不必引入一些流控制消息

我的第二个例子是我将websocket消息发送到连接的客户端-这可能是一个浏览器,但并不总是。。。似乎我可以通过使用sendStringByFuture方法获得一些流控制,但是有没有一种方法可以在将来完成时获得回调,而不必等待或轮询它

由于我已经嵌入了jetty,并且正在将其用于SpringMVC,如果我能够在它上获得所需的流控制,以避免在另一个端口上运行类似Netty的东西,那就太好了


谢谢。

Jetty和JSR API确实有一种即时回调的编写风格。在码头,它是: sendBytes(ByteBuffer数据,WriteCallback回调) JSR API是: sendBinary(ByteBuffer数据,SendHandler)

两者都有文本消息等价物。但这两方面都存在一些问题。首先,如果回调用于流控制,那么回调将“在消息传输时收到通知”。对于高吞吐量而言,这不是最佳选择,因为这意味着下一条消息的发送将始终等待,直到前一条消息已被传输,因此没有机会将多条消息聚合为一次写入

如果对sentBytes或sendBinary的后续调用不等待回调,则它们可以将多个将被有效传输的帧排队,但问题是发送时没有背压,因此内部队列可能会永远增长

一个“解决方案”是有限的队列大小,但这样一来,对sendBytes的异步调用就会出现问题

我认为解决方案是为发送提供另一种回调形式,一旦消息排队等待传输,就会调用发送,但实际上不会传输。调用此回调后,可以重用/回收传递的所有缓冲区,并可以进行另一次调用和另一次对sendBytes/sendBinary的调用

也许是这样的:

公共接口QueuedWriteCallback扩展了WriteCallback { writeQueued(); }

对于JSR:

公共接口QueuedSendHandler扩展SendHandler { onQueued();
}

Session.suspend()错误是Jetty WebSocket中的一个错误。9.1最终版本将对其进行修复。是否还会有一个isReady等价物来确定写入是否不会被阻止,就像可以对http流进行写入一样?
Session.suspend()
用于读取暂停,而不是写入。请注意,WebSocket可以存在于其他协议中,用于多路复用并执行自己的流控制(SPDY中的WebSocket、HTTP/1.1+mux扩展或HTTP/2中的WebSocket),因此在WebSocket API中公开基于写的流控制通常被视为短期思维,随着时间的推移,这种思维越来越难以支持。当我将内容流式传输到我的WebSocket客户端时,我需要知道它们是否已备份(在jetty中进行缓冲,而不是发送到线路),这样我的应用程序就可以做正确的事情。jetty的方法是使用sendXByFuture,并在下次发送时检查未来的状态吗?