4

次のように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がその役割にネットワークリソースを割り当てるまで、私にはわかりません。@smarxがこれらの線に沿って何かをするのを見てきました。

しかし、私の場合、これにはいくつかの問題があると思います

  1. ある役割で環境変数を設定し、別の役割でそれらを使用することを望んでいます-機能しません。

  2. 適切なデータが利用可能であったとしても、それをredis-server.exeに渡す必要がある方法は、最初にエコーがある有効なエントリポイントとして認識されません。


  1. コードを介して別のワーカーロールのランタイムIPアドレスとポートを知る唯一の方法ですか、それとも構成ファイルに欠落している構文がありますか?
  2. IPとポートを取得できた場合、コマンドラインを機能させてPowerShellスクリプトまたはバッチファイルにプッシュする唯一の方法はありますか?

あなたの考えをありがとう。

4

1 に答える 1

2

あるインスタンスが別のインスタンスのIPアドレスを知る唯一の方法は、a。)プログラムでそれを取得するか、b。)他のインスタンスがそれを既知の場所(テーブルストレージなど)に公開する場合です。あなたの場合、(おそらくPowershellを介して)RoleEnvironmentにアクセスし、マスターのIPアドレスで環境変数を設定するスタートアップタスクをスレーブロールに実行させるのが最も簡単かもしれません。これを「単純な」タイプとして実行すると、ProgramEntryPointが実行(ブロック)する前に実行され、コマンドラインでenvvarを使用できると思います。

ただし、ここでのカップルの考え:

  1. ロール内のマルチインスタンスをどのように処理していますか?単一のインスタンスの実行のみを計画していますか?
  2. 2つの異なる役割が必要ですか?マスターである選挙を介して決定する2つのインスタンスを持つ単一の役割はなぜですか?
于 2012-04-17T12:57:52.720 に答える