【发布时间】:2018-04-02 15:46:19
【问题描述】:
有一个 REST 端点,它为我的应用程序提供大量(数十 GB)数据。
应用程序按照自己的节奏处理数据,随着传入数据量的增长,我开始遇到 REST 端点超时。
意思是,处理速度低于网络直通输出。
不幸的是,没有办法足够提高处理速度,因为没有“足够”——传入的数据量可能会无限增长。
我正在考虑一种在处理之前在本地存储传入数据的方法,以便在超时发生之前释放 REST 端点连接。
到目前为止,我想出的是将传入数据下载到临时文件并使用 OutputStream/InputStream 同时读取(处理)所述文件。
缓冲排序,使用文件。
这带来了它自己的问题:
- 如果处理速度变得比下载速度更快
一些时间,我得到EOF?
- 文件解析器使用
ObjectInputStream 并且在空文件/ EOF的情况下表现得很奇怪
- 等等
有没有传统的方法来做这样的事情?
有替代解决方案吗?
请提供一些指导。
更新:
我想指出:http 服务器是我无法控制的。
将其视为供应商数据提供者。他们有很多消费者,并且拒绝只为一个而改变任何东西。
看起来我们是唯一使用他们所有数据的人,因为我们的客户端应用程序处理速度远远高于他们的示例客户端性能指标。尽管如此,我们仍然无法将我们的应用程序性能与网络直通输出相匹配。
服务器不支持 http 范围请求或分页。
没有办法将数据分成块来加载,因为没有过滤属性来保证每个块都足够小。
简而言之:我们可以在超时发生之前的给定时间内下载所有数据,但无法处理它。
在 inputstream 和 outpustream 之间有一个适配器,作为一个阻塞队列,将有很大帮助。
【问题讨论】:
-
听起来像back pressure 的情况。您是否考虑过像Reactor 或RxJava 这样的reactive streams 方法来解决这个问题?这些库具有良好的背压支持。
-
我对响应式流有点熟悉,但是如何对他无法控制的服务施加背压呢? (这里是http服务器)
-
在您的问题中,您不控制其余端点并不明显。
-
为什么您的客户端超时?你不是以这样的方式控制超时,只要你需要处理所有数据就可以让它等待吗?我可能误解了你的问题,但你提出的方式似乎表明问题完全与超时有关,所以我很想知道这个特定问题是否不能简单地在服务连接的配置中解决。
-
能否分享一个代码示例,如何读取远程文件?
标签: java performance rest buffer