Java Netty UDP服务器是否可以有多个eventloop线程?

Java Netty UDP服务器是否可以有多个eventloop线程?,java,multithreading,netty,Java,Multithreading,Netty,我正在尝试基于Netty构建一个UDP服务器,以便根据客户端订阅(在订阅设置之前交换一些UDP请求/响应消息)将事件(大约每秒500个事件)连续发布到不同的客户端 设计是由Java执行器创建一些生产者/消费者线程。生成消息后,使用者线程将其写入UDP通道 观察到,服务器端只有一个EventLoop线程在为该UDP通道工作,并且它非常忙于向套接字写入消息,因此对第二个和更高版本客户端的订阅请求的响应非常慢 所以想知道是否有任何方法可以为NIO UDP服务器端启用多个工作线程,以便一个或几个线程忙于

我正在尝试基于Netty构建一个UDP服务器,以便根据客户端订阅(在订阅设置之前交换一些UDP请求/响应消息)将事件(大约每秒500个事件)连续发布到不同的客户端

设计是由Java执行器创建一些生产者/消费者线程。生成消息后,使用者线程将其写入UDP通道

观察到,服务器端只有一个EventLoop线程在为该UDP通道工作,并且它非常忙于向套接字写入消息,因此对第二个和更高版本客户端的订阅请求的响应非常慢

所以想知道是否有任何方法可以为NIO UDP服务器端启用多个工作线程,以便一个或几个线程忙于将发布事件写入套接字,我们仍然有其他线程可以毫不延迟地处理新的客户端订阅请求。任何建议都将不胜感激


顺便说一句,服务器端Netty处理程序非常简单:一个日志处理程序、一个解码器处理程序、一个编码器处理程序和一个订阅处理程序。。。由于
频道总是绑定到一个
EventLoop
上,因此只有一个线程处理它。这就是说,如果您使用本机epoll传输(仅在linux上工作),您可以使用
EpollChannelOption。因此_REUSEPORT
将多个
通道
绑定到同一端口,这些端口由不同的
事件循环
s和
线程
s处理。

简短回答通常不。。。由于
频道总是绑定到一个
EventLoop
上,因此只有一个线程处理它。也就是说,如果您使用本机epoll传输(仅在linux上工作)您可以使用
EpollChannelOption.SO_REUSEPORT
将多个
通道
s绑定到同一端口,这些端口由不同的
EventLoop
s和SO
Thread
s处理。

您能给我看一下您的代码吗?也许您可以设置Bootstrap Bootstrap=new Bootstrap().group(new nieventloopgroup(N));创建N个线程。谢谢@mattia。下面是代码snipper-
code
Bootstrap udpBoot=new Bootstrap();udpBoot.group(新的NioEventLoopGroup(10).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST,true).option(ChannelOption.SO_REUSEADDR,true).handler(新的ChannelInitializer(){@Override protected void initChannel(DatagramChannel ch)抛出异常{ch.pipeline().addLast(logginghdler).addLast(新的MyDatagramToPojoDecoder(适配器)).addLast(新的MyPojoToTagRamencoder(适配器)).addLast(新的MySessionHandler(服务)).addLast(新的MySubscriptionHandler(服务));};
code
我猜Netty正在将EventLoop线程分配给不同的通道,但是在UDP中,只有一个通道,这样只有EventLoop线程工作。你能给我看看你的代码吗?也许你可以设置Bootstrap Bootstrap=new Bootstrap().group(new NioEventLoopGroup(N));创建N个线程。感谢@mattia。下面是代码snipper-
code
Bootstrap udpBoot=new Bootstrap();udpBoot.group(new NioEventLoopGroup(10).channel(NioDatagramChannel.class).option(ChannelOption.SO_BROADCAST,true).option(ChannelOption.SO_REUSEADDR,true).handler(new ChannelInitializer(){@Override.com.cn(DatagramChannel ch)抛出异常{ch.pipeline().addLast(loggingHandler).addLast(新的MyDatagramToPojoDecoder(适配器)).addLast(新的MyPojoToDatagramEncoder(适配器)).addLast(新的MySessionHandler(服务)).addLast(新的MySubscriptionHandler(服务));});
code
我猜Netty正在将EventLoop线程分配给不同的通道,但是在UDP中,只有一个通道,这样只有EventLoop线程工作。谢谢。但是注意到了这句话“还需要注意的是,此解决方案对于从不同远程传输地址接收的数据报非常有效。SO_REUSEPORT选项由内核实现,并将根据源传输地址将接收到的数据报发送到创建的套接字。”[.然而,这正是我们的情况,我们必须每毫秒向单个客户端发布大量消息。谢谢。但注意到了这句话”还需要注意的是,此解决方案对于从不同远程传输地址接收的数据报非常有效。SO_REUSEPORT选项由内核实现,并将根据源传输地址将接收到的数据报发送到创建的套接字。”[.然而,这正是我们的情况,我们必须每毫秒向单个客户端发布大量消息。