0

假设我们正在实现一个访问一些共享数据的服务,并且没有办法将这些数据划分为可以独立访问的部分。因此,在任何给定时间,不超过一个线程可以读取/写入这些数据。

解决此问题的正确但低效的方法是仅使用一些同步技术(信号量、监视器等),以便 Netty 工作线程不会通过同时访问共享数据(在服务请求时)来破坏共享数据。但是,整个锁定/解锁肯定会大大降低性能。

所以,第一个问题是:

如何将 Netty 配置为具有单个工作线程?

第二个是:

有什么好的设计可以解决共享数据在任何给定时间都不能由超过 1 个线程完成的问题?

1-worker 解决方案似乎解决了这个问题,但我想知道这会如何影响 Netty 的性能,因为可能有数以万计的客户端同时连接,发送请求并等待回复......

4

2 回答 2

1
  1. 给 SocketFactory 一个单线程执行器,或者
  2. 在管道中放置一个带有单线程执行器的共享 ExecutionHandler
于 2013-05-15T13:42:32.103 回答
0

只是@forty-two 的第二个选项的代码示例:

private final StringDecoder DECODER = new StringDecoder();
private final ByteArrayEncoder ENCODER = new ByteArrayEncoder();
private final CustomBusinessHandler SERVER_HANDLER = new CustomBusinessHandler ();

...

ServerBootstrap b = new ServerBootstrap();
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(1);
b.group(bossGroup, workerGroup).childHandler(new ChannelInitializer<SocketChannel>() {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();                     
        // the handlers are sharable
        pipeline.addLast(DECODER);
        pipeline.addLast(ENCODER);
        pipeline.addLast(SERVER_HANDLER);
    }
});

...

@io.netty.channel.ChannelHandler.Sharable
public class CustomBusinessHandler extends SimpleChannelInboundHandler{...}
于 2019-09-25T17:47:49.030 回答