私は昨夜、これも学ぶために小さなプロジェクトを作成しました。私は1.0アルファを使用しましたが、それは簡単でした。私はハブを作成し、そこからうまくいきました:)
私のプロジェクトでは、N個のコンピューティングユニット(一部のサーバーは作業を処理しています)があり、それらが起動すると、ComputeUnitRegisterを呼び出します。
await HubProxy.Invoke("ComputeUnitReqisted", _ComputeGuid);
そして彼らが何かをするたびに彼らは呼ぶ
HubProxy.Invoke("Running", _ComputeGuid);
ここで、HubProxyは:
HubConnection Hub = new HubConnection(RoleEnvironment.IsAvailable ?
RoleEnvironment.GetConfigurationSettingValue("SignalREndPoint"):
"http://taskqueue.cloudapp.net/");
IHubProxy HubProxy = Hub.CreateHubProxy("ComputeUnits");
RoleEnviroment.IsAvailableを使用したのは、これをAzureロール、コンソールアプリ、または.NET4.5で実行できるようになったためです。ハブはMVC4Webサイトプロジェクトに配置され、次のように開始されます。
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(50);
RouteTable.Routes.MapHubs();
public class ComputeUnits : Hub
{
public Task Running(Guid MyGuid)
{
return Clients.Group(MyGuid.ToString()).ComputeUnitHeartBeat(MyGuid,
DateTime.UtcNow.ToEpochMilliseconds());
}
public Task ComputeUnitReqister(Guid MyGuid)
{
Groups.Add(Context.ConnectionId, "ComputeUnits").Wait();
return Clients.Others.ComputeUnitCameOnline(new { Guid = MyGuid,
HeartBeat = DateTime.UtcNow.ToEpochMilliseconds() });
}
public void SubscribeToHeartBeats(Guid MyGuid)
{
Groups.Add(Context.ConnectionId, MyGuid.ToString());
}
}
私のクライアントはJavascriptクライアントであり、メソッドがあります(このためのコードも表示する必要がある場合はお知らせください)。しかし、基本的に、彼らはを聞き、ComputeUnitCameOnline
その実行時にサーバーを呼び出しますSubscribeToHeartBeats
。これは、サーバーコンピューティングユニットが何らかの作業を実行しているときはいつでも、Runningを呼び出し、ComputeUnitHeartBeat
javascriptクライアントでをトリガーすることを意味します。
これを使用して、グループと接続の使用方法を確認できることを願っています。そして最後に、数行のコードを追加することで、複数の紺碧の役割にスケールアウトしました。
GlobalHost.HubPipeline.EnableAutoRejoiningGroups();
GlobalHost.DependencyResolver.UseServiceBus(
serviceBusConnectionString,
2,
3,
GetRoleInstanceNumber(),
topicPathPrefix /* the prefix applied to the name of each topic used */
);
Azureのサービスバスで接続文字列を取得できます。Provider=SharedSecretを覚えておいてください。ただし、パッケージ化されたnugetを追加すると、connectionstring構文もweb.configに貼り付けられます。2は、分割するトピックの数です。トピックには1Gbのデータを含めることができるため、パフォーマンスに応じてデータを増やすことができます。3はそれを分割するノードの数です。2つのAzureインスタンスとローカルホストがあるため、3つを使用しました。このようにRoleNumberを取得できます(ローカルホストを2にハードコーディングしたことに注意してください)。
private static int GetRoleInstanceNumber()
{
if (!RoleEnvironment.IsAvailable)
return 2;
var roleInstanceId = RoleEnvironment.CurrentRoleInstance.Id;
var li1 = roleInstanceId.LastIndexOf(".");
var li2 = roleInstanceId.LastIndexOf("_");
var roleInstanceNo = roleInstanceId.Substring(Math.Max(li1, li2) + 1);
return Int32.Parse(roleInstanceNo);
}
あなたはそれをすべてライブで見ることができます:http://taskqueue.cloudapp.net/#/compute-units