2012-06-14 145 views
3

我需要解码使用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协议缓冲区,但看起来好像它不支持解码位掩码字段。

回答

3

我会创建每个连接一个工作线程。

我会用DataInputStream类,除非你确定这是不是足够快。性能影响很小,但在1000 msg/sec时不太可能发生。

,因为它到达使用JDK,我只想解码消息。在这种情况下,我还没有找到第三方库来简化它。

+0

谢谢,我这样走了,但还没有做过任何性能测试。 – user127091

1

我会去与NIO和选择器模型。这是一个article(旧但仍相关),你可以阅读。

如果您想要实现超低延迟,那么您应该考虑将可重用的对象集中在一起,而不是创建新的对象。 GC不适合低延迟应用。

最后我会尝试使用来自Google的Protocol Buffers,因为它们非常高效且易于使用多种语言。

2

的Apache MINA是你的情况考虑一个非常好的选择。 Mina非常好地管理多个会话,并且非常可扩展。我们已经将它用于非常相似的情况,到目前为止我们对此非常满意。

我们已经开发使用MINA从数以千计的GSM设备的接收二进制消息网关,对其进行解码,并将其存储到数据库中。我们负载测试我们的网关超过2000个并发会话在Core2 Duo,4 GB RAM的服务器上连续发送数据。

可以,很干净,塞解码器和编码到它使用Codec Filters。文档也非常合理,您可以通过基本的JAVA知识轻松完成jump start