我正在使用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中运行服务器的slave实例
<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了.
但是我觉得在我的情况下可能有一些问题
>我将环境变量设置为一个角色,并希望在另一个角色中使用它们 – 不会起作用.
>即使正确的数据可用,我需要将其传递给redis-server.exe的方式也不会被识别为开头有回声的有效入口点
>是了解另一个运行时IP地址和端口的唯一方法
通过代码的工作者角色或是否有我在配置中缺少的语法
文件?
>如果我设法获得IP和端口,是唯一的方法来制作我的
命令行工作将其推送到PowerShell脚本或批处理文件?
谢谢你的想法.
最佳答案 一个实例知道另一个IP地址的唯一方法是:a.它以编程方式抓取它,或b.)另一个实例将其发布到一个众所周知的位置(例如表存储).在您的情况下,最简单的方法是让slave角色运行一个启动任务来访问RoleEnvironment(可能通过Powershell),并使用Master的IP地址设置一个Environment变量.如果你把它作为一个“简单”类型,我相信它会在你的ProgramEntryPoint执行之前运行(阻塞),你可以在命令行中使用env var.
然而,这里有几个想法
>您如何处理角色中的多实例?您是否只计划运行单个实例?
>你需要两个不同的角色吗?为什么不是一个具有2个实例的角色通过选举决定谁是主人?