我需要解码使用JAVA以高速率(> 1000 msgs/sec)进入的二进制消息并将它们存储在数据库中(不会决定哪一个)。将有多个TCP连接进入该服务器,每个连接都有自己的需要处理的二进制数据流。使用java解码二进制消息
消息没有被任何“标志”分开。
消息的开始处有一个4字节长的字段。它后面是一个固定的标题。
消息的有效载荷将是反过来多个消息,每个都具有固定报头和随后的位掩码(32位),其确定哪些其他字段存在。每个位掩码字段是32位,而位32-30(MSB-32/Big endian)指定每个可选字段的长度。所有其他位(29-1),如果“开”表示该字段出现在消息中。
例如,如果比特32-30是100,并且位1为“1”,则场XXX如下所述位掩码字段,它是4个字节长。如果位2为“0”,则消息中不存在字段YYY,依此类推。 存在多个位掩码字段(可选),但受限于最大数量。 我是新来的java(C/C + +背景),所以问题可能...
1)我想以常规的方式设计的应用程序,“主”线程接收连接,并创建一个“工作者线程A“来处理该套接字上的消息。我正在考虑让配置文件驱动器“workerThread A”创建一个用于处理每条消息的threadPool还是独立执行它。我会执行前者并检查性能,看看是否需要改进。 我的问题是,网状或阿帕奇米娜不错的选择要考虑?由于这是一项POC工作,我需要尽快完成。
2)我想用nio - SocketChannel和ByteBuffer。但似乎我无法从套接字读取指定数量的字节?我认为,“readInt()”获取长度然后从套接字读取“length”字节数以获得完整的一条消息然后解析它会更容易。 DataInputStream更好用吗?使用oio vs nio会对性能产生什么影响?
3)我应该看看任何框架来解码消息?我稍微观察了一下Google协议缓冲区,但看起来好像它不支持解码位掩码字段。
谢谢,我这样走了,但还没有做过任何性能测试。 – user127091