我需要使用 JAVA 以高速率(> 1000 条消息/秒)解码二进制消息并将它们存储在数据库中(未决定哪个)。将有多个 TCP 连接进入该服务器,每个连接都有自己需要处理的二进制数据流。
消息没有被任何“标志”分隔。
消息的开头有一个 4 字节长度的字段。后面跟着一个固定的标题。
消息的有效载荷依次是多条消息,每条消息都有一个固定的 header ,后跟位掩码(32 位),用于确定存在哪些其他字段。每个位掩码字段是 32 位,位 32-30(MSB -32/大端)指定每个可选字段的长度。所有其他位(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)我应该查看任何框架来解码消息吗?我看了一点谷歌 Protocol Buffer ,但它似乎不支持解码位掩码字段。
最佳答案
我会为每个连接创建一个工作线程。
我会使用 DataInputStream,除非你确定这还不够快。性能影响很小,但在 1000 msg/sec 时不太可能有影响。
我只会在消息到达时使用 JDK 对其进行解码。在这种情况下,我还没有找到第三方库来使事情变得更简单。
关于java - 使用java解码二进制消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11037948/