打包多个请求以减少与服务器的连接数

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 小组可能更适合解决有关此示例的任何后续问题。

【讨论】:

以上是关于打包多个请求以减少与服务器的连接数的主要内容,如果未能解决你的问题,请参考以下文章

TCP连接复用

was连接池怎么看

修改TCP/IP并发连接数

最大出站连接数

后端须知:服务器Tomcat 的连接数与线程池详解

如何在apache中设置每个连接的最大请求数