【问题标题】:Strategy for busy WCF service繁忙的 WCF 服务的策略
【发布时间】:2011-11-04 01:37:21
【问题描述】:

我有一个非常繁忙的自托管 WCF 服务器,它需要 2000 多个客户端频繁更新其状态。我发现服务器的 CPU 利用率一直保持在 70% 左右,客户端有 50% 的机会实际连接到服务器。它们将在 60 秒后超时。这是有问题的,因为如果服务器没有收到客户端的回复,它将假定客户端处于离线状态。

我已经实现了限制,因此我可以调整并发连接/会话/等,但如果我没记错的话,增加它只会导致更高的 CPU 利用率和更严重的连接问题。对吧?

将超时时间增加到 60 秒以上会有帮助吗?我不确定它是如何工作的,但是在服务器可以处理请求之前,客户端会坐在某种队列中吗?还是最好将超时设置为较小的值,让客户端在无法连接时更频繁地签入(这似乎只会使问题在某种意义上变得更糟)?

【问题讨论】:

  • 为什么服务端对客户端一无所知?
  • 最大的问题是您需要可靠的消息传递吗?即需要确保您的消息始终能够通过?
  • Terry - 是的,服务器会跟踪已知在线的计算机列表。如果客户端未报告,则服务器将其标记为脱机,并通知管理员进行调查。很明显,如果客户端不能和服务端通信,就会报一堆假的“离线”。

标签: wcf c#-4.0


【解决方案1】:

如果服务器知道客户端是否仍然连接真的很重要,我认为仅依靠 WCF 并不是最好的选择。

也许您的服务器应该有某种 ping 机制,允许它基于某种计时器来 ping 客户端计算机,反之亦然。

如果您非常担心消息总是通过,那么我建议您探索可靠的服务。查看enableReliableSession 行为属性。我建议至少阅读 Juval Lowy 的Programming WCF Services 中的第一章,该书可作为本书的 Kindle 示例免费获得。

【讨论】:

    【解决方案2】:

    增加超时可能会有所帮助,但可能作用不大,而且惊人的不断增加的超时是http://www.thedailywtf.com 上的一种主题。如果第一次打不通,让客户端锤击服务器,肯定会造成痛苦。

    如果您关心的只是知道客户端是否在那里,那么向下一层或两层并让客户端偶尔向您发送一个 HTTP POST 是否可行? WCF 需要一些主动的来回操作,但是 POST 可以一直放在那里,直到您的服务器有时间处理它,而客户端可以发送它并忘记它。

    【讨论】:

    • 使用 WCF 托管 json 样式的服务对这里有帮助吗?这也是一个 HTTP 帖子,但它是否需要 NetTCP WCF 服务具有的某种类型的来回?
    猜你喜欢
    • 2018-02-15
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多