我怀疑我的 Netty 4.0.19 客户端服务器应用程序性能缓慢的编解码器不好。简单的消息对象由一个整数 id 和两个带有它们的长度的字符串组成。我在 ReplayingDecoder 中使用 CharsetDecoder 从字节中获取字符串:
msg.value = charsetDecoder.decode(in.readBytes(msg.valueLen).nioBuffer()).toString();
checkpoint(CDRMessageDecoderState.FIELD_MASK_METHOD);
在 ByteToMessageDecoder 我使用快速 Kryo 库进行序列化(可以避免在这里创建间接堆缓冲区吗?):
protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List<Object> out) throws Exception
{
if (!buffer.isReadable())
return;
// read header
if (contentSize == 0) {
contentSize = buffer.readInt();
}
if (buffer.readableBytes() < contentSize) {
return;
}
// read content
byte [] buf = new byte[buffer.readableBytes()];
buffer.readBytes(buf);
Input in = new Input(buf);
out.add(kryoCodec.readObject(in, CDRMessage.class));
contentSize = 0;
}
目前,ReplayingDecoder 似乎在某种程度上优于 ByteToMessageDecoder。此外,我在 DefaultEventExecutorGroup 中运行了一些简单的后端逻辑(所以我认为它不会阻塞事件线程),它使用 writeAndFlush 查找 HashMaps 并将消息写入 ChannelHandlerContext。谢谢