0

私は、jclouds を利用して、Amazon クラウドで多数のノードをインスタンス化するシステムを開発しています。

作成済みのノードを知る必要がある場合は、computeService.listNodes() を使用します。listNodes の呼び出しごとに、次のようにオブジェクト computeService を作成します。

Properties overrides = new Properties();
overrides.setProperty(AWSEC2Constants.PROPERTY_EC2_AMI_QUERY, "image-id=" + image);

ComputeServiceContext context = new ComputeServiceContextFactory()
.createContext(PROVIDER,
  Configuration.get("AMAZON_ACCESS_KEY_ID"),
  Configuration.get("AMAZON_SECRET_KEY"),
  ImmutableSet.<Module> of(), overrides);

computeService = context.getComputeService();

通常は機能しますが、computeService.listNodes() への複数の同時呼び出しを取得すると、実行に失敗します。

そのような実行では、createContext 行の一部のスレッドで例外が発生しました。完全なスタック トレースが添付されます。

私を困惑させているのは、複数の computeServices をインスタンス化するためのループを含む小さなプログラムを作成したことです。問題はありませんでした。

JClouds API を間違って使用することはありますか? JClouds は同時呼び出しをサポートしていませんか? それとも、AWS 呼び出しに対する何らかの制限でしょうか? (前の段落は、これらの質問に対する答えが「いいえ」であることを示唆していますが、今は他の選択肢は考えられません)。

重要な情報: 私のコードは、REST 呼び出しから、apache cxf でセットアップされたスタンドアロンのローカル サーバーに実行されます。

これは、サーバーのセットアップを担当するクラスです: https://github.com/choreos/choreos_middleware/blob/master/ServiceDeployer/src/main/java/org/ow2/choreos/npm/rest/NPMServer.java

呼び出しを受け取るクラスは次のとおりです: https://github.com/choreos/choreos_middleware/blob/master/ServiceDeployer/src/main/java/org/ow2/choreos/npm/rest/NodesResource.java

スタック トレースの関連部分:

1) Error in custom provider, java.lang.reflect.UndeclaredThrowableException
  while locating org.jclouds.ec2.config.EC2RestClientModule$RegionIdToZoneId
    Caused by: java.lang.reflect.UndeclaredThrowableException
    at $Proxy98.describeAvailabilityZonesInRegion(Unknown Source)
    at     org.jclouds.ec2.config.EC2RestClientModule$RegionIdToZoneId.get(EC2RestClientModule.java:152)
Caused by: java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:258)
at java.util.concurrent.FutureTask.get(FutureTask.java:119)
at     org.jclouds.concurrent.config.ExecutorServiceModule$AddToStringFuture.get(ExecutorServiceModule.java:234)

2) Error in custom provider, org.jclouds.http.HttpResponseException: ec2.ap-northeast-1.amazonaws.com connecting to POST https://ec2.ap-northeast-1.amazonaws.com/ HTTP/1.1
  while locating org.jclouds.ec2.config.EC2RestClientModule$RegionIdToZoneId
Caused by: org.jclouds.http.HttpResponseException: ec2.ap-northeast-1.amazonaws.com connecting to POST https://ec2.ap-northeast-1.amazonaws.com/ HTTP/1.1
at     org.jclouds.http.internal.BaseHttpCommandExecutorService$HttpResponseCallable.call(BaseHttpCommandExecutorService.java:183)
Caused by: java.net.UnknownHostException: ec2.ap-northeast-1.amazonaws.com
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:175)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)

OBS: スタック トレースの「at org.ow2.choreos.npm.cloudprovider.AWSCloudProvider.getClient(AWSCloudProvider.java:53)」行は「createContext」行です。

ありがとう、レオナルド・レイテ

4

1 に答える 1

1

jcloudsのノードクエリはキャッシュされないため、複数の同時リクエストによりネットワークタイムアウトが発生する可能性があります。同時に多数のlistNodeを実行している場合は、guavaキャッシュの使用を検討してください。

とにかく、私はjclouds 1.5.3にぶつかります。これには、接続を作成するためのよりクリーンな構文もあります。

ComputeServiceContext context = ContextBuilder.newBuilder(PROVIDER)
                                              .credentials(Configuration.get("AMAZON_ACCESS_KEY_ID"), Configuration.get("AMAZON_SECRET_KEY"))
                                              .overrides(properties)
                                              .buildView(ComputeServiceContext.class);

最後に、コンテキストプロパティ「jclouds.regions」に関心のあるリージョンのコンマ区切りリストを指定することで、使用するリージョンを分離できます。たとえば、「us-west-1」は、リモートリージョンへのネットワーク呼び出しを防ぎます。 。

于 2012-11-16T20:52:04.680 に答える