在什么情况下 ChannelPipeline 会删除其所有元素?

莱尔德纳尔逊

我正在对 Netty 应用程序进行负载测试。

根据诺曼·毛尔的建议该应用程序大量使用EventExecutor 可访问对象ChannelHandlerContext#executor()提交任务(我以这种方式提交的任务保留了对提交时生效的引用。)ChannelHandlerContext

在观察到应用程序中的奇怪行为后,我记录了ChannelHandlerContext.pipeline().toMap()这些任务之一的输出,因为它由EventExecutor(定义)事件循环执行。

如此记录的管道令人惊讶(对我而言)是空的。

(我从更传统的channelRead方法中记录了管道,不用说它不是空的。)

我的应用程序中没有任何逻辑可以从ChannelPipeline.

我没有关闭任何通道(客户端要求连接保持活动状态)。

我很确定我一定做错了什么——也许我不清楚 a 何时ChannelPipeline超出范围或以其他方式“清除”。当一个ChannelPipeline由Netty中清除出去?

德米特里·杜曼斯基

Netty 本身不会从管道中删除处理程序。ChannelPipeline当不再使用时(通道保持ChannelPipeline关闭)由 GC 收集为常规 Java 对象

因此,要么您在代码中执行此操作(但您没有执行此操作),要么使用通道销毁管道。在您进行负载测试时,我的建议是:

  • 您在服务器上创建负载;
  • 测试客户端无法处理足够的负载并关闭一些连接(在高负载测试中很常见的情况);
  • Netty 看到连接已关闭并删除通道(以及带有它的管道)并用 GC 收集它;
  • 因此,您仍然拥有引用已删除通道的上下文;

在负载下,这个 ChannelHandlerContext “被删除”,因此提交的写入任务在事件循环运行时不能发生。

这是预期的。频道可能随时不可用。因此,如果您将任务委托给某个线程池,您应该检查通道是否仍然处于活动/可写状态,或者您可以ChannelFuturewrite()操作中使用它。

更新:

根据您的需要,您有多种选择。您可以在实际写入之前检查通道是否可写:

if (ctx.channel().isWritable()) {
    //write
}

您可以检查ChannelFuture写操作的结果:

ChannelFuture cf = ctx.writeAndFlush();
//cf has a bunch of method + listeners that you can use

您也可以使用ChannelPromise并覆盖所需的方法。

Netty 非常灵活,并提供了许多可能的流程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在什么情况下删除指针

在什么情况下会推/拉git替换

在什么情况下PDO:execute()会返回false?

在什么情况下此宏会导致错误?

在什么情况下jQuery sortable会默默失败?

在什么情况下time.h会失败?

在什么情况下静默登录会失败?

苹果在什么情况下会重置“ advertisingIdentifier”?

在什么情况下会重建Docker项目?

.NET程序在什么情况下会终止?

用户/超级用户在什么情况下会更改文件所有者的权限?

应用程序在什么情况下会删除Firebase实例ID?

删除运算符在什么情况下会引发错误?

“tee”在什么情况下会删除它正在写入的文件?

在没有 PKCE 的情况下使用 OAuth2 授权码是什么情况

requestSessionCached 是做什么的,在什么情况下会变成真的

在什么情况下db.define_table()会返回None

Numpy在什么情况下会返回“除以零误差”?

在什么情况下,C Linker会消除未使用的易失符号?

Java的Scanner.hasNextLine()在什么情况下会阻塞?

在什么情况下忽略useReducer中的传播运算符会导致错误?

在什么情况下,自类型注释会提供扩展无法实现的行为

在什么情况下控制权会从用户空间传递到Linux内核空间?

在什么情况下Array.observe的“添加”事件会触发?

在什么情况下Java的field.setAccessible(true)会失败?

在什么情况下,Future.get()会抛出ExecutionException或InterruptedException

在什么情况下Neo4J的Rest API会返回404 Not Found?

PHP 5.5,在什么情况下PHP会导致很高的已提交内存

在什么情况下,通用子表达式消除会影响Haskell程序的惰性?