问题标签 [netty]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
945 浏览

netty - 将 netty 与 Apache Camel 一起使用时出现死锁

我有一个严重的问题。我有一种情况,我需要向 netty 发送多条消息,这些消息都是由骆驼在同一个地方生成的,然后得到对每条消息的响应。

代码是这样的:

splitMessage 类生成至少 10 条消息,如果不是更多的话

第一条消息生成后,netty 会收到它,它会发送回复并转发它。现在生成了第二条消息,它被发送到 netty,这就是问题的开始。我总是会收到这样的错误:

我试图通过延迟消息来规避这个问题,但它没有帮助。我可以通过禁用死锁来克服错误,但这并不是真正的解决方案。

任何人都可以帮忙吗?

0 投票
2 回答
2325 浏览

netty - 在 ThreadPoolExecutors 中优先处理 Netty 任务

我在 netty 中实现了一个服务器,它处理用户请求、与中间件对话并发送响应。与到中间件的往返相比,I/O 预计可以忽略不计,因此为了最大限度地减少阻塞,我在 OrderedMemoryAwareThreadPoolExecutor 之上的管道中有一个 ExecutionHandler。到目前为止没有问题。

我正在研究服务器在重负载下的行为。从过去使用我们协议的经验来看,我们往往会被意外的 DOS 攻击所淹没——最常见的是,用户的脚本陷入无限循环或类似情况。理想情况下,一旦他们的频道超过一定的使用阈值,我们就可以取消他们的频道的优先级,这样其他用户的服务就不会受到影响。

我已经实现了一个简单的 ThreadPoolExecutor,它使用 PriorityBlockingQueue 并根据从我们自己的 Session 类(附加到 ChannelHandler 中的上下文)提取的数据设置优先级。同样,到目前为止没有问题。

当尝试利用 netty 的内置 ThreadPoolExecutors 的排序和内存感知时,困难就来了。理想情况下,MyThreadPoolExecutor 可以扩展 OrderedMemoryAwareThreadPoolExecutor 并连接到优先队列的东西中。唉,这是不可能的,原因有两个:私有和最终。更详细地说:

a) ThreadPoolExecutor.workQueue 可以在其构造函数中设置,但 MemoryAwareThreadPoolExecutor 将其硬编码为 LinkedTransferQueue,并且不会将其公开给其子 OrderedMemoryAwareThreadPoolExecutor(即 MyThreadPoolExecutor 无权设置它)。如果有必要,这可以通过一些基于反射的私有字段调整来克服。

b) 我希望能够覆盖 MyThreadPoolExecutor.doUnorderedExecute(),以便我可以插入优先级处理并构造必要的对象,但它被声明为 final。调用它的代码不需要更改。

结果是为了保留所有漂亮的网络功能,但使用优先级队列,我必须复制'n'粘贴 OrderedMemoryAwareThreadPoolExecutor 和 MemoryAwareThreadPoolExecutor,调整每行几行,然后从那里扩展。这对我来说并不是很好的编码习惯!即使考虑到它也会敲响警钟。

现在问几个问题:

1)我解决了错误的问题吗?我是否完全为我想要实现的目标而吠叫错误的树?

2)如果没有,有没有比上面讨论的更好的方法?

3) 上述方法带来了总服务器负载始终处于容量状态的去优先级任务的饥饿风险。对于“淘气”的用户,我准备容忍这种情况,但是一旦他们恢复正常状态,他们现有的任务仍然会挨饿,为了保持排序,必须在他们后面添加任何新的、更高优先级的任务。您对如何最好地处理这个问题有什么建议吗?(企业不允许禁止用户。)

4)这是一半的问题,一半的反馈。OrderedMemoryAwareThreadPoolExecutor 的 netty 文档有一个方便的线程 X 和 Y 图表 - 大概这些是 ThreadPoolExecutor 中池化的线程而不是 I/O 工作线程?可能值得更清楚地说明这一点。此外,当不使用 ExecutionHandler 时,每个通道都绑定到单个 I/O 工作线程 - 在 ExecutionHandler 之后仍然是这种情况吗?即任务添加到 ExecutionHandler 的顺序是否保证与它们​​到达 Channel 的顺序相同?如果是这种情况,那么我看不到 MemoryAwareThreadPoolExecutor 文档中的线程 X 如何在事件 1 之前处理事件 2 - 我接受这里不同的线程可以按任何顺序完成工作,但我不能 看不出如何将工作无序地分配给同一个线程(它从 workQueue 中弹出)。ExecutionHandler 中的文档暗示了这一点,但会从更多细节中受益。

非常感谢您的阅读,非常感谢任何帮助。

0 投票
2 回答
705 浏览

netty - 在 Netty 中使用 protobuf 扩展实现通用分发器

我想使用 Netty 和 Protobuf 来实现消息分发器。分发器将是一个服务器,它知道基本 protobuf 消息并知道它具有扩展,并将它们传递给注册这些扩展的其他类。

Protobuf 允许在单独的文件中声明扩展,因此分发者不需要知道扩展的格式。然而,这似乎与 Netty 管道一起工作,我需要使用知道所有扩展的 ExtensionRegistry 创建 ProtobufDecoder,否则我会遇到这里描述的问题。

我在这里遗漏了什么,还是如果不编写自己的解码器就无法做到这一点?如果有 Java 中的示例,那将非常有帮助。

0 投票
2 回答
6920 浏览

java - 为什么 JDK NIO 使用了这么多 anon_inode 文件描述符?

我正在使用 Sun 的 JDK 1.6.0_26 和 NIO(带有 Netty),在 lsof 中我看到了数百个文件描述符anon_inode

我找不到关于什么是匿名 inode 的明确解释,我查看fs/anon_inodes.c了 Linux 内核的源代码树,似乎可能epoll使用它,但我不确定为什么会有这么多。我确实有多个“epoll 循环”和计时器线程,但没有我的anon_inode.

0 投票
1 回答
389 浏览

java - 如何使用 netty 实现机器人

我已经和netty一起工作了几个月,我有一个大问题要问。

我正在尝试制作 MMO 游戏,我希望非玩家角色 (NPC) 能够在游戏中移动,对真实的用户交互做出反应(并且其他用户也可以实时看到)。

这样做的最佳方法是什么?

我在想我可以创建一个“假用户”,但我不知道如何将它连接到我正在使用的套接字服务器。

顺便说一句:我正在使用从 iPhone 设备到服务器的 TCP 连接作为客户端。

谢谢!

0 投票
2 回答
1161 浏览

http - 在 netty HTTP 服务器中支持 Range 请求

是否可以构建一个支持Range 请求的管道?或者,如果我想自己实现这种支持,有人可以指出我应该查看的 API 部分吗?

(受https://github.com/webbit/webbit/issues/49的启发)

0 投票
2 回答
2368 浏览

java - 使用 Netty 最小化内存使用的正确方法

我在 Netty 中有两个场景,我试图最小化内存副本并优化内存使用:

(1) 读取一个非常大的帧(20 兆比特)。

(2) 读取大量非常小的帧(20 兆比特,每帧 50 比特)以在管道中的更高级别重建为一条消息。

对于第一种情况,当我在帧的开头得到一个长度时,我扩展了 FrameDecoder。不幸的是,由于我没有看到如何将长度返回给 Netty(我只指出帧是否完整),我相信 Netty 正在经历多个填充缓冲区、复制和重新分配周期,因此使用的内存比所需的更多。我在这里缺少什么吗?或者如果我期望这种情况,我应该完全避免使用 FrameDecoder 吗?

在第二种情况下,我目前正在创建我使用 ChannelBuffers.wrappedBuffer 包装的所有小帧的链接列表(然后我可以将其包装在 ChannelBufferInputStream 中),但我再次使用的内存比我预期的要多得多(也许因为分配的 ChannelBuffers 有空闲空间?)。这是使用 Netty ChannelBuffers 的正确方法吗?

0 投票
1 回答
772 浏览

xmpp - XMPP 消息未在 openfire 传递

早些时候,我使用 smack 作为客户端库并将消息发送到 openfire,它工作正常。

现在我想使用 netty 和 smack 来建立连接。我能够创建频道,openfire 向我显示创建的连接,但我无法将注册数据包发送到 openfire。我正在频道上写数据包,但它没有在 openfire 上交付。

你能帮忙吗?

0 投票
1 回答
2064 浏览

java - HTTP 分块响应错误处理

我正在构建一个 Web 应用程序,该应用程序将块输出回 Java netty 中的客户端。

我已经阅读并搜索了互联网并找到了以下资源:

总而言之,我相信无论http响应和/或先前的标头如何,都应该尊重带有“位置”的预告片标头。

但是在对 Firefox 和 Chrome 进行了一些黑盒测试之后。两种浏览器都不尊重尾随标头。

所以我的问题是

  • 首先,我错过了什么吗?
  • 其次,处理分块响应中的错误的理想解决方案是什么?
    • 我目前只知道在响应中间使用 javascripts。
  • 最后,我认为无论http响应代码如何都应该尊重HTTP Location标头,我错了吗?我上面链接的规范没有提到它必须是 3xx 标头,实际上也提到了 201 标头作为 Location 的可能情况,但没有一个主要浏览器尊重它。
0 投票
1 回答
1050 浏览

buffer - 如何在 Netty 3.2.6 中手动设置动态缓冲区的最小值?例如 2048 字节

我需要通过 TCP/IP 从其他 IP(导航设备)接收完整数据包。例如,设备必须定期(超过一分钟)发送 966 个字节。在我的情况下,第一个接收缓冲区的长度为 256 字节(第一个数据包),第二个是 710 字节(最后一个数据包),第三个是完整数据包(966 个字节)。如何手动设置第一个接收缓冲区长度的最小值?

这是我的一段代码: