using System.Net;
using System;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log, ExecutionContext context)
{
string testThreadId = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "id", true) == 0)
.Value;
var funcId = context.InvocationId.ToString();
var homePath = Environment.GetEnvironmentVariable("HOME");
var folderName = Path.Combine(homePath,@"site\wwwroot\JanoRunTime2");
var fileName = Path.Combine(folderName,"AzureFunctionTest.exe");
var configFile = Path.Combine(folderName,"AzureFunctionTest.exe.config");
var setup = new AppDomainSetup();
setup.ApplicationBase = folderName;
setup.ConfigurationFile = configFile;
var newDomain = AppDomain.CreateDomain("JanoTestExecutorDomain_" + funcId, null, setup);
try{
newDomain.ExecuteAssembly(fileName, new []{testThreadId, funcId});
return req.CreateResponse(HttpStatusCode.OK);
}
catch(Exception e){
return req.CreateResponse(HttpStatusCode.InternalServerError);
}
finally{
AppDomain.Unload(newDomain);
}
}
要求を並列に実行するが、言語に基づいて、差が(ノードは、例えば、シングルスレッドである)が存在しています。いくつかのワークロードで並列実行とスケーリングを検証したい場合は、hereを配備できるソリューションのgithubがあります。
あなたの関数は、いくつかの条件の下でより多くのインスタンスに拡張されますが、最も関連性の高いスループットです。Azure関数は、単位時間あたりに完了する要求の数を追跡し、 Hereは消費計画の仕組みに関する情報です。
ファンクションとサーバーレスコンピューティングの考え方は、開発者からその考慮事項を削除することです。関数 'インスタンス'は1.5GBのメモリで計算する単位と考えることができます。ハードウェアをよりコントロールしたい場合は、常にアプリケーションサービスプランで関数を実行できます。
作業負荷のためにこの「シリアライズされた」動作が発生している可能性があります。まったく新しいAppDomainでCPU依存ワークロードを起動して戻った場合、この関数はまだ作業中であることを追跡できないことがあります。この場合、スループットのスケーリング条件を満たさずにCPUを最大限に活用することができます。
こんにちは、ありがとう。だから私は新しいappdomainで私のものを実行する問題自体が可能性がありますか?それとも、私はそれを非同期に実行するのですか?私はAppDomain.ExecuteAssemblyを使用していますが、私が知っているのは同期です。 –
[AppDomain.ExecuteAssembly](https://msdn.microsoft.com/en-us/library/sxx9f4c2(v = vs.110).aspx)を見ると、実際には新しいAppDomainは作成されず、実行されているように見えますスケーリングが発生するはずです。再現しようとすると、テストコードが表示されるのが便利です。 また、混乱を解消するため、Azure関数は非同期呼び出しを適切に処理します。潜在的な問題を想像できる唯一のシナリオは、関数から完全に新しいプロセス/ AppDomains /スレッドを生成し、その完了を待つことがないということです。 –
私のアプリケーションのソースコードを追加しました。私は、新しいappdomainが作成され、コンソールアプリケーションが同期して実行されると思う。 –