Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 作为客户端或服务器,Netty中的Loris速度较慢_Java_Netty - Fatal编程技术网

Java 作为客户端或服务器,Netty中的Loris速度较慢

Java 作为客户端或服务器,Netty中的Loris速度较慢,java,netty,Java,Netty,我对内蒂还很陌生,所以请跟我说实话。似乎有很多问题在问为什么specefic netty的实现很慢,以及如何让它更快。但是我的用例有点不同。我希望避免低级别的套接字实现(因此很麻烦),但我也知道阻止事件组是不好的。我知道我可以动态管理管道。我不确定我对netty的了解是否足够,不知道这是否可行,而且我也没有尝试过很多我还不知道是坏的东西(thread.sleep)。协议是HTTP,但我还需要它对其他协议有用 但我不知道的是,对于共享端口上的单个连接,如何降低服务器对客户端的响应速度,反之亦然?或

我对内蒂还很陌生,所以请跟我说实话。似乎有很多问题在问为什么specefic netty的实现很慢,以及如何让它更快。但是我的用例有点不同。我希望避免低级别的套接字实现(因此很麻烦),但我也知道阻止事件组是不好的。我知道我可以动态管理管道。我不确定我对netty的了解是否足够,不知道这是否可行,而且我也没有尝试过很多我还不知道是坏的东西(
thread.sleep
)。协议是
HTTP
,但我还需要它对其他协议有用


但我不知道的是,对于共享端口上的单个连接,如何降低服务器对客户端的响应速度,反之亦然?或者更贴切地说:我将在何处实现所需的慢度?我猜是where的编码器;但是由于netty的方法,我对什么没有一点模糊。

我希望有人能给出一个比这个更好(更解释性)的答案,但基本上所需要的是使用一个具有足够小的值的ChannelTrafficShapingHandler

例如,读写限制为512b、最大时间为6000ms、检查间隔为1000ms的2kb响应强制使用ChannelTrafficShapingHandler时响应时间为4000ms,在本地运行客户端和服务器时,不使用ChannelTrafficShapingHandler时响应时间为50ms。我预计在网络连接时,这些时间会急剧增加

final ChannelTrafficShapingHandler channelTrafficShapingHandler = new ChannelTrafficShapingHandler(
    getRateInBytesPerSecond(), getRateInBytesPerSecond(), getCheckInterval(), getMaxTime());
ch.addLast(channelTrafficShapingHandler);

你说你知道Thread.sleep是“坏”的,但这实际上取决于你想达到什么目的以及你把睡眠放在哪里。我认为,构建此功能的最佳方法是使用
DefaultEventExecutorGroup
将慢通道处理程序的处理卸载到非事件循环线程上,然后在处理程序中调用
Thread.sleep

从ChannelPipeline javadoc的“构建管道”部分下:

用户应该在管道中有一个或多个ChannelHandler来接收I/O事件(例如读取)和请求I/O操作(例如写入和关闭)。例如,典型的服务器在每个通道的管道中都有以下处理程序,但您的里程可能会因协议和业务逻辑的复杂性和特征而有所不同:

协议解码器-将二进制数据(例如ByteBuf)转换为Java对象。 协议编码器-将Java对象转换为二进制数据。 业务逻辑处理程序-执行实际的业务逻辑(例如数据库访问)。 它可以表示为如下示例所示:

static final EventExecutorGroup group = new DefaultEventExecutorGroup(16);
...

ChannelPipeline pipeline = ch.pipeline();

pipeline.addLast("decoder", new MyProtocolDecoder());
pipeline.addLast("encoder", new MyProtocolEncoder());

 // Tell the pipeline to run MyBusinessLogicHandler's event handler methods
 // in a different thread than an I/O thread so that the I/O thread is not blocked by
 // a time-consuming task.
 // If your business logic is fully asynchronous or finished very quickly, you don't
 // need to specify a group.
 pipeline.addLast(group, "handler", new MyBusinessLogicHandler());
请注意,虽然使用DefaultEventLoopGroup将从EventLoop卸载操作,但它仍将按照ChannelHandlerContext以串行方式处理任务,从而保证排序。由于订购的原因,它仍然可能成为一个瓶颈。如果订购不是您的用例的要求,您可能需要考虑使用OrdRead Tead PoopEnviestExtor来最大化任务执行的并行性。


问题是什么?有代码吗?我希望我已经更新了以更好地反映这个问题。但是除了愚蠢的、考虑不周的尝试之外,我没有任何代码,这类工作违反了烦人的标准。你说的缓慢是什么意思?即所有IO事件,包括读写或只是初始连接?一个交通管理者可能是你想要的,但是这个问题还是太模糊了。管道生命周期中的任何一点都可以,但首先我要特别提到
如何降低服务器对客户端的响应速度。我将进入那门课。看起来很有希望。哦,我明白了!指定组会将线程卸载到该组,以便thread.sleep在该组上运行,而不是在IO线程上运行。太酷了!这将是有用的-我会看看我如何能使缓慢的洛里斯工作。但我相信
ChannelTrafficShapingHandler
很好地处理了Loris的慢速概念。感谢您的详细回答和新知识。有点名气