azure-service-fabric - 为什么 Actor 状态会丢失?

标签 azure-service-fabric

我正在 Azure Service Fabric 中创建一个参与者服务。当部署到 Azure 时,它​​一开始似乎可以工作。可以添加和返回文本(参与者由 Web API 负责),但闲置一段时间后,GetTextsAsync 返回一个空集合。

编辑: 我已经更新了代码以在添加之前检查状态是否存在,但这并不能解决问题。

[StatePersistence(StatePersistence.Persisted)]
public class TextActor : Actor, ITextActor
{
    protected override async Task OnAactivateAsync()
    {
       if(!await StateManager.ContainsStateAsync("State"))
       {
          await this.StateManager.TryAddStateAsync<List<string>>("State", new List<string>());
       }

    }

    public async Task AddTextAsync(string text)
    {
        var texts = await this.StateManager.GetStateAsync<List<string>>("State");

        texts.Add(text);

        await this.StateManager.SetStateAsync("State", texts);
    }

    public async Task<List<string>> GetTextsAsync()
    {
        return await this.StateManager.GetStateAsync<List<string>>("State");
    }
}

编辑2: 好像 Actor 本身就被替换了。我修改了actor以返回其ActorId,当文本列表消失时,ActorId也被替换为新的。

我遵循 VoiceMailBox 示例中的模式,其中参与者是在 Controller 中静态创建的。这是问题所在吗?

public class TextsController : ApiController
{
    private static Uri serviceUri = new Uri("fabric:/TextApp/TextActorService");
    private static ActorId actorId = ActorId.CreateRandom();
    private static ITextActor textActor = ActorProxy.Create<ITextActor>(actorId, serviceUri);        


    [HttpGet]
    public async Task<IHttpActionResult> GetTexts()
    {
        var texts = await textActor.GetTextsAsync();
        return Ok(texts);            
    }

    //Methods omitted
}

最佳答案

这是因为 OnActivate() 方法中的代码 - 它将状态重置为新列表。

OnActivate() 方法可以在一个 Actor 上多次调用 - 它不仅仅在您第一次创建特定 Actor 时被调用。如果该 Actor 在一段时间内未使用,则会停用(并调用 OnDeactivateAsync() 方法)。但是当对 actor 进行新的调用时,它会再次激活。

可能值得阅读一些有关 actor 生命周期的内容 https://azure.microsoft.com/en-gb/documentation/articles/service-fabric-reliable-actors-lifecycle/

关于azure-service-fabric - 为什么 Actor 状态会丢失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36870908/

相关文章:

microservices - 单个服务中的多个 FabricTransportServiceRemotingListeners

azure - 将 Service Fabric 应用程序发布到 Azure 时操作超时

Azure Service Fabric - 使用符号进行调试

azure-service-fabric - Service Fabric 有状态服务因 FailFast 而失败

unit-testing - 如何使用 State 对 Service Fabric Actor 进行单元测试

c# - 当我在 ServiceFabric 群集上使用 EventFlow 监听 ETW 事件时出现“系统资源不足”

c# - 具有通用服务的服务结构

azure-service-fabric - 如何配置无状态服务的启动顺序?

azure - 如何向SF VMSS添加数据盘?

c# - service-fabric-dotnet-getting-started 中的 FabricException