4

我正在使用 ProgramEntryPoint 在 Windows Azure Worker Role 中运行命令行程序(可能是 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 为该角色分配网络资源之前我不知道的东西。我已经看到@smarx 沿着这些思路做了一些事情

但是我认为在我的情况下可能有一些问题

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

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


  1. 是通过代码了解另一个工作角色的运行时 IP 地址和端口的唯一方法,还是我在配置文件中缺少语法?
  2. 如果我设法获得 IP 和端口,是让我的命令行工作以将其推送到 powershell 脚本或批处理文件的唯一方法吗?

谢谢你的想法。

4

1 回答 1

2

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

然而,这里有几个想法:

  1. 您如何处理角色中的多实例?您是否只计划运行单个实例?
  2. 你需要两个不同的角色吗?为什么不使用具有 2 个实例的单个角色通过选举决定哪个是主控?
于 2012-04-17T12:57:52.720 回答