【问题标题】:Sending large data over a java web service通过 Java Web 服务发送大数据
【发布时间】:2013-01-08 20:08:17
【问题描述】:

我有一个返回大量数据的 Java Web 服务。有没有一种标准的方式来流式传输响应而不是尝试一次返回大量数据?

【问题讨论】:

  • 从设计的角度来看,您可以抛出整个块或通过 ajax 请求...假设您请求 10 个帖子然后到达堆栈的末尾,您触发另一个请求等等开,用 10000 替换 10 ,虽然我不确定你要做什么......将大数据分割成块已经由 TCP/IP 完成
  • 几百万个 json 行......显而易见的问题是为什么!
  • 我试图避免将整个数据集加载到服务器端的内存中。如果我有多个用户请求大型数据集,尝试将它们全部加载到内存中发送给客户端会导致内存问题。
  • 至于原因,我只是在做一些测试和理解来自网络服务的大数据流。它也可以是一个巨大的图像文件或我一次流式传输的东西。
  • 您使用的是 SOAP 还是 REST 服务?

标签: java web-services rest stream


【解决方案1】:

这个问题类似于带回大型 RSS 提要的旧问题。您可以通过参数化请求来做到这一点:http://host/myservice?start=0&count=100,或者在响应本身中包含下一个/上一个 URL。

后一种方法有很多优点。我会搜索一个描述它的链接,如果找到了,我会在此处发布。

【讨论】:

  • 我希望避免把工作交给客户(如果可能的话)。如果客户端可以只请求一个 URL 并以块的形式接收数据,那就太好了 - 但不确定这是否可能。
  • 取决于您的客户。 Http 确实支持分块。 en.wikipedia.org/wiki/Chunked_transfer_encoding
【解决方案2】:

我会研究类似comet 的方法:

来自维基:

Comet 是一种 Web 应用程序模型,其中一个长期持有的 HTTP 请求 允许网络服务器将数据推送到浏览器,无需浏览器 明确要求。

基本上,与其一次性发送大量数据,不如让您的网络服务器按照自己的节奏并根据您的需要推送数据。

【讨论】:

  • 我在这里并没有真正做服务器推送。它仍然是来自客户的按需请求。
  • 不,我的意思是一旦用户发出请求,服务器就会按照自己的节奏推送数据块。它有点像彗星,因为客户端不需要请求每个块,而是由服务器处理
  • 哦,我明白了。那讲得通。客户唯一需要的是“数据结束”标记或知道传输完成的东西。
  • http连接结束时客户端可以知道传输已经结束。
  • 最好区分成功和异常结束的传输,但这些是实现细节
【解决方案3】:

Webservice 可能不是数据传输的好方法。

如果我是你,我想设置另一个服务,例如 FTP 或 SFTP。

服务端将数据放到FTP服务器的具体路径中,通过webservice响应将路径信息发送给客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多