【发布时间】:2019-10-15 16:45:17
【问题描述】:
我们在一个用 Netty 编写的 AWS 网络 ELB(类似于具有长寿命连接的 Echo 服务器)后面有一个简单的 TCP 服务器,我正在尝试实现一个类似于 TCP 保持活动机制的保持活动机制来保持我们的空闲连接打开。不幸的是,我们不能依赖 TCP keep-alive 机制,因为 NELB 不会将 keep-alive TCP 数据包转发到负载均衡器的另一端。
我想做的是监视空闲连接并向客户端发送一个空字符串(空字节数组)。到目前为止,我在代码中所做的是:
- 添加带有一些超时值的
IdleStateHandler - 注册一个
GprsKeepAliveHandler,ChannelDuplexHandler的子类,覆盖userEventTriggered方法发送(ctx.writeAndFlush)Unpooled.EMPTY_BUFFER。
这样,如果连接断开,我希望收到一个 RST 数据包。否则连接将再次激活。
问题是 Netty 没有对空消息做任何事情,它没有向客户端发送任何数据包(由 Wireshark 监控)。如果我将消息更改为Unpooled.wrappedBuffer(new byte[]{0}),我会看到我希望看到的内容。
问题
- 我找不到更好的方法来实现我的目标(保持连接活动并检测死连接)。如果有更好的方法,请告诉我。
- 在 Netty 中发送空消息的正确方法是什么? (我看到了this 的问题,但没有帮助)
- 如果问题是由操作系统 TCP 堆栈行为引起的,有没有办法解决这个问题?
【问题讨论】: