Netty中降低writeAndFlush调用成本的优化方案咨询
优化Netty消息刷写性能的尝试与求优
我认为每次调用writeAndFlush的成本过高,因此进行了如下尝试:
- 最初尝试在
channelReadCompleted中使用flushQueue,但由于addMessage可能由其他线程调用,导致消息滞留在队列中,甚至可能无限阻塞。 - 于是实现了
Sender类,通过定时任务批量刷写消息,相关代码如下:
public class Sender { private final Session session; private final Queue<Message> messages = new ConcurrentLinkedQueue<>(); public ScheduledFuture<?> future; public Sender(Session session) { this.session = session; future = session.getCtx().executor().scheduleWithFixedDelay(this::flushMessages, 50, 50, TimeUnit.MILLISECONDS); } public void addMessage(Message message) { messages.add(message); } public void cancel() { future.cancel(false); } public void flushMessages() { Message message = messages.poll(); if (message != null) { ByteBuf buffer = PooledByteBufAllocator.DEFAULT.buffer(); do { buffer.writeBytes(message.getBuffer()); message.release(); message = messages.poll(); } while (message != null); session.getCtx().writeAndFlush(buffer); } } }
编辑补充:
我放弃了消息队列,改为直接写入channel并按固定间隔调用flush,但仍期待更好的方案。
futureFlushEvent = ctx.channel().eventLoop().scheduleAtFixedRate(ctx::flush, 100, 100, TimeUnit.MILLISECONDS);
内容的提问来源于stack exchange,提问作者ann
相关产品推荐
相关产品推荐

