如何在服务结构上为同一服务的每个实例提供标识号作为参数?

时间:2017-02-02 06:23:00

标签: azure azure-service-fabric

您好我有一个无状态服务,我将在5个节点的服务结构上托管,我的服务将有5个实例运行并从数据库中的同一个表获取记录。所以现在我想为每个实例传递一个参数,如实例1为1,2,为2等,这样每个实例只能从表中匹配表中的列(InstanceId)获取那些记录,从表中获取记录我将在where子句中为不同的实例使用此参数。我怎样才能做到这一点?提前谢谢..

2 个答案:

答案 0 :(得分:1)

另一个解决方案可能是一个服务协调员,可能有一个id池 该服务可以知道何时创建从db获取数据的新服务实例,并从池中为其提供id 如果获取数据的服务实例关闭(您可以在OnAbort或OnClose中跟踪它),则该实例将其id返回到池中。

  

如何知道何时创建新服务实例

当实例化服务时,您可以在其代码中覆盖不同的事件 您可以阅读更多here无状态服务实例生命周期段落 例如,在OnOpenAsyncRunAsyc的开头,您可以向其他服务询问个人身份,唯一ID。

  

这个OnAbort或OnClose是SF中可用的事件吗?

每项服务都提供这些活动。当服务中断时,SF将自动呼叫其中一个。因此,您可以调用任何其他服务来通知您要返回不再需要的ID。

顺便说一句,我想出了一些额外的好事:

  1. 当服务实例发生故障时,您可以通过服务总线发送消息,指出具有某些特定ID的实例不再可用。在总线的另一侧,可能有一个带有id的池服务,它将捕获该消息并将id返回池中。
  2. 您可以使用Azure Blob存储中的租约机制。可以找到初始信息here。这个想法是当你有一个类试图获得一个具有一些id的租约(范围1-5)。如果成功获得租约,则只需要不时更新。如果没有,你可以尝试另一个id。这里的主要好处是您可以设置一个时间段,之后租约将再次免费。因此,如果服务实例出现故障,您将无法“释放”其ID。

答案 1 :(得分:0)

在无状态服务中,您可以访问该服务的上下文,对于无状态服务,它是StatelessServiceContext类型的实例。上下文有一个InstanceId,它为您提供该实例的唯一标识符。

public void SomeServiceMethod()
{
    var instanceId = this.Context.InstanceId;
    // call db with this
}

实例ID将是一个长整数,它是一个顺序ID。但请注意,如果SF重新创建您的节点或服务实例,您可能无法在新实例上获得相同的实例ID。

修改

可能更好地支持您的另一个选项是使用NodeInstanceId作为标识符。它是System.Numerics.BigInteger可能是一个非常大的数字。你可能应该做一些哈希或模数,以获得在你想到的范围内可用的东西(1-5)。

this.Context.NodeContext.NodeId;

但是,如果重新创建节点,这可能是一个问题,在这种情况下,它会获得一个新的实例ID。

第三个选项可以是查看节点的实际名称:

this.Context.NodeContext.NodeName

并解析节点编号,因为节点的命名将为_{node type name}_{count}_,因此如果您有一个名为backend的节点类型,则会_backend_0_,{{1} },_backend_1_等等。问题可能出在这样一种情况,即一个节点无响应,SF创建一个新节点并从节目集中取出一个节点,在此期间您实际上可能有6个节点(但只有5个节点处于活动状态)。