我们刚刚完成构建服务器以将数据存储到磁盘并使用Netty进行了前端处理.在负载测试期间,我们看到Netty扩展到每秒约8,000条消息.鉴于我们的系统,这看起来很低.对于基准测试,我们编写了一个Tomcat前端并运行相同的负载测试.通过这些测试,我们每秒获得大约25,000条消息.
以下是我们的负载测试机的规格:
这是Netty的负载测试设置:
以下是Tomcat的负载测试设置:
我的主要问题是为什么表现如此巨大?有没有明显的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) 我们的前端是简单的Jetty(稍后可能会被Tomcat替换)服务器.通过servlet,我们提供了一个公共HTTP API(或多或少RESTful)来公开我们的产品功能.
在后端,我们有一个Java进程,它可以执行多种维护任务.虽然后端进程通常会在有时间的情况下执行自己的任务,但是前端需要唤醒后端以在后台执行某项任务.
哪个(N)IO库是这项任务的理想选择?我找到了Netty,Grizzly,kryonet和普通的RMI.现在,我倾向于说Netty,它似乎很简单,它可能非常可靠.
你们有没有这种设置的经验?你会选择什么?
谢谢!
我正在编写一个端到端测试,我的Java程序发布了它的所有资源 - 线程,服务器套接字,客户端套接字.它是一个库,因此通过退出JVM释放资源不是一种选择.测试线程的释放很容易,因为您可以向ThreadGroup询问其中的所有线程,但我还没有找到一种获取当前JVM正在使用的所有网络套接字列表的好方法.
有没有办法从JVM获取所有客户端和服务器套接字的列表,类似于netstat?我在Java 7上使用Netty和OIO(即java.net.ServerSocket和java.net.Socket).该解决方案需要在Windows和Linux上运行.
我的第一个偏好是使用纯Java从JVM中询问它.我试图寻找一个MX Bean或类似的,但没有找到任何.
另一个选择可能是连接到JVM的分析/调试API并询问Socket和ServerSocket的所有实例,但我不知道如何做到这一点以及是否可以在没有本机代码的情况下完成(AFAIK,JVMTI仅限本机) ).此外,它不应该使测试变慢(即使我最慢的端到端测试只有0.5秒,其中包括启动另一个JVM进程).
如果询问JVM不起作用,第三种选择是创建一个设计,在设置时跟踪所有套接字.这样做的缺点是可能会遗漏一些创建套接字的地方.由于我使用Netty,它似乎可以通过包装ChannelFactory和使用ChannelGroup来实现.
如何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) 我正在选择一个网络库来实现一个不能消耗任何微秒的客户端/服务器系统.它将实现自己的协议来发送和接收消息.我正在寻找一个好的NIO框架,这将允许我轻松开发服务器和客户端,而不必过多担心低级别的选择器细节.每个人都建议我使用Netty,但在向团队提交框架之前,我想尝试2或3个其他选择.我不太喜欢Netty的一件事是它如何使用自己的ByteBuf实现和引用计数来处理ByteBuffers.谁能分享你的想法和选择?
我正在使用Play!1.2.2及其新的Netty客户端框架.
我没有找到一种直接的方法来强制执行SSL,尽管可以使HTTP和HTTPS异步服务.有没有人与Play合作过!有一个简单的方法来执行SSL?不确定我是否需要创建重定向,或者是否可以在conf文件中快速解决此问题.
我正在开发一个需要高可伸缩性的RESTfull应用程序.我正在考虑基于Netty的RESTfull应用程序框架.我浏览了一些可用的选项,并尝试将它们作为非阻塞实现提供.以下是我的发现:
在得到上述发现之前,我想使用一些随时可用的框架并更快地完成工作.
我知道这是一个基于意见的问题.但是,我仍然非常需要帮助为我的应用程序选择正确的框架.如果以防万一,没有基于Netty的REST框架:在我的应用程序中使用基于Netty的低级NIO代码是否明智?任何帮助赞赏.提前致谢.
两个简单的问题,我无法通过阅读文档解决:
byte[]
ByteBuf?ByteBuffer
ByteBuf?我的项目依赖于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 ×10
netty ×10
nio ×3
grizzly ×1
io ×1
java-9 ×1
java-module ×1
kryonet ×1
module-info ×1
monitoring ×1
networking ×1
real-time ×1
rest ×1
resteasy ×1
rmi ×1
scala ×1
sockets ×1
tomcat ×1