wangyingfa 2021-10-10 13:02 采纳率: 0%
浏览 2671
已结题

netty 服务端推送sendBuf 满了后 一直阻塞 不会减少

netty 服务端向客户端推送大量数据,当服务端sendbuf 达到最高水位后(receivebuf空闲),不再继续推送数据,服务端sendbuf 却一直不下降,就卡在一个固定值了(64240),好像假死了,tcpdump 抓包 服务端能收到客户端的心跳数据,就是不能发送数据(服务netty channel iswriteble =false ,sendbuf 还是固定值)

查了下服务客户端的负载也在可接受的范围
netty 版本 4.1.66
服务端截图:

img

客户端截图:

img

下面是向客户端转发推送数据的代码片段:
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {

    Channel channel = ctx.channel();
    ProxyChannel userChannel=GlobalChannelGroup.getUserChannelByDispatcherShortId(channel.id().asShortText());
    Channel uc=userChannel.getChannel();
    if(uc!=null) {
      if(uc.isWritable()&&uc.isActive()) {
        try {
          //ChannelFuture  future=uc.writeAndFlush(msg);
          ChannelFuture  future= uc.writeAndFlush(safeDuplicate(msg));
          future.addListener((future1 -> {
            if (future1.isSuccess()) {
              LOGGER.info("代理-转发-成功-代:{}-用:{}-代:{}-用:{}",channel.id().asShortText(),uc.id().asShortText(),channel.remoteAddress(),uc.remoteAddress());
          } else {
              LOGGER.info("代理-转发-失败-代:{}-用:{}-代:{}-用:{}-{}--{}",channel.id().asShortText(),uc.id().asShortText(),channel.remoteAddress(),uc.remoteAddress(),uc.isActive(),future1.cause());
          }
         }));
          
        }finally{
          //LOGGER.info("-------------------------------------------V1");
        }
        
      }else {
        LOGGER.warn("channel:{},缓存已满-距离需消耗:{}--代理:{}-用户:{}", uc.id().asShortText(), uc.bytesBeforeWritable(),channel.remoteAddress(),uc.remoteAddress());
      }
    }else {
        LOGGER.info("获取用户链接不存在-或已经关闭---{}",channel.id().asShortText());
    }
}

img

img

img

img

  • 写回答

4条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 请采纳用户回复 10月21日
      • 系统已结题 10月18日
      • 修改了问题 10月11日
      • 修改了问题 10月11日
      • 展开全部

      悬赏问题

      • ¥15 unity 使用 Vuforia 导入Model target 成功后database下拉菜单不显示导入的内容
      • ¥15 VBA跨工作簿获取目标工作簿内已有数据的列号
      • ¥30 Dijkstra‘s 最短路径
      • ¥15 在线教育培训平台,主要以点播视频和在线练习测试为主,除将视频做切片外,有其他哪种方式降低流量?(关键词-带宽速率)
      • ¥20 用c语音或c++实现银行叫号系统
      • ¥15 人工智能 规则正向演绎和推理
      • ¥20 基于STM32F401的电子密码锁设计
      • ¥15 famamacbeth回归中遇到only size-1 arrays can be converted to Python scalars,求解答
      • ¥15 单片机多个自锁按键的编程实践
      • ¥15 用python操作redis存储中文后,再取出的数据变成了乱码怎么办?