通过 Web 服务返回大结果

Posted

技术标签:

【中文标题】通过 Web 服务返回大结果【英文标题】:Returning Large Results Via a Webservice 【发布时间】:2010-09-05 22:10:08 【问题描述】:

我目前正在开发一项网络服务,返回的结果可能会非常大(> 5mb)。

这组数据这么大是完全有效的,网络服务可以称为同步或异步,但我想知道人们对以下方面的想法是什么:

    如果连接丢失,则 整个结果集必须是 重新生成并再次发送。有没有 我可以做任何事情 如果连接丢失,则“恢复” 还是重置?

    发送这么大的结果集是否合适?实现某种“分页”会更好吗?结果集生成并存储在服务器上,然后客户端可以以较小的数量下载结果集的块并在最后重新组装结果集?

【问题讨论】:

【参考方案1】:

我见过所有三种方法,分页存储和检索大规模推送

我认为您的问题的解决方案在一定程度上取决于您的结果集为何如此之大以及它是如何生成的。您的结果是否会随着时间的推移而增长,它们是一次计算然后推送的,您是否希望在获得结果后立即将它们流式传输回来?

分页方式

根据我的经验,当客户端需要快速访问与搜索结果中的页面类似的合理大小的结果集块时,使用分页方法是合适的。此处的考虑因素是您的协议的整体健谈性、客户端页面请求之间整个结果集的缓存和/或生成结果页面所需的处理时间。

存储和检索

当结果不是随机访问并且结果集随着查询的处理而增长时,存储和检索很有用。这里要考虑的问题是客户端的复杂性,以及是否可以向用户提供部分结果,或者是否需要在将任何结果返回给客户端之前计算所有结果(考虑对来自分布式搜索引擎的结果进行排序)。

海量推送

大规模推送方法几乎可以肯定是有缺陷的。即使客户端需要所有信息并且需要将其推送到单一结果集中,我还是建议采用WS-ReliableMessaging 的方法(直接或通过您自己的简化版本)并对结果进行分块。通过这样做你

    确保碎片到达客户手中 可以在收到客户收据后立即丢弃该块

正如其他人所说,在您知道结果集大小、生成方式以及整体性能成为实际问题之前,不要做任何事情。

【讨论】:

【参考方案2】:

对于 5 Mb 作为结果集大小没有硬性规定。超过 400 Mb 可以hard to send。

您将自动获得异步处理程序(因为您使用的是 .net)

实现某种“分页” 结果集被生成并存储 在服务器上,然后客户端可以 下载结果集的块 少量并重新组装 设置在他们的末尾

这已经发生在你身上——它被称为 tcp/ip ;-) 重新实现可能是矫枉过正。

同样——

整个结果集必须是 重新生成并再次发送

如果它是 MS-SQL,例如生成大部分结果集,那么重新生成它将利用 SQL Server 中的一些隐式缓存,并且后续生成会更快。

在某种程度上,您可以不用担心这些问题,直到它们作为“真正的”问题浮出水面——因为您使用的平台为您解决了很多性能瓶颈。

【讨论】:

【参考方案3】:

我有点不同意secretGeek的评论:

这已经发生在你身上——它被称为 tcp/ip ;-) 重新实现可能有点矫枉过正。

有时您可能只想这样做,但实际上只是从 UI 角度来看。如果您实现某种方式将数据流式传输到客户端(通过类似 pushlets 机制),或者按照您的建议将其分块到页面中,然后您可以在客户端上加载一些非常小的子集,然后慢慢构建 UI完整的数据量。

这使得 UI 更流畅、更快速(从用户的角度来看),但您必须评估额外的努力是否值得……因为我认为这不是微不足道的工作量。

【讨论】:

【参考方案4】:

所以听起来您可能会对将“起始记录号”和“最终记录号”参数添加到您的网络方法的解决方案感兴趣。 (或“页码”和“每页结果”)

如果后备存储是 sql server(甚至是 mysql),这应该不会太难,因为它们内置了对行编号的支持。

尽管如此,您应该能够避免在服务器上进行任何会话管理,避免对结果集进行任何显式缓存,并且只依靠后备存储的缓存来保持简单。

【讨论】:

以上是关于通过 Web 服务返回大结果的主要内容,如果未能解决你的问题,请参考以下文章

通过 Web 传输实体框架对象并通过 JSON 返回的最佳方式

Html5大文件断点续传

通过 Web 服务从采购订单创建采购收据

通过 web 服务恢复函数的结果并存储在变量中

CGI

通过Redis消息队列实现大文件处理