您好我有一个无状态服务,我将在5个节点的服务结构上托管,我的服务将有5个实例运行并从数据库中的同一个表获取记录。所以现在我想为每个实例传递一个参数,如实例1为1,2,为2等,这样每个实例只能从表中匹配表中的列(InstanceId)获取那些记录,从表中获取记录我将在where子句中为不同的实例使用此参数。我怎样才能做到这一点?提前谢谢..
答案 0 :(得分:1)
另一个解决方案可能是一个服务协调员,可能有一个id池 该服务可以知道何时创建从db获取数据的新服务实例,并从池中为其提供id 如果获取数据的服务实例关闭(您可以在OnAbort或OnClose中跟踪它),则该实例将其id返回到池中。
如何知道何时创建新服务实例
当实例化服务时,您可以在其代码中覆盖不同的事件
您可以阅读更多here无状态服务实例生命周期段落
例如,在OnOpenAsync
或RunAsyc
的开头,您可以向其他服务询问个人身份,唯一ID。
这个OnAbort或OnClose是SF中可用的事件吗?
每项服务都提供这些活动。当服务中断时,SF将自动呼叫其中一个。因此,您可以调用任何其他服务来通知您要返回不再需要的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个节点处于活动状态)。