Azure ServiceDefinition文件 - ProgramEntryPoint,运行时IP地址和端口

时间:2012-04-17 11:33:57

标签: azure azure-worker-roles

我正在使用ProgramEntryPoint在Windows Azure辅助角色中运行命令行程序(恰好是Redis),如下所示

  <WorkerRole name="Worker" vmsize="Small">
    <Runtime executionContext="limited">
      <Environment>
        <Variable name="ADDRESS">
          <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='Redis']/@address" />
        </Variable>
        <Variable name="PORT">
          <RoleInstanceValue xpath="/RoleEnvironment/CurrentInstance/Endpoints/Endpoint[@name='Redis']/@port" />
        </Variable>
      </Environment>
      <EntryPoint>
        <ProgramEntryPoint commandLine="redis-server.exe" setReadyOnProcessStart="true" />
      </EntryPoint>
    </Runtime>
    <Endpoints>
      <InternalEndpoint name="Redis" protocol="tcp" port="6379" />
    </Endpoints>
  </WorkerRole>

到目前为止,这么好(它有效)。 我现在想在另一个WorkerRole

中运行服务器的从属实例
<WorkerRole name="SlaveWorker" vmsize="Small">
    <Runtime executionContext="limited">
      <EntryPoint>
        <ProgramEntryPoint commandLine="echo slaveof %ADDRESS% %PORT% | redis-server.exe -"   setReadyOnProcessStart="true" />
      </EntryPoint>
    </Runtime>    
    <Imports>
      <Import moduleName="Diagnostics" />
      <Import moduleName="RemoteAccess" />
    </Imports>
    <Endpoints>
      <InternalEndpoint name="Redis" protocol="tcp" port="6379" />
    </Endpoints>    
  </WorkerRole>

你可以看到我需要告诉从服务器主服务器在哪里使用IP地址和端口;在Azure为该角色分配网络资源之前我不知道的事情。我seen @smarx do something along these lines

但是我认为在我的案例中可能存在一些问题

  1. 我在一个角色中设置环境变量,希望在另一个角色中使用它们 - 不会起作用。

  2. 即使正确的数据可用,我需要将其传递给redis-server.exe的方式也不会被识别为开头有回声的有效入口点


    1. 是了解另一个运行时IP地址和端口的唯一方法 通过代码的工作者角色或是否有我在配置中缺少的语法 文件?
    2. 如果我设法获得IP和端口,是唯一的方法来制作我的 命令行工作将它推送到PowerShell脚本或批处理文件?
    3. 感谢您的想法。

1 个答案:

答案 0 :(得分:2)

一个实例知道另一个IP地址的唯一方法是,如果a。)以编程方式获取它,或b。)另一个实例将其发布到一个众所周知的位置(例如表存储)。在您的情况下,最简单的方法是让slave角色运行一个启动任务来访问RoleEnvironment(可能通过Powershell),并使用Master的IP地址设置一个Environment变量。如果你这样做是一个“简单”类型,我相信它会在你的ProgramEntryPoint执行之前运行(阻塞),你可以在命令行中使用env var。

然而,这里有几个想法:

  1. 您如何处理角色中的多实例?您是否只计划运行单个实例?
  2. 你需要两个不同的角色吗?为什么不是一个具有2个实例的角色通过选举决定哪个是主人?