Netty,并发 writeAndFlush

Posted

技术标签:

【中文标题】Netty,并发 writeAndFlush【英文标题】:Netty, concurrent writeAndFlush 【发布时间】:2018-11-27 04:17:09 【问题描述】:

假设我们有某种发布/订阅协议。当有人连接和订阅时,我们可以将频道保存在 Map、List 或 ChannelGroup 中:

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception 
    super.channelActive(ctx);
    log.debug("Client connected: ", ctx.channel().remoteAddress());
    clients.add(ctx);

之后,当有消息或事件发生时,我可以通知客户端:

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) 
    log.debug("Client  published msg: ", ctx.channel().remoteAddress(), msg);
    clients.foreach(client -> client.getChannel().writeAndFlush(msg));

让我们想象一下一些客户端同时发布消息(例如“msg1”、“abc2”)的情况。它会导致并发问题吗?例如,我可以在某些情况下检索“msabg1c2”而不是“msg1abc2”吗?还是 Netty 会处理这种情况?

【问题讨论】:

【参考方案1】:

通道是线程安全的,所以只要调用顺序正确,你就不应该有任何问题

【讨论】:

以上是关于Netty,并发 writeAndFlush的主要内容,如果未能解决你的问题,请参考以下文章

Netty writeAndFlush() 流程与异步

netty4在channel.writeAndFlush为啥还阻塞延迟

攻读netty源码,编码器

Netty 通过一个渠道写几条消息

Netty源码解析Netty核心源码和高并发高性能架构设计精髓

《Netty Zookeeper Redis 高并发实战》 图书简介