标签: netty

Netty比Tomcat慢

我们刚刚完成构建服务器以将数据存储到磁盘并使用Netty进行了前端处理.在负载测试期间,我们看到Netty扩展到每秒约8,000条消息.鉴于我们的系统,这看起来很低.对于基准测试,我们编写了一个Tomcat前端并运行相同的负载测试.通过这些测试,我们每秒获得大约25,000条消息.

以下是我们的负载测试机的规格:

  • Macbook Pro Quad核心
  • 16GB的RAM
  • Java 1.6

这是Netty的负载测试设置:

  • 10个主题
  • 每个线程100,000条消息
  • Netty服务器代码(非常标准) - 服务器上的Netty管道是两个处理程序:FrameDecoder和处理请求和响应的SimpleChannelHandler.
  • 客户端JIO使用Commons Pool来池和重用连接(池的大小与线程数相同)

以下是Tomcat的负载测试设置:

  • 10个主题
  • 每个线程100,000条消息
  • Tomcat 7.0.16,默认配置使用Servlet来调用服务器代码
  • 客户端使用URLConnection而没有任何池

我的主要问题是为什么表现如此巨大?有没有明显的Netty可以让它比Tomcat运行得更快?

编辑:这是主要的Netty服务器代码:

NioServerSocketChannelFactory factory = new NioServerSocketChannelFactory();
ServerBootstrap server = new ServerBootstrap(factory);
server.setPipelineFactory(new ChannelPipelineFactory() {
  public ChannelPipeline getPipeline() {
    RequestDecoder decoder = injector.getInstance(RequestDecoder.class);
    ContentStoreChannelHandler handler = injector.getInstance(ContentStoreChannelHandler.class);
    return Channels.pipeline(decoder, handler);
  }
});

server.setOption("child.tcpNoDelay", true);
server.setOption("child.keepAlive", true);
Channel channel = server.bind(new InetSocketAddress(port));
allChannels.add(channel);
Run Code Online (Sandbox Code Playgroud)

我们的处理程序看起来像这样:

public class RequestDecoder extends FrameDecoder {
  @Override
  protected ChannelBuffer decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buffer) …
Run Code Online (Sandbox Code Playgroud)

java io tomcat netty

26
推荐指数
1
解决办法
1万
查看次数

哪个NIO库(Netty,Grizzly,kryonet,...)用于Java中的简单后端服务器实现?

我们的前端是简单的Jetty(稍后可能会被Tomcat替换)服务器.通过servlet,我们提供了一个公共HTTP API(或多或少RESTful)来公开我们的产品功能.

在后端,我们有一个Java进程,它可以执行多种维护任务.虽然后端进程通常会在有时间的情况下执行自己的任务,但是前端需要唤醒后端以在后台执行某项任务.

哪个(N)IO库是这项任务的理想选择?我找到了Netty,Grizzly,kryonet和普通的RMI.现在,我倾向于说Netty,它似乎很简单,它可能非常可靠.

你们有没有这种设置的经验?你会选择什么?

谢谢!

java rmi grizzly netty kryonet

22
推荐指数
1
解决办法
1万
查看次数

找出当前Java VM中打开的网络套接字

我正在编写一个端到端测试,我的Java程序发布了它的所有资源 - 线程,服务器套接字,客户端套接字.它是一个库,因此通过退出JVM释放资源不是一种选择.测试线程的释放很容易,因为您可以向ThreadGroup询问其中的所有线程,但我还没有找到一种获取当前JVM正在使用的所有网络套接字列表的好方法.

有没有办法从JVM获取所有客户端和服务器套接字的列表,类似于netstat?我在Java 7上使用NettyOIO(即java.net.ServerSocketjava.net.Socket).该解决方案需要在Windows和Linux上运行.

我的第一个偏好是使用纯Java从JVM中询问它.我试图寻找一个MX Bean或类似的,但没有找到任何.

另一个选择可能是连接到JVM的分析/调试API并询问Socket和ServerSocket的所有实例,但我不知道如何做到这一点以及是否可以在没有本机代码的情况下完成(AFAIK,JVMTI仅限本机) ).此外,它不应该使测试变慢(即使我最慢的端到端测试只有0.5秒,其中包括启动另一个JVM进程).

如果询问JVM不起作用,第三种选择是创建一个设计,在设置时跟踪所有套接字.这样做的缺点是可能会遗漏一些创建套接字的地方.由于我使用Netty,它似乎可以通过包装ChannelFactory和使用ChannelGroup来实现.

java sockets monitoring netty

22
推荐指数
2
解决办法
1万
查看次数

Netty java从ByteBuf获取数据

如何ByteBuf在下面的代码中有效地获取字节数组?我需要获取数组然后序列化它.

package testingNetty;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

public class ServerHandler extends  ChannelInboundHandlerAdapter {
     @Override
        public void channelRead(ChannelHandlerContext ctx, Object msg) {
         System.out.println("Message receive");
         ByteBuf buff = (ByteBuf) msg;
             // There is I need get bytes from buff and make serialization
         byte[] bytes = BuffConvertor.GetBytes(buff);
        }

        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { 
            // Close the connection when an exception is raised.
            cause.printStackTrace();
            ctx.close();
        }

}
Run Code Online (Sandbox Code Playgroud)

java netty

22
推荐指数
2
解决办法
3万
查看次数

高性能网络的Netty替代品有哪些?

我正在选择一个网络库来实现一个不能消耗任何微秒的客户端/服务器系统.它将实现自己的协议来发送和接收消息.我正在寻找一个好的NIO框架,这将允许我轻松开发服务器和客户端,而不必过多担心低级别的选择器细节.每个人都建议我使用Netty,但在向团队提交框架之前,我想尝试2或3个其他选择.我不太喜欢Netty的一件事是它如何使用自己的ByteBuf实现和引用计数来处理ByteBuffers.谁能分享你的想法和选择?

java networking nio real-time netty

22
推荐指数
3
解决办法
3万
查看次数

在Play上强制执行SSL!骨架

我正在使用Play!1.2.2及其新的Netty客户端框架.

我没有找到一种直接的方法来强制执行SSL,尽管可以使HTTP和HTTPS异步服务.有没有人与Play合作过!有一个简单的方法来执行SSL?不确定我是否需要创建重定向,或者是否可以在conf文件中快速解决此问题.

java scala netty playframework

21
推荐指数
2
解决办法
5256
查看次数

基于Netty的非阻塞REST框架

我正在开发一个需要高可伸缩性的RESTfull应用程序.我正在考虑基于Netty的RESTfull应用程序框架.我浏览了一些可用的选项,并尝试将它们作为非阻塞实现提供.以下是我的发现:

  1. rest.li - >仍处于基于Netty的NIO实施的试验阶段.所以,不准备生产.
  2. RESTEasy - >支持Netty 4.x的标准JBoss项目.但是,RESTEasy不是基于Netty的完整堆栈NIO实现,而是Netty和RESTEasy之间的缓冲交换.它没有利用Netty的优势.因此,可扩展性不如基于Netty的框架所预期的那么高.
  3. Netty-http组件 - >另一个选项是Apache Camel集成,同时使用Netty-http组件作为端点,用于将请求路由到bean中公开的服务.我认为它与RESTEasy相同,只有Netty-http组件使用基于Netty的NIO功能,而系统的其余部分将使用旧的IO.我不认为我会在获得scalabiltiy方面帮助太大.
  4. RESTExpress - >它声称是基于Netty的RESTFull应用程序框架.但是,对于需要高度安全性的企业应用程序而言,它既没有一个像样的社区,也没有可信任(因为它是非常新的).

在得到上述发现之前,我想使用一些随时可用的框架并更快地完成工作.

我知道这是一个基于意见的问题.但是,我仍然非常需要帮助为我的应用程序选择正确的框架.如果以防万一,没有基于Netty的REST框架:在我的应用程序中使用基于Netty的低级NIO代码是否明智?任何帮助赞赏.提前致谢.

java rest nio resteasy netty

21
推荐指数
2
解决办法
3万
查看次数

在Netty 4.0中创建一个ByteBuf

两个简单的问题,我无法通过阅读文档解决:

  1. 我有一个 byte[]
    • 我怎么能把它转换成ByteBuf
  2. 我有一个NIO ByteBuffer
    • 我怎么能把它转换成ByteBuf

java nio netty

20
推荐指数
1
解决办法
2万
查看次数

关于Netty的书籍和文章

有关于如何使用Netty的一些好文章/书籍吗?文档很简短,从Javadoc中学习并不简单.

谢谢

java netty

19
推荐指数
2
解决办法
9533
查看次数

无法在Java 9中为自动生成的模块名称派生模块描述符?

我的项目依赖于Netty Epoll传输.这是依赖:

<dependency>
    <groupId>io.netty</groupId>
    <artifactId>netty-transport-native-epoll</artifactId>
    <version>${netty.version}</version>
    <classifier>${epoll.os}</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)

此依赖项的自动生成的模块名称为:

netty.transport.native.epoll
Run Code Online (Sandbox Code Playgroud)

由于native关键字是在Java 9中保留的,我无法将此模块作为依赖项添加到我的项目中:

module core {
    requires netty.transport.native.epoll;
}
Run Code Online (Sandbox Code Playgroud)

由于:

module not found: netty.transport.<error>
Run Code Online (Sandbox Code Playgroud)

此外,jar工具--describe-module报告以下内容:

无法导出模块描述符:网状输送本地-epoll的-4.1.17.Final-快照Linux的x86_64.jar netty.transport.native.epoll:无效的模块名称:"天然"是不是Java标识符

有没有解决方法?(当然,除了"发布正确的网络工件").

编辑:

作为维护者的快速修复 - 您可以添加下一行来构建:

<manifestEntries>
   <Automatic-Module-Name>netty.transport.epoll</Automatic-Module-Name>
</manifestEntries>
Run Code Online (Sandbox Code Playgroud)

java netty java-9 java-module module-info

19
推荐指数
1
解决办法
6923
查看次数