14

从 Service Fabric SDK 2.0.135 升级到 2.3.301 后,我们开始遇到无法访问 Service Fabric 参与者或服务(尽管在 Service Fabric Explorer 中显示为正常)的情况。一旦处于此状态,任何通过 ActorProxy 或 ServiceProxy 对参与者或服务的调用都将挂起 5 分钟,然后最终给出 TimeoutException。一旦处于这种状态,actor 或服务永远不会自行恢复——即使离开一个小时也是如此。唯一的解决方案是重置参与者或服务所在的节点,重新部署参与者或服务(完全相同的 EXE),重置整个集群或重新启动所有集群机器。

它通常在部署或重新部署 SF 应用程序后进入此状态。

在使用 Service Fabric 的最后一年(自 SDK v1.3 起),我们从未遇到过这个问题。它只是在移动到 2.3.301 后才开始。

它似乎随机且不一致地发生。我们的解决方案中的 13 个 SF 应用程序中的哪一个受到影响也是随机的。

有人对我们如何解决这个问题有任何想法吗?这似乎是最新版本的 Service Fabric 中的一个错误,但也许我们做错了什么。

任何帮助表示赞赏。

下面是很多额外的信息,我希望它们有助于理解我们在这个问题上所面临的问题。

非常感谢

脚步

我真的没有步骤来始终如一地重现该问题。这只是我有时观察到的。

  1. 我从 Visual Studio 编译然后重新部署了我的 SF 项目(调试-> 不调试就开始)
  2. Visual Studio 表示已成功部署项目
  3. Service Fabric Explorer 将我的所有服务都显示为运行状况良好,包括数据绑定
  4. 有问题的 SF 项目有 2 个演员,它们是单个 EXE 的一部分。Service Fabric Explorer 显示了在不同节点上运行的每个参与者。
  5. Windows 任务管理器显示 EXE 的两个运行副本,这是有道理的,因为有两个节点运行 EXE。

同样,我们的 QA 在直接使用 PowerShell 部署到 Azure 后遇到了这个问题。(他没有从 Visual Studio 部署。)

回顾一下

  • Visual Studio 说部署成功
  • Service Fabric Explorer 显示一切正常
  • 任务管理器显示 EXE 的两个运行副本

当我看到失败

我有一个 SF 服务使用 ServiceProxy 或 ActorProxy 类调用另一个 SF 服务。我们在整个解决方案中结合了 13 个不同的应用程序和大约 25 个不同的服务和参与者来做到这一点。自 2015 年 11 月我们开始使用 Service Fabric SDK v1.3 以来,它一直运行良好。

现在,在升级到 2.3.301 之后,我们会周期性地出现随机 Actor 或 Service 进入无法响应从 ServiceProxy 或 ActorProxy 调用的方法的状态。挂起 5 分钟后,我们收到带有以下消息的 System.Timeout 异常:

如果在服务繁忙或其长时间运行的操作并且花费的时间超过配置的操作超时时丢弃消息,则可能会发生这种情况。

请注意,该服务不忙,也没有执行长时间运行的操作。作为参与者,该服务根本不做任何持续的操作。它只是公开了其他服务可以使用的公共方法。它从第一次调用就失败了。

事实上,跟踪告诉我们,即使是actor中方法的第一行也永远不会被调用。就好像 Service Fabric 通信基础结构无法传递消息一样。

什么时候开始

在过去的 12 个月里,我们从未见过这个问题。

现在,自上周升级 Service Fabric 以来,我们经常在各种情况下看到此问题。

我们升级到 Service Fabric SDK 2.3.301.9590 和 Service Fabric 5.3.301.9590。

起初,团队中的每个开发人员都独立遇到了这个问题,并且每个人都认为这只是我们机器的暂时性问题。Service Fabric 确实存在一些问题,因此我们只是接受这一点并继续前进。但后来我们开始互相抱怨,并意识到我们都看到了。甚至我们的质量保证人员也在我们即将投入生产的环境中的云中看到它。

同样,这只是在我们上周升级到最新版本的 Service Fabric 时才开始的。

以前,我们运行的是 Service Fabric SDK 2.0.135。

我们通过安装 SDK v 2.3.301 升级了我们的代码库,打开了我们的每个解决方案并允许 Visual Studio 进行升级。

环境

我在具有 16 GB RAM 的 i7 上运行全新安装的 Windows 10 Enterprise(不到 2 周前安装)。我全新安装了 Visual Studio 2015 Update 3 和 SF 2.3.301.9590。我把所有东西都安装干净了。没有升级。

这也发生在我所有同事的机器上(不同年龄、配置和“新鲜度”)。它偶尔发生在我们每个人身上。

最关键的是,这也发生在 Azure 上的 Service Fabric VM 上。这些是我们的 QA 大约一个月前使用 Azure 上的 Service Fabric VM 的标准模板创建的机器。它预装了 5.3.301.9590。他没有手动安装任何 Service Fabric 更新。直到开发人员升级到新版本之后,我们基于 SF 的应用程序才在 Azure(或我们自己的开发机器)上遇到这个问题。

这不是我的机器,也不是孤立于开发环境。对我们所有人来说,唯一一致的变化是 SF 版本的更新。

原因

我们不知道是什么原因造成的。

它通常在部署新的 SF 应用程序后立即发生。是的,我们确实会等待 SF 在部署后“自行解决”通常需要 2 或 3 分钟。我们已经离开了一个小时或更长时间,但它永远不会起作用。

有趣的是,我认为我有一个运行良好的 SF 服务,然后突然停止工作,但这是在我们意识到存在问题之前,所以我没有在寻找它。我不能确定。

变通办法

一旦我们的 SF 服务处于“不可访问”状态,Service Fabric 将不会再次退出该状态。该应用程序完全无法使用。随着不同程度的成功,我们做了以下工作:

  • 重新部署无法访问的 SF 应用程序
  • 重新启动托管不可访问的 SF 服务和参与者的节点(通过 Service Fabric Explorer 转到节点,单击省略号按钮并单击“重新启动”选项)
  • 重新启动整个 SF 集群(停止然后启动)
  • 重启所有运行 SF 节点的机器
  • 重置整个集群并重新部署所有东西(最后的手段,但有必要几次)

有趣的是,使用任务管理器杀死有问题的进程也无济于事。如果我终止了有问题的进程,Service Fabric 会重新启动它(如预期的那样),但它仍然不会响应消息。

因此,问题似乎出在 Service Fabric 本身,而不是 EXE。

当然,这些根本不是“解决方案”,因为它们使我们的整个应用程序无法访问,直到 SF 可以重新启动/重新平衡。即使重新启动一些节点也会使一堆东西脱机。

从本质上讲,这对我们来说是一个阻碍。我们不可能将我们的应用程序投入生产(甚至是测试版),因为 Service Fabric 的行为是这样的。

使用 Service Proxy 或 Actor Proxy 时的 C# 异常:

ActorProxy 或 ServicePRoxy 抛出的异常的 JSON 渲染

"exception": {
    "ClassName": "System.TimeoutException",
    "Message": "This can happen if message is dropped when service is busy or its long running operation and taking more time than configured Operation Timeout.",
    "Data": null,
    "InnerException": null,
    "HelpURL": null,
    "StackTraceString": "   at Microsoft.ServiceFabric.Services.Communication.Client.ServicePartitionClient`1.<InvokeWithRetryAsync>d__7`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.ServiceFabric.Services.Remoting.Client.ServiceRemotingPartitionClient.<InvokeAsync>d__8.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.ServiceFabric.Services.Remoting.Builder.ProxyBase.<InvokeAsync>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at Microsoft.ServiceFabric.Services.Remoting.Builder.ProxyBase.<ContinueWithResult>d__7`1.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n   at RenderingCachingEngine.RenderingCachingEngine.<Render>d__10.MoveNext() in C:\\Code\\Ink\\Dev\\Current\\Source\\Rendering Service Fabric\\RenderingCachingEngine\\RenderingCachingEngine.cs:line 381",
    "RemoteStackTraceString": null,
    "RemoteStackIndex": 0,
    "ExceptionMethod": "8\nMoveNext\nMicrosoft.ServiceFabric.Services, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\nMicrosoft.ServiceFabric.Services.Communication.Client.ServicePartitionClient`1+<InvokeWithRetryAsync>d__7`1\nVoid MoveNext()",
    "HResult": -2146233083,
    "Source": "Microsoft.ServiceFabric.Services",
    "WatsonBuckets": null
  }

这是 Service Fabric 信息的 JSON 呈现:

  "serviceFabricInfo": {
    "serviceFabricServiceName": "fabric:/Rendering/RenderingCachingEngine",
    "serviceFabricServiceTypeName": "RenderingCachingEngineType",
    "serviceFabricReplicaId": 131225099453058851,
    "serviceFabricPartitionId": "e400087d-8a08-4dab-bcdd-1f5ce82f374f",
    "serviceFabricApplicationName": "fabric:/Rendering",
    "serviceFabricApplicationTypeName": "RenderingType",
    "serviceFabricNodeName": "_Node_4"
  }

重新部署时的事件查看器日志

Windows 事件查看器确实在“应用程序和服务日志 -> Microsoft-Service Fabric -> 管理员”下显示了一些值得注意的日志。

以下日志在我重新部署应用程序的更新版本时发生(请注意,DataBinding.exe 是包含我的两个 SF 演员的 EXE 的名称):

Log Name:      Microsoft-ServiceFabric/Admin
Source:        Microsoft-ServiceFabric
Date:          11/2/2016 2:38:53 PM
Event ID:      256
Task Category: Common
Level:         Error
Keywords:      Default
User:          NETWORK SERVICE
Computer:      shayward10.ovx.local
Description:
WriteNode failed. HRESULT=-2147467259, Output=CustomOutput
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-ServiceFabric" Guid="{CBD93BC2-71E5-4566-B3A7-595D8EECA6E8}" />
    <EventID>256</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>1</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8000000000000001</Keywords>
    <TimeCreated SystemTime="2016-11-02T18:38:53.678587200Z" />
    <EventRecordID>7620</EventRecordID>
    <Correlation />
    <Execution ProcessID="4440" ThreadID="7360" />
    <Channel>Microsoft-ServiceFabric/Admin</Channel>
    <Computer>shayward10.ovx.local</Computer>
    <Security UserID="S-1-5-20" />
  </System>
  <EventData>
    <Data Name="id">
    </Data>
    <Data Name="type">XmlLiteWriter</Data>
    <Data Name="text">WriteNode failed. HRESULT=-2147467259, Output=CustomOutput</Data>
  </EventData>
</Event>

Log Name:      Microsoft-ServiceFabric/Admin
Source:        Microsoft-ServiceFabric
Date:          11/2/2016 2:38:54 PM
Event ID:      23073
Task Category: Hosting
Level:         Warning
Keywords:      Default
User:          SYSTEM
Computer:      shayward10.ovx.local
Description:
ServiceHostProcess: DataBinding.exe for ApplicationId 805915c7-456c-49d3-af95-62cc44650664 terminated unexpectedly with exit code 3221225786 on node id bf865279ba277deb864a976fbf4c200e
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-ServiceFabric" Guid="{CBD93BC2-71E5-4566-B3A7-595D8EECA6E8}" />
    <EventID>23073</EventID>
    <Version>0</Version>
    <Level>3</Level>
    <Task>90</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8000000000000001</Keywords>
    <TimeCreated SystemTime="2016-11-02T18:38:54.820567800Z" />
    <EventRecordID>7621</EventRecordID>
    <Correlation />
    <Execution ProcessID="6944" ThreadID="3812" />
    <Channel>Microsoft-ServiceFabric/Admin</Channel>
    <Computer>shayward10.ovx.local</Computer>
    <Security UserID="S-1-5-18" />
  </System>
  <EventData>
    <Data Name="id">bf865279ba277deb864a976fbf4c200e</Data>
    <Data Name="AppId">805915c7-456c-49d3-af95-62cc44650664</Data>
    <Data Name="ReturnCode">3221225786</Data>
    <Data Name="ProcessName">DataBinding.exe</Data>
  </EventData>
</Event>

Log Name:      Microsoft-ServiceFabric/Admin
Source:        Microsoft-ServiceFabric
Date:          11/2/2016 2:38:56 PM
Event ID:      256
Task Category: Common
Level:         Error
Keywords:      Default
User:          NETWORK SERVICE
Computer:      shayward10.ovx.local
Description:
WriteNode failed. HRESULT=-2147467259, Output=CustomOutput
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-ServiceFabric" Guid="{CBD93BC2-71E5-4566-B3A7-595D8EECA6E8}" />
    <EventID>256</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>1</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8000000000000001</Keywords>
    <TimeCreated SystemTime="2016-11-02T18:38:56.261857600Z" />
    <EventRecordID>7627</EventRecordID>
    <Correlation />
    <Execution ProcessID="4440" ThreadID="8564" />
    <Channel>Microsoft-ServiceFabric/Admin</Channel>
    <Computer>shayward10.ovx.local</Computer>
    <Security UserID="S-1-5-20" />
  </System>
  <EventData>
    <Data Name="id">
    </Data>
    <Data Name="type">XmlLiteWriter</Data>
    <Data Name="text">WriteNode failed. HRESULT=-2147467259, Output=CustomOutput</Data>
  </EventData>
</Event>

事件查看器超时时记录

一旦服务处于不可访问状态,尝试调用它会在每个请求上产生以下日志(等待 5 分钟后):

Log Name:      Microsoft-ServiceFabric/Admin
Source:        Microsoft-ServiceFabric
Date:          11/2/2016 2:44:55 PM
Event ID:      44289
Task Category: FabricTransport
Level:         Warning
Keywords:      Default
User:          NETWORK SERVICE
Computer:      shayward10.ovx.local
Description:
Error While Sending Message : FABRIC_E_TIMEOUT
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-ServiceFabric" Guid="{CBD93BC2-71E5-4566-B3A7-595D8EECA6E8}" />
    <EventID>44289</EventID>
    <Version>0</Version>
    <Level>3</Level>
    <Task>173</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8000000000000001</Keywords>
    <TimeCreated SystemTime="2016-11-02T18:44:55.349048200Z" />
    <EventRecordID>7629</EventRecordID>
    <Correlation />
    <Execution ProcessID="18600" ThreadID="8076" />
    <Channel>Microsoft-ServiceFabric/Admin</Channel>
    <Computer>shayward10.ovx.local</Computer>
    <Security UserID="S-1-5-20" />
  </System>
 <EventData>
    <Data Name="id">
    </Data>
    <Data Name="type">ServiceCommunicationClient</Data>
    <Data Name="text">Error While Sending Message : FABRIC_E_TIMEOUT</Data>
  </EventData>
</Event>
4

2 回答 2

7

此问题可能在 2 种情况下发生。

  1. 如果您的 ActorService 方法处理时间超过默认超时,那么您需要更改 OperationTimeout 值。默认为 5 分钟。如果要更改超时,可以通过在客户端程序集中添加程序集FabricTransportServiceRemotingProviderAttribute来更改它。

https://msdn.microsoft.com/en-us/library/microsoft.servicefabric.services.remoting.fabrictransport.fabrictransportserviceremotingproviderattribute.aspx

  1. 如果不是第一种情况,那么您可以尝试以下缓解已知错误的方法。
    • 在服务清单中为 ActorService 端点指定端口 0。默认情况下,ActorEndpoint 将在 ServiceManifest 中列出,但端口不会出现。

这是您进行更改后它将如何查找 ActorService 。

<Endpoint Name="Actor1ActorServiceEndpoint" Port="0" />

我们知道这个问题,并且正在修复。

于 2016-11-04T18:49:37.247 回答
1

如果它对我们在长时间运行(超过 5 分钟)操作中看到这些超时的任何人有所帮助。按照Suchi 的提示,FabricTransportServiceRemotingProviderAttribute我们在SF 项目中添加了以下几行,AssemblyInfo.cs以将超时时间增加到1 小时。

[assembly: FabricTransportServiceRemotingProvider(OperationTimeoutInSeconds = 3600)]
[assembly: FabricTransportActorRemotingProvider(OperationTimeoutInSeconds = 3600)]

(另请注意,如果您使用 Azure 服务总线,最大锁定时间为 5 分钟,因此您必须实施一些锁定更新代码以支持长时间运行的操作)

于 2018-05-16T15:36:22.373 回答