在java中排队字节数据

时间:2015-11-13 16:27:13

标签: java android

我希望通过网络不断传输数据。源代码为我提供了一个字节数组,我希望将其存储在一个数据结构中,作为缓冲区来补偿任何网络滞后。

以队列方式存储字节的最有效数据结构是什么。可以把它想象成一个管道,其中一个线程泵入数据,另一个线程通过网络读取和发送,而管道本身足够长,可以包含多个输入数据帧。

队列足够有效吗?

2 个答案:

答案 0 :(得分:2)

如果您将byte一次放入一个,那么队列就不会有效。它会占用大量内存,产生GC压力,并减慢速度。

如果您将合理大小(例如64kB)byte[]ByteBuffer放入其中,则可以使队列的开销合理。缓冲区大小可以根据性能实验进行调整和更改,甚至可以在运行时自适应。

TCP已经弥补了网络滞后。如果您正在使用UDP,那么您将需要正确处理拥塞或事情将会严重。在实践中,使用TCP或UDP直接创建了许多额外的工作和重新发明轮子。

ZeroMQ(或纯Java JeroMQ)是一个很好的库选项,具有高效的线程协议(对于实时股票交易平台而言足够好)。它透明地处理排队,并为不同的客户端模型提供了很多选项,包括像PUB SUB这样的东西,如果你在广播上有很多客户端会有所帮助。在一个过程中,ZeroMQ可以管理作为生产者和消费者的数据排队。您甚至可以使用它来有效地向使用相同流执行独立事务的工作人员广播相同的字节(例如:一个执行使用计量,另一个执行转码)。

还有其他库也可以使用。我认为Netty可以有效地处理这样的事情。

答案 1 :(得分:0)

您应该查看OKIO图书馆