You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:02:35