【问题标题】:How to configure Netty to have a single worker thread?如何将 Netty 配置为具有单个工作线程?
【发布时间】:2019-09-26 01:47:49
【问题描述】:

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

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

那么,第一个问题是:

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

第二个是:

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

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

【问题讨论】:

  • 您可以简单地处理不可变的共享数据:根本不需要锁定以避免损坏,并且每个工作线程都会获得数据的一致副本。
  • 问题是我正在处理的数据必须一直更改(实际上如果没有写入,那么我认为无论如何都不需要同步)。跨度>

标签: java thread-safety netty


【解决方案1】:
  1. 给 SocketFactory 一个单线程执行器,或者
  2. 在管道中放置一个带有单线程执行器的共享 ExecutionHandler

【讨论】:

    【解决方案2】:

    只是@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{...}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多