ASP.NET2.0下实现分布式StateServer(状态服务器)
2015-03-21 08:10
246 查看
在一个asp.net1.x时代,我们一个站点的状态服务器(或者叫会话服务器),最多只能有一台,一台服务器在中小型网站下问题还不大,一旦网站到了一定的规模,状态服务器会压力很大。asp.net从2.0开始就对状态服务提供了基于Hash的负载均衡策略。下面具体谈一下这种策略的实现方式。
一、配置文件:
修改SessionState配置节
<SessionState
mode="StateServer"
timeout="20"
partitionResolverType=
"mySessionState.PartitionResolver" />
增加多个SessionState的地址
<appSettings>
<add key="StateServers" value="tcpip=192.168.10.1:42424,tcpip=192.168.10.2:42424"/>
</appSettings>
二、实现一个partitionResolver类来支持分布式
这里的PartitionResolver类就是SessionState配置节的 partitionResolverType= "mySessionState.PartitionResolver"
asp.net的状态管理模块会自动调用该类的ResolvePartition方法,来找到当前的Session应该访问那台状态服务器,就不多说了 ,看看代码一切就都明白了!
public class PartitionResolver : System.Web.IPartitionResolver
{
private String[] partitions;
public void Initialize ( )
{
// create the partition connection string table
partitions =AppSetting.StateServerList.Split( new char[]{','} );
}
public String ResolvePartition ( Object key )
{
String sid =key as string;
// hash the incoming session ID into
// one of the available partitions
int partitionID = Math.Abs( sid.GetHashCode() ) % partitions.Length;
return partitions[partitionID];
}
}
另外除了使用以上微软的的策略,你还可以实现自定义的session Module,这个时候状态服务器就可以任意选择了,你可以选择开源的MemCached,或者用.NET Remoting自己实现一个Session Store
一、配置文件:
修改SessionState配置节
<SessionState
mode="StateServer"
timeout="20"
partitionResolverType=
"mySessionState.PartitionResolver" />
增加多个SessionState的地址
<appSettings>
<add key="StateServers" value="tcpip=192.168.10.1:42424,tcpip=192.168.10.2:42424"/>
</appSettings>
二、实现一个partitionResolver类来支持分布式
这里的PartitionResolver类就是SessionState配置节的 partitionResolverType= "mySessionState.PartitionResolver"
asp.net的状态管理模块会自动调用该类的ResolvePartition方法,来找到当前的Session应该访问那台状态服务器,就不多说了 ,看看代码一切就都明白了!
public class PartitionResolver : System.Web.IPartitionResolver
{
private String[] partitions;
public void Initialize ( )
{
// create the partition connection string table
partitions =AppSetting.StateServerList.Split( new char[]{','} );
}
public String ResolvePartition ( Object key )
{
String sid =key as string;
// hash the incoming session ID into
// one of the available partitions
int partitionID = Math.Abs( sid.GetHashCode() ) % partitions.Length;
return partitions[partitionID];
}
}
另外除了使用以上微软的的策略,你还可以实现自定义的session Module,这个时候状态服务器就可以任意选择了,你可以选择开源的MemCached,或者用.NET Remoting自己实现一个Session Store
相关文章推荐
- ASP.NET2.0下实现分布式StateServer(状态服务器)
- ASP.NET2.0下实现分布式StateServer(状态服务器)
- 创建并设置ASP.NET的会话状态服务器(SQL State Server)
- 存储session状态在SQL 服务器的数据库中Storing Session State in a SQL Server Database)
- 使用 ServerSocketChannel 实现的 File 服务器
- 用sql-server进行分布式查询(链接服务器)(转)
- 采用C#泛型实现状态(State)模式
- ASP.NET2.0服务器控件开发之实现事件
- ASP.NET2.0状态管理系列(2) 视图状态ViewState和EnableViewState属性
- 无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动
- ASP.NET2.0服务器控件之自定义状态管理
- 使用 ServerSocketChannel 实现的 File 服务器
- [原创]使用RMI编写客户端-服务器应用程序,实现分布式计算
- 无法序列化会话状态。请注意,当会话状态模式为“StateServer”或“SQLServer”时,不允许使用无法序列化的对象或 MarshalByRef 对象。
- ASP.NET2.0服务器控件开发之实现事件
- 使用sql-server进行分布式查询(链接服务器)
- 会话状态为StateServer时,viewstate保存在Session中的一些问题
- 实现 IStateManager 接口的服务器控件在设定属性时的注意点
- ASP.NET2.0服务器控件之自定义状态管理
- ASP.NET2.0服务器控件开发之实现事件