分区的主要或无状态实例具有无效地址。

20

我使用开箱即用的分区功能创建了一个有状态的服务:

<StatefulService ServiceTypeName="ExamplesServiceType" TargetReplicaSetSize="[ExamplesService_TargetReplicaSetSize]" MinReplicaSetSize="[ExamplesService_MinReplicaSetSize]">
            <UniformInt64Partition PartitionCount="[ExamplesService_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
         </StatefulService>

服务清单可以设置参数(也可以开箱即用):

 <Parameter Name="ExampleService_PartitionCount" Value="1" />
 <Parameter Name="ExampleService_MinReplicaSetSize" Value="2" />
 <Parameter Name="ExampleService_TargetReplicaSetSize" Value="3" />
 <Parameter Name="WebService_InstanceCount" Value="1" />

现在我想从同一集群中的无状态服务调用我的有状态服务:

 ServiceUriBuilder builder = new ServiceUriBuilder(ExampleServiceName);
 var service = ServiceProxy.Create<IExampleService>(builder.ToUri(),new ServicePartitionKey(1));

 return service.MyCallAsync(id);

我遇到了以下错误:

分区“a67f7afa-3370-4e6f-ae7c-15188004bfa1”的主要或无状态实例具有无效地址,这意味着来自副本/实例的正确地址未在系统中注册。

我正在尝试访问的有状态服务记录到事件日志中,而该日志携带“partitionId”:“a67f7afa-3370-4e6f-ae7c-15188004bfa1”。

我错过了什么?

3个回答

30

1
非常感谢您分享解决方案,这让我摆脱了烦恼。;) - Kristoffer la Cour
7
CreateServiceRemotingListener是该命名空间中的扩展方法,因此请确保为那些找不到该扩展方法的人添加using Microsoft.ServiceFabric.Services.Remoting.Runtime;。 - SondreB
@mayu:我遇到了同样的问题,但是我在演员应用程序中调用了无状态服务,并且我没有CreateServiceReplicaListeners()方法可以重写,你有关于演员应该如何完成这个任务的任何想法吗? - Vinodh
@Vinodh:无状态服务有类似的方法CreateServiceInstanceListeners(),你应该使用protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(this.CreateServiceRemotingListener) }; }进行重写。 - MaGu
啊,真是太痛苦了。干得好!这里提供给那些找不到该方法的人一个提示,你需要添加 using Microsoft.ServiceFabric.Services.Remoting.Runtime; - Hugo Nava Kopp
显示剩余2条评论

11

如果有其他人想知道如何处理无状态服务,这是我的解决方案:

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new[] { new ServiceInstanceListener(context => this.CreateServiceRemotingListener(context)) };
}

3

如果你使用的是Microsoft.ServiceFabric.Services.Remoting 3.3.638版本,你会发现没有叫做CreateServiceInstanceListeners()的扩展方法。而在Microsoft.ServiceFabric.Services.Remoting.Runtime.ServiceRemotingExtensions中只有CreateServiceRemotingInstanceListeners()和CreateServiceRemotingReplicaListeners()。

以下代码可供编译:

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return this.CreateServiceRemotingInstanceListeners();
    }

1
谢谢您!我正在尝试研究《Programming Microsoft Azure Service Fabric,第二版》一书,并且在最早的几个示例中,源代码与文本中指定的不兼容。按照您在这里提出的更改进行操作可以解决问题。 - Phil Ringsmuth
这也是 Microsoft 文档中描述的方式:https://learn.microsoft.com/zh-cn/azure/service-fabric/service-fabric-reliable-services-communication-remoting#use-an-assembly-attribute-to-use-the-v2-stack - Juho Rutila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接