StateServer のパーティショニングを行う

皆大好き State Server ですが、残念ながらセッションの出し入れのみという極めてシンプルな機能しか持ちません。 でも大規模なサイトでも使いたい!スケールさせたい!ですよね?ということで State Server のパーティショニング機能が無ければ自前で実装してしまいましょう。

参考サイト
http://blog.maartenballiauw.be/post/2008/01/ASPNET-Session-State-Partitioning.aspx http://blog.maartenballiauw.be/post/2008/01/ASPNET-Session-State-Partitioning-using-State-Server-Load-Balancing.aspx

パーティショニングされたセッションの保存先にデータを振り分けるには、IPartitionResolver インタフェースを実装します。

IPartitionResolver インタフェースは、SQL Server モード or State Server モードの時のみ、セッションデータストアのカスタムパーティション解決を提供するのみの中々思い切ったインターフェースでメソッドも 2 つしか定義されていません。

実装はこれだけです。簡単ですね。

public class MyPartitionResolver : IPartitionResolver
{
    private static List<string> _partitions;

    public void Initialize()
    {
        _partitions = new List<string>
        {
            "tcpip:ip1:port",
            "tcpip:ip2:port"
        };
    }

    public string ResolvePartition(object key)
    {
        var sessionId = key as string;

        var partitionId = Math.Abs(sessionId.GetHashCode()) % _partitions.Count;

        return _partitions[partitionId];
    }
}

Web.config も修正します。

<sessionState mode="StateServer" partitionResolverType="namespace.MyPartitionResolver"></sessionState>

ResolvePartition メソッドでは各々好きなようにバランシングアルゴリズムを組んで下さい。 例えば、参考サイトではパフォーマンスカウンタからアクティブなセッション数を計測して、最もセッション数の低いノードにロードバランスしています。