我需要解码以高速率(> 1000 msgs/sec)传入的二进制消息,并使用JAVA将它们存储在数据库中(未决定哪一个)。将有多个 TCP 连接进入该服务器,每个连接都有自己的需要处理的二进制数据流。
消息没有被任何“标志”分隔。
消息的开头有一个 4 字节长度的字段。它后面是一个固定的标题。
消息的有效负载将依次是多条消息,每条消息都有一个固定的标头,后面是位掩码(32 位),用于确定存在哪些其他字段。每个位掩码字段为 32 位,位 32-30(MSB -32 / Big endian)指定每个可选字段的长度。所有其他位(29-1),如果“ON”表示该字段存在于消息中。
例如,如果位 32-30 是 100,而位 1 是“1”,那么字段 XXX 跟在位掩码字段之后,它是 4 个字节长。如果位 2 为“0”,则消息中不存在字段 YYY,依此类推。将存在多个位掩码字段(可选),但受最大数量限制。我是 java 新手(c/C++ 背景)所以问题可能......
1)我正在考虑以“主”线程接收连接并创建“工作线程A”来处理该套接字上的消息的常规方式设计应用程序。我正在考虑让配置文件驱动“workerThread A”是创建一个线程池来处理每条消息还是自己做。我将实施前者并检查性能,看看是否需要改进。我的问题是,netty或Apache Mina 是值得考虑的好选择吗?由于这是 POC 工作,我需要快速启动它。
2)我想到了使用 nio - SocketChannel 和 ByteBuffer。但似乎我无法从套接字读取指定数量的字节?我认为“readInt()”获取长度然后从套接字读取“length”字节数以获取完整的一条消息然后解析它会更容易。DataInputStream 是更好用的吗?使用 oio 和 nio 会对性能产生任何影响吗?
3)我应该查看任何框架来解码消息吗?我稍微查看了 Google 协议缓冲区,但它似乎不支持解码位掩码字段。