しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET SignalR 1.1 でのスケールアウト

SignalR 1.1 のベータが公開されて、スケールアウトプロバイダもさらに新しくなりましたね。内容に関しては開発者の Devid Fowler 氏のブログが最高にわかりやすいです。

SignalR 1.1 beta - Unhandled Exception

ちょっと指定方法が変わったのと、エラー処理周りの機能が増えたので 3 種類のスケールアウトプロバイダについてまとめておきます。

Redis

インストール

Install-Package Microsoft.AspNet.SignalR.Redis -Pre

設定

// RedisScaleoutConfiguration を使って指定する
var config = new RedisScaleoutConfiguration("SERVER_NAME", 6379, "PASSWORD", "WebApplication1")
{
    RetryOnError = true,
    OnError = ex => Trace.WriteLine(ex.ToString())
};

GlobalHost.DependencyResolver.UseRedis(config);

// 接続情報だけを指定する
GlobalHost.DependencyResolver.UseRedis("SERVER_NAME", 6379, "PASSWORD", "WebApplication1");

Service Bus

インストール

Install-Package Microsoft.AspNet.SignalR.ServiceBus -Pre

設定

// ServiceBusScaleoutConfiguration を使って指定する
var config = new ServiceBusScaleoutConfiguration("CONNECTION_STRING", "WebApplication1")
{
    RetryOnError = true,
    OnError = ex => Trace.WriteLine(ex.ToString())
};

GlobalHost.DependencyResolver.UseServiceBus(config);

// 接続情報だけを指定する
GlobalHost.DependencyResolver.UseServiceBus("CONNECTION_STRING", "WebApplication1");

SQL Server

インストール

Install-Package Microsoft.AspNet.SignalR.SqlServer -Pre

設定

// SqlScaleoutConfiguration を使って指定する
var config = new SqlScaleoutConfiguration("CONNECTION_STRING")
{
    RetryOnError = true,
    OnError = ex => Trace.WriteLine(ex.ToString())
};

GlobalHost.DependencyResolver.UseSqlServer(config);

// 接続情報だけを指定する
GlobalHost.DependencyResolver.UseSqlServer("CONNECTION_STRING");

SignalR 1.1 ベータのスケールアウトプロバイダから、エラー時にメッセージをバッファリングしてリトライする機能が追加されました。デフォルトでは false となっているので RetryOnError を明示的に true と指定しないと有効になりません。あと、エラー時に呼び出されるデリゲートを指定できるようになったので、スケールアウトプロバイダがちゃんと動いてるか簡単に確認できるようになりましたね。

このスケールアウトプロバイダは最低限の部分が共通化されているので、3 種類ほとんど同じ指定が使えるようになっているのが良いですね。新しい方法が出てきても簡単に拡張できそうです。