【问题标题】:Netty: Concurrency issues using multiple event loopsNetty:使用多个事件循环的并发问题
【发布时间】:2017-08-21 18:45:30
【问题描述】:

我有一个客户端连接到 n 个不同的服务器。所以,我正在创建 n 个不同的频道。
因为我的服务器超过 5000 台。我使用 10 个事件循环,只有一个事件循环组。此外,每个通道都有单独的管道。
我已经知道如果我将使用一个事件循环并且我还没有在 10 个事件循环上看到任何并发问题,那么不会有并发问题。我的问题是:
在下面的代码中,我会在healthTargets.storeHealthyTarget(InetAddress.getByName(remoteAddress)); 行遇到并发问题吗?为什么?
我怀疑会有并发问题。因为,如果多个事件循环都没有访问这个,那么使用多个事件循环有什么意义呢?

 @Override
    protected void channelRead0(ChannelHandlerContext channelHandlerContext, HttpObject httpObject) throws UnknownHostException {
        if(channelHandlerContext.channel().remoteAddress() != null)
        {
            String remoteAddress = remoteAddress(channelHandlerContext.channel().remoteAddress().toString());
            if (httpObject instanceof HttpResponse) {
                HttpResponseStatus responseStatus = ((HttpResponse)httpObject).getStatus();
                if (responseStatus.code() == HttpResponseStatus.OK.code())
                {
                    healthTargets.storeHealthyTarget(InetAddress.getByName(remoteAddress));
                }
            }
        }
    }

这里healthTargets.storeHealthyTarget只是使用HashSet来存储ip,healthTargets是一个单例类。

【问题讨论】:

  • 线程Bug是经常出现的Bug,而且这些Bug在被报告时通常很难重现,如果你遵循线程问题的接口规则,你应该是安全的

标签: java concurrency netty


【解决方案1】:

如果您在不同的 EventLoops 之间共享 Set 的相同实例(您似乎这样做),您将遇到问题。这是因为不同的 Channel 可能运行在不同的 EventLoops 等线程上。这意味着您需要使healthTargets 的访问成为线程安全的。

这与任何其他多线程程序没有什么不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多