升级到 SDK 2.3.301 后,Service Fabric Actor 或服务随机无法访问

Posted

技术标签:

【中文标题】升级到 SDK 2.3.301 后,Service Fabric Actor 或服务随机无法访问【英文标题】:Service Fabric Actor or Service Becomes Inaccessible at Random after Upgrading to SDK 2.3.301 【发布时间】:2017-03-17 07:06:15 【问题描述】:

从 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 中的一个错误,但也许我们做错了什么。

感谢任何帮助。

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

非常感谢

步骤

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

    我从 Visual Studio 编译并重新部署了我的 SF 项目(调试 -> 不调试就开始) Visual Studio 表示已成功部署项目 Service Fabric Explorer 将我的所有服务都显示为运行状况良好,包括数据绑定 有问题的 SF 项目有 2 个演员,它们是单个 EXE 的一部分。 Service Fabric Explorer 显示了在不同节点上运行的每个参与者。 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 确实存在一些问题,因此我们只是接受这一点并继续前进。但后来我们开始互相抱怨,并意识到我们都看到了。甚至我们的 QA 也在我们即将投入生产的环境中的云中看到它。

同样,这只是在我们上周升级到最新版本的 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 应用程序 重新启动节点(通过 Service Fabric Explorer 转到 节点,单击省略号按钮并单击“重新启动”选项) 托管无法访问的 SF 服务和演员 重新启动整个 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>

【问题讨论】:

【参考方案1】:

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

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

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

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

这是在您进行更改后它会查找 ActorService 的方式。

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

我们已经意识到这个问题,并且正在修复中。

【讨论】:

嗨@MSFT-SuchiAgicha,问题是特定于参与者还是应该将相同的解决方法应用于所有有状态服务? Replicator 端点怎么样?更多细节将不胜感激。谢谢 @MSFT-SuchiAgicha 是否有解决此问题的方法,或者有什么地方可以跟踪问题?【参考方案2】:

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

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

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

【讨论】:

以上是关于升级到 SDK 2.3.301 后,Service Fabric Actor 或服务随机无法访问的主要内容,如果未能解决你的问题,请参考以下文章

升级到最新的 SDK 版本 1.20.4 后运行/调试 Flutter 应用程序非常慢

升级到 Rails 6.1.0 后 ActiveStorage::Blob 的未定义方法“service_name”

Android 4.2.2 - adb 离线,即使在 SDK 升级后

升级到 firebase js sdk v8 后,在“firebase”中找不到导出“firestore”(导入为“firebase”)

安卓 SDK升级后模拟器闪退

无法重新启动 mysql.service:从 18.4 升级后,单元 mysql.service 在 Ubuntu 20.04 中被屏蔽