我在错误日志中发现,我们的Azure Service Fabric无状态服务在一段时间后尝试在Actor代理上调用方法时遇到了Microsoft.ServiceFabric.Actors.Runtime.DuplicateMessageException
。演员可能需要一段时间才能运行。该例外的完整信息是:
Actor.Microsoft.ServiceFabric.Actors.Runtime.ActorConcurrencyLock多次获得相同的请求。这可能发生在请求上,当客户端在TimeoutException上重试时,该请求比客户端上配置的OperationTimeout需要更多的处理时间。
我没有看到任何可以配置此值的地方。我在the documentation for the FabricTransportSettings
class看到它的引用,但我不知道该类型的使用位置。
由于我们的actor方法需要一段时间才能运行(通常是几分钟),如果此错误确实与超时有关,我该如何增加OperationTimeout?
我会考虑改变actor的工作方式,初始化并使用所需参数“播种”actor。然后触发计时器以执行长时间运行的工作。然后重新查询actor直到工作完成并检索结果。
我们有一些长时间运行的工作负载,使用我们系统中的actor,我们设置为以这种方式工作
您可以在装配级别设置超时值。
using Microsoft.ServiceFabric.Services.Remoting.FabricTransport;
[assembly: FabricTransportServiceRemotingProvider(MaxMessageSize = int.MaxValue,OperationTimeoutInSeconds =2000)]
也许您应该考虑将以下部分放入Settings.xml文件中:
<Section Name="TransportSettings">
<Parameter Name="MaxMessageSize" Value="1073741824" />
<Parameter Name="OperationTimeoutInSeconds" Value="6000" />
</Section>