如何在服务结构上将身份编号作为同一服务的每个实例的参数?
How do I have a identity number as parameter for each instance of a same service, on service fabric?
你好我有一个无状态服务,我将在具有 5 个节点的服务结构上托管,我的服务将有 5 个实例 运行 并从数据库中的相同 table 获取记录。所以现在我想为每个实例传递一个参数,例如实例 1 作为 1 ,2 作为 2 等,以便每个实例只能从 table 中获取与 table 中的列 (InstanceId) 匹配的那些记录,从 table 中获取记录 我将在不同实例的 where 子句中使用此参数。我怎样才能做到这一点?提前致谢..
在无状态服务中,您可以访问该服务的上下文,在无状态的情况下,它是类型 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 个处于活动状态)。
另一个解决方案可能是 service-coordinator 可以有一个 ID 池。
该服务可以知道何时创建从数据库获取数据的服务的新实例,并从池中为其提供一个 ID。
如果获取数据的服务实例出现故障(您可以在 OnAbort 或 OnClose 中跟踪它),则该实例 return 将其 ID 添加到池中。
how can I get to know when a new instance of the service is created
实例化服务时,您可以在其代码中覆盖不同的事件。
你可以阅读更多here,Stateless service instance lifecycle paragraph.
例如,在 OnOpenAsync
或 RunAsyc
的开头,您可以向其他服务询问个人唯一 ID。
And this OnAbort or OnClose are the events available in SF?
这些事件在每项服务中都可用。当一个服务宕机时,顺丰会自动调用其中一个。因此,您可以调用任何其他服务来通知您想要 return 一个不再需要的 ID。
顺便说一句,我发现了一些额外的好事可以做:
- 当服务实例出现故障时,您可以通过 服务总线 发送一条消息,告知某个具有特定 ID 的实例不再可用。在总线的另一边,可能有一个带有 id 池的服务,它将捕获该消息和 return id 到池中。
- 您可以使用 Azure Blob 存储的租用机制。可以找到初始信息 here。这个想法是当你有一个 class 试图获得具有某个 id(在 1-5 范围内)的租约时。如果租约成功获得,只需要不时地更新租约。如果没有,您可以尝试使用其他 ID。这里最主要的好处是您可以设置一个时间段,之后租约将再次免费。因此,如果服务实例出现故障,您不必“释放”它的 ID。
你好我有一个无状态服务,我将在具有 5 个节点的服务结构上托管,我的服务将有 5 个实例 运行 并从数据库中的相同 table 获取记录。所以现在我想为每个实例传递一个参数,例如实例 1 作为 1 ,2 作为 2 等,以便每个实例只能从 table 中获取与 table 中的列 (InstanceId) 匹配的那些记录,从 table 中获取记录 我将在不同实例的 where 子句中使用此参数。我怎样才能做到这一点?提前致谢..
在无状态服务中,您可以访问该服务的上下文,在无状态的情况下,它是类型 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 个处于活动状态)。
另一个解决方案可能是 service-coordinator 可以有一个 ID 池。
该服务可以知道何时创建从数据库获取数据的服务的新实例,并从池中为其提供一个 ID。
如果获取数据的服务实例出现故障(您可以在 OnAbort 或 OnClose 中跟踪它),则该实例 return 将其 ID 添加到池中。
how can I get to know when a new instance of the service is created
实例化服务时,您可以在其代码中覆盖不同的事件。
你可以阅读更多here,Stateless service instance lifecycle paragraph.
例如,在 OnOpenAsync
或 RunAsyc
的开头,您可以向其他服务询问个人唯一 ID。
And this OnAbort or OnClose are the events available in SF?
这些事件在每项服务中都可用。当一个服务宕机时,顺丰会自动调用其中一个。因此,您可以调用任何其他服务来通知您想要 return 一个不再需要的 ID。
顺便说一句,我发现了一些额外的好事可以做:
- 当服务实例出现故障时,您可以通过 服务总线 发送一条消息,告知某个具有特定 ID 的实例不再可用。在总线的另一边,可能有一个带有 id 池的服务,它将捕获该消息和 return id 到池中。
- 您可以使用 Azure Blob 存储的租用机制。可以找到初始信息 here。这个想法是当你有一个 class 试图获得具有某个 id(在 1-5 范围内)的租约时。如果租约成功获得,只需要不时地更新租约。如果没有,您可以尝试使用其他 ID。这里最主要的好处是您可以设置一个时间段,之后租约将再次免费。因此,如果服务实例出现故障,您不必“释放”它的 ID。