我如何处理Netty中的慢读者?

时间:2013-05-12 00:12:05

标签: java asynchronous netty

在我的应用程序中,我每个人都可以获取数千个文档。

我需要能够缓冲慢速阅读器,以便我可以继续处理其他阅读器,以便最大限度地利用磁盘和CPU。

这通常是怎么做的?我当然可以使用TCP发送缓冲区,但我认为这些会快速填满。

另一个策略是保留一个单独的缓冲区,它只是一个有界限的ChannelBuffers队列。

我认为如果这些缓冲区中的任何一个填满,我应该只是失败该客户端,因为它读取速度不够快?

2 个答案:

答案 0 :(得分:1)

使用TCP发送缓冲区。这是首先填补的东西。然后你开始获得零长度写入。那时你应该做两件事:

  1. 停止为该连接生成输出。
  2. 为OP_WRITE注册频道,当它触发时重试最后一次写入。如果成功,请取消注册OP_WRITE并继续正常。
  3. 在我看来,当它处于状态2时,你也应该从该频道停止读取。如果它仍在产生请求并且没有消耗响应,那就是它的问题,而不是你的问题。没有理由让你继续产生它没有阅读的反应,并且没有理由浪费你的记忆力来保持它们的存在直到它完全阅读它们。

答案 1 :(得分:0)

  

我需要能够缓冲慢速阅读器,以便我可以继续处理其他阅读器,以便最大限度地利用磁盘和CPU。

Netty真的为你照顾这个。由于你是单线程,你不能等待客户端读取任何东西,否则你将锁定你的单线程,没有任何反应。因此,您可以只写入您的ChannelBuffer,它不会阻止,并且在您将其返回到netty后,它将在稍后发送。因此,在发送或不发送到客户端的其他缓冲区时,释放您的线程以服务另一个客户端。因此,如果读者很慢,你最终会得到一个填满但不被阅读的ChannelBuffer。

现在,如果客户真的没有读取某些东西,你就会有一个ChannelBuffer(或许多)只占用空间,但是如果某些东西花了太长时间并清理它就可以用它来通知:

http://docs.jboss.org/netty/3.1/api/org/jboss/netty/handler/timeout/ReadTimeoutHandler.html

也有这个:

http://docs.jboss.org/netty/3.2/api/org/jboss/netty/handler/timeout/IdleStateHandler.html