gpt4 book ai didi

c# - 如何在预期超时时处理负载下的 WCF 调用生命周期?

转载 作者:太空宇宙 更新时间:2023-11-03 16:25:18 25 4
gpt4 key购买 nike

我有一个很好的快速任务调度组件(碰巧是 Windows 服务,但这无关紧要),它订阅了一个内存中的待办事项队列。

队列填充得非常快……当我说快时,我的意思是快……太快了,以至于我在某些特定部分遇到了问题。

队列中的每个项目都有一个附加的“类别”,然后传递到 WCf 端点进行处理,然后保存在远程数据库中。

这有点问题。

“队列”每分钟可以处理数百万个项目,而 WCF 端点实际上每秒只能处理大约 1000 到 1200 个项目,其中许多被“堆叠”以等待插槽转储它们到数据库。

我的 WCF 客户端配置为调用即发即忘(故意)我的问题是当调用时偶尔会发生超时,这就是头痛的开始。

线程似乎在超时后停止,没有掉入我的 catch block 什么都没有......只是坐在那里,更令人困惑的是这是间歇性的事情,这只发生在队列处理极端负载和WCF 端点负担过重,即使在那种情况下,这种情况也大约每两周发生一次。

此代码在服务器上持续运行,全天候 24/7。

那么……我的问题……如何识别导致我的问题的极端情况,以便我可以解决它?

一些额外的信息:

调用 WCF 端点的客户端似乎自动“节流”,因为我限制了调用线程的数量,并且代码一直挂起直到调用被认为完成(我认为这是一个http 级别的事情,因为我没有向服务询问我的方法调用的结果)。

数据库与 EF 对话,EF 似乎永远不会打开超过固定数量的数据库连接(数量也很少,这很酷),并且来自调用接收的 WCF 端点似乎非常可靠。

问题似乎是从队列处理器到 WCf 端点。

队列处理器有一个我的 WCF 端点客户端的实例,它对所有调用重复使用......(每次调用重建这个端点是好的做法吗? - 请记住这里的调用次数)。

最后的说明:

它是一个特殊的功能“模块”,在高负载下一次可以稳定几个小时,但由于某种原因,这种奇怪的事情发生了,导致整个模块停止而不是恢复。该调用包含在 try catch 中,但似乎即使命中了 catch(无法保证)代码也不会按预期恢复/退出……它只是挂起。

有什么想法吗?

如果我可以添加任何其他内容来帮助解决此问题,请告诉我。

编辑 1:

绑定(bind) - basicHttpBinding

错误处理 - 除了在 try catch 中包装 WCF 调用外,没有编写任何代码。

最佳答案

看来我的解决方案似乎是增加客户端配置上的超时设置,以允许服务器有更多时间响应。

最终结果是,当数据库忙于保存数据时(实际上是该过程中最慢的部分),调用客户端会等待(在所有线程上,但似乎没有我希望的那么长)。

这个问题似乎是对 WCF 进行大量多线程调用并且没有给它足够的响应时间的最终结果。

高负载不是连续的,服务使用似乎先激增然后逐渐下降,增加预期的响应时间允许在激增发生时将其过滤掉。

重点说明:太多的调用将导致服务器/服务将它们视为 dos 类型的攻击,因此可能会简单地终止连接。这不是我得到的,但一些微调和时间可能会导致这个......

是时候使用一些更大的服务器了!!!

关于c# - 如何在预期超时时处理负载下的 WCF 调用生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12779844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com