打包多个请求以减少与服务器的连接数
Posted
技术标签:
【中文标题】打包多个请求以减少与服务器的连接数【英文标题】:Packing multiple requests to reduce the number of connections to the server 【发布时间】:2016-08-26 10:19:08 【问题描述】:我正在使用 ExcelDNA 编写一个 Excel 插件并创建一个 UDF(用户定义函数)。
UDF 与服务器建立连接,该服务器连接到 SQL 数据库以检索数据并将其发送回客户端。
但是,预计此 UDF 将在一个工作表中被调用数百次。
我正在尝试找到一种方法来减少对服务器的请求数。
到目前为止,模板是这样的(简化的):
ITEM | JAN 2016 | FEB 2016 | MAR 2016 |
---------------------------------------------------
ITEM 1 | UDF | UDF | UDF |
ITEM 2 | UDF | UDF | UDF |
ITEM 3 | UDF | UDF | UDF |
ITEM 4 | UDF | UDF | UDF |
ITEM 5 | UDF | UDF | UDF |
ITEM 6 | UDF | UDF | UDF |
所以,现在,这将总共发送 18 个请求。
我想尝试将请求数减少到 6 个。
我现在正在考虑这样做的方式是,对于每个项目,无论哪个请求首先发送,都会获得该项目列出的所有月份的数据。然后对同一项目的第二次请求将等待第一次请求的结果。
例如:
对于第 1 项, 如果首先调用 JAN 2016 列中的 UDF,它将请求 ITEM 1 的所有月份的数据,然后将该数据存储在某处以供其他请求获取。
然后当第二个请求到来时(假设接下来是 2016 年 3 月),该 UDF 将等待 2016 年 1 月的 UDF 的结果。这样,2016 年 3 月的 UDF 将不必启动另一个与服务器的连接.
但是,我不知道如何实现这一点。我听说过关键字 await 和 async,但没有使用它们的经验。
也欢迎任何其他问题的解决方案。
【问题讨论】:
考虑删除async-await
标签,因为它与批处理无关,尤其是您的问题。
【参考方案1】:
异步调用不会帮助您减少调用次数,它只会启动更多并行调用。通话次数是否会给您带来任何问题?也许这里的“最佳实践”可以帮助您:C# Data Connections Best Practice?
【讨论】:
【参考方案2】:异步函数和批处理可以帮助您。基本上,您在短时间内(例如半秒)收集您想要向后端发出的所有请求,然后向后端发出一次调用。当结果返回时,您完成每个请求的异步调用。
此 Gist 包含异步和批处理部分的完整实现,您只需提供批处理评估功能:https://gist.github.com/govert/1bf0a1026ec3aaee19a8
Excel-DNA Google 小组可能更适合解决有关此示例的任何后续问题。
【讨论】:
以上是关于打包多个请求以减少与服务器的连接数的主要内容,如果未能解决你的问题,请参考以下文章