【问题标题】:How do I have a identity number as parameter for each instance of a same service, on service fabric?如何在服务结构上为同一服务的每个实例提供一个标识号作为参数?
【发布时间】:2017-02-02 22:47:11
【问题描述】:

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

【问题讨论】:

    标签: azure azure-service-fabric


    【解决方案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。

    【讨论】:

    • 嗨 cassandrad,我确实想做这样的事情,但在 SF 中我们如何实现呢?例如,我如何知道何时创建了服务的新实例?在那个时间点,SF 中是否触发了任何事件?而这个 OnAbort 或 OnClose 是 SF 中可用的事件吗?您能否举个例子或分享一些他们给出了一些例子的链接。我搜索了相同但无法得到它。提前致谢
    • @AjeetKulkarni 添加了详细信息。
    【解决方案2】:

    在您的无状态服务中,您可以访问该服务的上下文,在无状态的情况下,它是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__backend_1__backend_2_ 等等.问题可能出现在一个节点变得无响应并且 SF 创建一个新节点并将损坏的节点从规模集中取出的场景中,在此期间您实际上可能有 6 个节点(但只有 5 个节点处于活动状态)。

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多