Netty4的消息服务器,服务器端group.writeAndFlush(),客户端接受消息偶尔会错顺序

gordon76 发布于 2017/02/10 13:14
阅读 288
收藏 0

我有一个简单的Netty4的消息服务器,使用group.writeAndFlush()发消息的时候,客户端接受顺序偶尔会错。并发也不高。

服务器打印group.writeAndFlush()时的LOG4J日志打出来这样的,最后的数字是顺序号,服务器发送的顺序肯定是没错的。

2017-02-07 14:48:53  [ nioEventLoopGroup-2-3:772314 ] - [ INFO ]  消息A-1240
2017-02-07 14:48:53  [ nioEventLoopGroup-2-2:772315 ] - [ INFO ]  消息B-1241
2017-02-07 14:48:53  [ pool-15-thread-1:772768 ] - [ INFO ]  消息C-1242

但是客户端收到的是C - A - B

其中消息C是是服务器中的一个循环线程自己定时发的。

而且不同客户端接受错误的情况是不同的,出现的几率不一样,消息也不一样,但是都会出。

这个频率不高,1000多条才出一次,但是一次也要命啊!

 

加载中
0
二的基本算合格
二的基本算合格

先通过抓包的方式确定,当故障出现时网络包传输的次序是不是C-B-A。如果传输次序就是C-B-A,那就是server端写的问题,如果不是,那就是client端读的问题,猜测极有可能是channel并发写入或者读取导致的。

0
g
gordon76

引用来自“二的基本算合格”的评论

先通过抓包的方式确定,当故障出现时网络包传输的次序是不是C-B-A。如果传输次序就是C-B-A,那就是server端写的问题,如果不是,那就是client端读的问题,猜测极有可能是channel并发写入或者读取导致的。

测试用了2个客户端,一个出问题的时候,另外一个是正确的,所以感觉应该是channel的问题。

0
g
gordon76

用抓包工具看了,服务器发来的顺序就是错的。

0
无锡首席大都督程序员
netty久经考验了 应该是你的问题
0
g
gordon76

问题已经找到。

客户端提交消息,群发,执行:

invokeWriteNow

服务器机器人循环,群发消息时,执行:

safeExecuteOutbound(WriteTask.newInstance(ctx, msg, size, promise), promise, msg);

关键就在于:

if (executor.inEventLoop())

这两种方式是有时间差的,搞不好就会造成后发先至。

返回顶部
顶部