gpt4 book ai didi

c# - NetTcpBinding (WCF) 中 ReliableSession 的意外错误

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

我有一个客户端服务器应用程序。我的场景:

  • .Net Framework 4.6.1
  • 启用超线程的四核 i7 机器
  • 服务器 CPU 负载 20 - 70 %
  • 网络负载 < 5%(GBit NIC)
  • 100 位用户
  • 30 项服务(一些管理服务,一些针对每种数据类型的通用服务)正在运行并且每个用户都连接到所有服务
  • NetTcpBinding(启用压缩)
  • 已启用 ReliableSession
  • 每一秒我都会触发(服务器端)一个更新通知,并且所有客户端大约从服务器加载。 100 KB
  • 此外,心跳正在运行(用于测试 15 秒间隔),它仅以 UTC 格式返回服务器时间

有时 WCF 连接会更改为故障状态。通常发生这种情况时,服务器根本没有网络上游。我确实写了一个内存转储,并且能够看到很多 WCF 线程正在等待一些 WaitQueue。调用堆栈是:

Server stack trace: 
at System.ServiceModel.Channels.TransmissionStrategy.WaitQueueAdder.Wait(TimeSpan timeout)
at System.ServiceModel.Channels.TransmissionStrategy.InternalAdd(Message message, Boolean isLast, TimeSpan timeout, Object state, MessageAttemptInfo& attemptInfo)
at System.ServiceModel.Channels.ReliableOutputConnection.InternalAddMessage(Message message, TimeSpan timeout, Object state, Boolean isLast)
at System.ServiceModel.Channels.ReliableDuplexSessionChannel.OnSend(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.DuplexChannel.Send(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.DuplexChannelBinder.Send(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

我确实调整了设置,情况似乎有所缓解 - 现在出现故障的客户端减少了。我的设置:

  • ReliableSession.InactivityTimeout:01:30:00
  • ReliableSession.Enabled:真
  • ReliableSession.Ordered:假
  • ReliableSession.FlowControlEnabled:假
  • ReliableSession.MaxTransferWindowSize:4096
  • ReliableSession.MaxPendingChannels:16384
  • MaxReceivedMessageSize:1073741824
  • ReaderQuotas.MaxStringContentLength:8388608
  • ReaderQuotas.MaxArrayLength:1073741824

我卡住了。为什么所有调用都尝试等待 TransmissionStrategy 中的某些 WaitQueue?我不关心消息被乱序发送(我自己会处理)。我已经在考虑禁用可靠的消息传递,但该应用程序在全局范围内的公司网络中使用。我需要知道我的消息已送达。

有什么想法可以教 WCF 只发送消息而不关心其他任何事情吗?

编辑

服务节流的值设置为 Int32.MaxValue

我还尝试将 MaxConnectionsListenBackLog(在 NetTcpBinding 上)设置为最大值。它没有改变任何东西——据我所知。

编辑 2

检查 WCF Traces 它告诉我(德语消息,因此是粗略的翻译)可靠的消息传递窗口中没有可用空间 - 然后我得到的只是超时,因为没有发送更多消息。

那里发生了什么?可靠的消息传递是否可能混淆了自己?

最佳答案

等待队列可能与 wcf 内置的节流行为有关 https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/servicethrottling排除故障的最佳方法是启用 wcf 跟踪 https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/wcf/servicethrottling并确切知道根本原因是什么

关于c# - NetTcpBinding (WCF) 中 ReliableSession 的意外错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54142527/

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