是否可以在运行时将服务实例ID(int值)传递给guest虚拟机可执行文件?我查看了<ExeHost><Arguments>
,但它只对预先提供的静态数据有用。
答案 0 :(得分:2)
环境变量提供服务包实例ID ,它与实例/副本ID不同。一般而言,SF的环境变量可以使用FabricRuntime
提供相同的可用信息,即节点上下文和代码包激活上下文。在本机SF服务中,实例ID在运行时由Fabric(在ServiceContext
类中)提供,因为单个进程可以托管多个分区和实例/副本。
在不使用SF API的guest虚拟机可执行文件中,唯一的选项AFAIK是在单独的可执行文件中查询Fabric以获取此信息,将其作为SetupEntryPoint
运行(每次在guest虚拟机可执行文件之前运行) )并将信息写入文件。
例如(将代码编译为GetFabricData.exe
并将其添加到代码包中):
private static async Task MainAsync(string[] args)
{
var serviceTypeName = args.FirstOrDefault();
if (string.IsNullOrEmpty(serviceTypeName)) throw new ArgumentNullException(nameof(serviceTypeName));
using (var client = new FabricClient())
{
var activationContext = FabricRuntime.GetActivationContext();
var nodeContext = FabricRuntime.GetNodeContext();
var nodeName = nodeContext.NodeName;
var applicationName = new Uri(activationContext.ApplicationName);
var replicas = await client.QueryManager.GetDeployedReplicaListAsync(nodeName, applicationName);
// usually taking the first may not be correct
// but in a guest executable it's unlikely there would be multiple partitions/instances
var instance = replicas.OfType<DeployedStatelessServiceInstance>()
.FirstOrDefault(c => c.ServiceTypeName == serviceTypeName);
if (instance == null)
{
throw new InvalidOperationException($"Unable to find a service instance for {serviceTypeName}");
}
File.WriteAllText("FabricData", instance.InstanceId.ToString());
}
}
在服务清单中:
<SetupEntryPoint>
<ExeHost>
<Program>GetFabricData.exe</Program>
<Arguments>Guest1Type</Arguments>
</ExeHost>
</SetupEntryPoint>
然后,guest虚拟机可执行文件可以只读取FabricData
文件。
答案 1 :(得分:1)
它在环境变量中可用。请参阅此处以获取服务可用的环境变量的完整列表:https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-manage-multiple-environment-app-configuration
请注意,您要求的 Fabric_ServicePackageInstanceId 通常仅供内部使用,并且它标识整个服务包。这意味着如果您的服务包中有多个代码包(可执行文件),它们将获得相同的ID。