mir*_*e_V 13 java rest performance buffer
有一个REST端点,它为我的应用程序提供大量(数十千兆字节)的数据块.
应用程序按照自己的步调处理数据,随着传入数据量的增长,我开始达到REST端点超时.
意思是,处理速度低于网络吞吐量.
不幸的是,没有办法提高处理速度,因为没有"足够" - 传入的数据量可能会无限增长.
我正在考虑在处理之前在本地存储传入数据的方法,以便在超时发生之前释放REST端点连接.
我到目前为止所做的是将输入数据下载到临时文件并使用OutputStream/InputStream同时读取(处理)所述文件.
使用文件进行缓冲.
这带来了它自己的问题:
是否有传统方法来做这样的事情?
有替代解决方案吗?
请提供一些指导.
Upd:
我想指出:http服务器不受我的控制.
将其视为供应商数据提供商.他们有很多消费者,拒绝为一个人改变任何东西.
看起来我们是唯一使用其所有数据的人,因为我们的客户端应用程序处理速度远远高于其示例客户端性能指标.尽管如此,我们无法将我们的应用性能与网络吞吐量相匹配.
服务器不支持http范围请求或分页.
没有办法将数据分成块加载,因为没有过滤属性来保证每个块都足够小.
简而言之:我们可以在超时发生之前的给定时间内下载所有数据,但无法处理它.
在输入流和outpustream之间有一个适配器,以pefrorm作为阻塞队列,将有助于一吨.
你正在使用类似的东西,new ObjectInputStream(new FileInputStream(..._)并且EOF的解决方案可以包装FileInputStream第一个WriterAwareStream,当作者写作时,在击中EOF时会阻止.
无论如何,如果延迟无关紧要,我不打算在下载完成之前开始处理.通常情况下,对于不完整的对象列表,您可以做的事情并不多.
也许像Chronicle-Queue这样的基于内存映射文件的队列可能对你有所帮助.它比直接处理文件更快,甚至可以更简单地使用.
您还可以在HugeBufferingInputStream内部使用队列来实现,该队列从其输入流中读取,并且如果它具有大量数据,则将它们吐出到磁盘.这可能是一个很好的抽象,完全隐藏缓冲.
还有FileBackedOutputStream在Guava中,当变大时会自动从使用内存切换到使用文件,但我担心,它针对小尺寸进行了优化(预计有几十GB,没有尝试使用内存).
有替代解决方案吗?
如果您的消费者(http 客户端)在跟上数据流时遇到困难,您可能需要考虑一种设计,其中客户端管理自己正在进行的工作,按需从服务器提取数据。
RFC 7233描述了范围请求
本地存储有限的设备可能会受益于仅请求较大表示的子集,例如非常大文档的单页或嵌入图像的尺寸
MDN Web Docs 站点上的HTTP Range 请求可能是一个更平易近人的介绍。