C# 为参与者获取基于回合的并发锁';{actorName}';在{time}之后超时

C# 为参与者获取基于回合的并发锁';{actorName}';在{time}之后超时,c#,.net,concurrency,azure-service-fabric,actor,C#,.net,Concurrency,Azure Service Fabric,Actor,我有一个服务,它通过某个名字创建某种类型的演员: var storer = this.serviceClient.Create<IStorer>(new ActorId(agencyToProcess.Name)); 在此通话中,我收到错误信息: System.AggregateException:发生一个或多个错误。--> Microsoft.ServiceFabric.Actors.ActorConcurrencyLockTimeoutException: 获取参与者“acto

我有一个服务,它通过某个名字创建某种类型的演员:

var storer = this.serviceClient.Create<IStorer>(new ActorId(agencyToProcess.Name));
在此通话中,我收到错误信息:

System.AggregateException:发生一个或多个错误。--> Microsoft.ServiceFabric.Actors.ActorConcurrencyLockTimeoutException: 获取参与者“actorName”基于回合的并发锁 00:01:13.6480000后退出。在 Microsoft.ServiceFabric.Actors.Runtime.ActorConcurrencyLock.d_u17.MoveNext()

我不明白这个erorr意味着什么以及如何修复它

这个问题并非每次都会发生。(百分之二十)



这些服务是在Observer中创建的。有一些代码是在observer中创建参与者的完整代码

public async void OnNext(AgencyModel agencyToProcess)
{
    try
    {
        var storer = this.serviceClient.Create<IStorer>(new ActorId(agencyToProcess.Name));

        await storer.StoreStatusesAsync().ConfigureAwait(false);
    }
    catch (Exception exception)
    {
        this.Logger.Error(exception);
    }
}
public异步void OnNext(AgencyModel AgencyProcess)
{
尝试
{
var storer=this.serviceClient.Create(new-ActorId(agencyToProcess.Name));
wait storer.StoreStatusesAsync().configurewait(false);
}
捕获(异常)
{
this.Logger.Error(异常);
}
}

发生这种情况的原因是,您的服务正在尝试调用当前正在处理另一个调用的参与者

从代码的外观来看,您正在基于事件触发actor,如果连续调用两个针对同一actor的事件,其中一个将等待前一个事件完成,如果前一个事件花费的时间太长,则超时将抛出“ActorConcurrencyLockTimeoutException”

这种情况并不经常发生,因为处理每个调用可能需要几秒钟或更短的时间,但是当您有许多调用排队时,最新的调用将按照各自的顺序等待所有之前的调用处理,这将很快或稍后超时

为了减少这些异常,您可以增加超时阈值,默认值为60秒,但我认为这不是一个好主意,因为它可能会让太多请求排队,并且可能无法处理所有请求,同时保留资源和连接。当服务重新平衡时,这些请求也可能丢失

最好的解决方案是找到一种方法来限制这些请求

[ServiceDescription("Storer", ServicePrefix = "MyApp")]
public interface IStorer : IActor
{
    Task StoreStatusesAsync();
}
public async void OnNext(AgencyModel agencyToProcess)
{
    try
    {
        var storer = this.serviceClient.Create<IStorer>(new ActorId(agencyToProcess.Name));

        await storer.StoreStatusesAsync().ConfigureAwait(false);
    }
    catch (Exception exception)
    {
        this.Logger.Error(exception);
    }
}