C# 当预期超时时,如何处理负载下的WCF调用生命周期?

C# 当预期超时时,如何处理负载下的WCF调用生命周期?,c#,wcf,performance,wcf-client,C#,Wcf,Performance,Wcf Client,我有一个很好的快速任务调度组件windows服务,但这与此无关,它订阅了内存中要做的事情队列 队列的填充速度非常快。。。当我说快的时候,我的意思是快。。。速度如此之快,以至于我在某些特定部件上遇到问题 队列中的每个项目都会获得一个附加到它的类别,然后传递给WCf端点进行处理,然后保存到远程数据库中 这是一个小问题 队列可以以每分钟数百万个项目的速度处理,而WCF端点实际上每秒只能处理大约1000到1200个项目,其中许多项目是为了等待插槽将它们转储到db 我的WCF客户端被配置为使调用启动,我的

我有一个很好的快速任务调度组件windows服务,但这与此无关,它订阅了内存中要做的事情队列

队列的填充速度非常快。。。当我说快的时候,我的意思是快。。。速度如此之快,以至于我在某些特定部件上遇到问题

队列中的每个项目都会获得一个附加到它的类别,然后传递给WCf端点进行处理,然后保存到远程数据库中

这是一个小问题

队列可以以每分钟数百万个项目的速度处理,而WCF端点实际上每秒只能处理大约1000到1200个项目,其中许多项目是为了等待插槽将它们转储到db

我的WCF客户端被配置为使调用启动,我的问题是,当调用偶尔发生超时时,头痛就开始了

线程似乎只是在超时后停止,没有进入我的catch块,什么都没有。。。只是坐在那里,更令人困惑的是,这是一个间歇性的事情,只有当队列处理极端负载和WCF端点被过度征税时才会发生,即使在这种情况下,也只有大约两周才会发生一次

此代码在服务器上24/7不间断地运行

所以。。。我的问题。。。 如何识别导致问题的边缘情况,以便解决问题

一些额外信息:

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

db与EF交谈,EF似乎从未打开超过固定数量的db连接,这也是一个相当低的数字,这很酷,并且来自回拨的WCF端点似乎超级可靠

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

队列处理器有一个WCF endpoint client实例,它可将该实例用于所有调用。。。每次调用重建此端点是否是一种良好的做法?-记住这里的电话号码

最后说明:

这是一个特殊的功能模块,在一次几个小时的重负载下,它是稳定的,但由于某种原因,这种奇怪的事情发生了,导致整个系统只是停止,而没有恢复。调用被包装在一个try-catch中,但似乎即使捕获被命中,也不能保证代码不会像预期的那样恢复/退出。。。它只是挂着

有什么想法吗

请让我知道,如果有什么我可以补充,以帮助解决这个问题

编辑1:

绑定-basicHttpBinding


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

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

最终的结果是,当数据库忙于有效地保存数据时,这个过程中最慢的部分是调用客户机坐在所有线程上等待,但似乎没有我希望的那么长

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

高负载不是连续的,服务使用率似乎会突然增加,然后逐渐减少,再加上预期的响应时间,就可以在出现峰值时将其过滤掉

关键提示: 太多的调用将导致服务器/服务将其视为dos类型的攻击,因此可能只是终止连接。 这不是我得到的,但一些微调和时间可能会导致这


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

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

最终的结果是,当数据库忙于有效地保存数据时,这个过程中最慢的部分是调用客户机坐在所有线程上等待,但似乎没有我希望的那么长

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

高负载不是连续的,服务使用率似乎会突然增加,然后逐渐减少,再加上预期的响应时间,就可以在出现峰值时将其过滤掉

关键提示: 太多的调用将导致服务器/服务将其视为dos类型的攻击,因此可能只是终止连接。 这不是我得到的,但一些微调和时间可能会导致这


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

您可以添加,您正在使用哪个绑定,以及如何处理此服务器上的故障状态吗
le端点客户端实例?这有帮助吗?我想知道使用wsBinding是否会更好,但是这个服务需要尽可能简单,因为它可能是从一些非常旧的代码中调用的。兼容性有点问题。你能检查一下吗。如果每次调用都使用相同的客户端代理,至少应该有类似的功能。您需要在服务和呼叫方之间使用http吗?@hugh-是的。。。使代码保持简单,并与此类型的服务如何交互的现有全球标准保持一致。是否可以添加、使用哪个绑定以及如何处理此单端点客户端实例上的故障状态?这是否有帮助?我想知道使用wsBinding是否会更好,但是这个服务需要尽可能简单,因为它可能是从一些非常旧的代码中调用的。兼容性有点问题。你能检查一下吗。如果每次调用都使用相同的客户端代理,至少应该有类似的功能。您需要在服务和呼叫方之间使用http吗?@hugh-是的。。。使代码保持简单,并与关于此类服务如何交互的现有全球标准保持一致。