问题如下:
有N个用web应用服务器 1,2,3,4,5,6....N
他们各自有不同的web业务应用。如服务器1:BBS,服务器2:商城,服务器3:Bolg。
这些业务逻辑都是基于.net开发现在我需要有一个时时在线用户的统计(当然,这个统计最基本的应用了。有可能还会有其它的交互数据)。这个需要把这N台上的所有登录用户信息(如用户名,帐户资金)都写到一个地方。以供其它的业务逻辑使用。因为这N台服务器上如果用户一旦进行了一些操作那就要修改这个地方所记录的值(如用户在商城消费了2元钱,记录这个地方的用户的帐户资金就是减掉2元)。因为修改非常平凡,所以用sqlserver记录效率会很低,速度不能达到要求。这时,提出了一个解决方案:单配置一台服务器来记录这N台服务器所有的在用户数据,把这些数据记录在这台服务器上的缓存(也可以是内存)上。这样N台服务器都对这台服务的用户信息进行及时的更新。现在的问题是用asp.net+c#怎么去具体实现这种操作。我原来也经常用asp.net的Cache,但它是在System.Web.Caching这个名明空间下的。使用它好像都是记录在本机的,现在需要把所有应用服务器的信息统一放到一台服务器上去。而且还有个问题是操作这些数据的不仅仅是web应用程序,可能还以winform的应用程序。请问各位有没有这方面的资料呀?最好有一个小例子。谢谢各位!!!

解决方案 »

  1.   

    因为修改非常平凡,所以用sqlserver记录效率会很低,速度不能达到要求?请问你修改的频繁程度到多频繁?1秒修改1000次???  你的速度的"要求" 又是多高???如果真是这么高的要求,就多台服务器间在网线上费的时间就够你高兴的了...这些是题外话了...
    我觉得你说的方法不见得是好方法,不过真要这么做你可以看看EnterpriceLib(去微软网站下载)中的Caching ApplicationBlock .
      

  2.   

    这样做好像太复杂了吧,如果必须要这样做,或是可以考虑下web Service使用Session, Appction域,等缓存技术。可以满足“操作这些数据的不仅仅是web应用程序,可能还以winform的应用程序。”
      

  3.   

    用这种方法要想解决的主要就是多个www服务间共享用户状态当用户登录的时候记录一个id和加密串在cookie上,然后封装一个类似读取session的类,这样每个www服务要用到当前用户的登录状态时都根据cookie这个id去状态服务器取得相应的值。
    所以我觉得把这些数据记录到状态服务器的缓存上。如果特殊情况这个状态服务器掉线了也不会有太大的问题。不过是用户状态丢失需要重新登陆而已。还望高手指教!谢谢!!
      

  4.   

    对每个session来看都是独立的,外部无法访问,stateServer也只能让你把所有的Session保存而已,并不能做到不同的应用之间互相共享Session,不同的用户进程中读取其他进程的Session是不安全的.
      

  5.   

    因为我需要N个www服务的用户使用同一个在线状态值。但session不能实现这样一个需求。
    所以我就不用session,把用户的ID值记录到cookie上。然后通过cookie去读取或修改状态服务器上缓存的用户状态数据。用状态服务器来代替session。安全方法我认为不会有什么问题。一个用户登陆之后获得随机产生的一个GUID。然后把登录时间和用户名加密放到cookies。再通过这个上状态服务器找到相应的数据。如果没有就表示没有登录。然后定时清理一段时间没有使用过的状态数据。这样想要通过口篡改cookie里的值来非法取得或修改状态服务器上的数据根本就是不可能的。
      

  6.   

    你不能以同一个登陆入口登入,然后进入不同的应用?既然要求用户状态共享,分成多个应用就会很麻烦。cookie本身就不安全,不管你是否加密,篡改cookie避免不了,何况你的应用是要与“帐户资金”打交道。
      

  7.   

    还有一点 状态服务器还是使用session,何来“状态服务器来代替session”
      

  8.   

    你没有办法做到,通过一个Session ID到stateServer中读取任何Session,这里你要做的是不同的应用之间互相访问内存地址
      

  9.   

    你可以考虑下不用Session,自己写一个服务来储存用户会话状态,这样可以通过相同的ID把会话状态抓出来
      

  10.   

    VincentLiang() ( ) 信誉:100  2006-06-27 15:43:00  得分: 0     还有一点 状态服务器还是使用session,何来“状态服务器来代替session”----------------------------------------------------------------
    状态服务器不会使用session呀。把用户的状态数据全部写入缓存,就像放入数据库一样。
    --------------------------------------------
     seaonce(雨花中的小皮鞋) ( ) 信誉:95  2006-6-27 15:43:25  得分: 0  
     
    搜搜"单点登陆"-----------------------------------------------
    单点登录是把用户的登录用一个单点登录的入口,登录产生令牌了返回相应的应用程序。
    但是我的用户状态数据是要及时交差的。比如我登录了过后在A应用服务器上修改了我的昵称"test"这时候我再到B应用服务器上去,这时候虽然是不用我再登录了,但我的昵称还是原来老的昵称,不能及时取得我在A服务器上新修改的昵称"test"。
     
      

  11.   

    用webservice记录值,用WEBSERVICE二次传值,将结果导入一个程序域的GLOBAL来时时监控数据
      

  12.   

    seaonce(雨花中的小皮鞋):
    能不能给点示例代码。非常感谢!!
      

  13.   

    ASP.NET State Service服务用于专门存放session
    <sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="20" />
      

  14.   

    mode="StateServer"
    这是实现不了的
      

  15.   

    mode="StateServer"需要启动服务器上的StateServer服务。
      

  16.   

    我觉得可以这样,写WebService方法,操作一个XML文件,然后所有的Web服务器都调用这一个方法,也就是说对同一个文件进行读取操作。
      

  17.   

    guoshaohong(风影) ( ) 信誉:92  2006-06-29 18:39:00  得分: 0  
     
     
       我觉得可以这样,写WebService方法,操作一个XML文件,然后所有的Web服务器都调用这一个方法,也就是说对同一个文件进行读取操作。
      
     
    -----------------------------------------------------------------------
    基本的思路是这样。不过肯定不是操作xml。现在其实有两个方案。
    一是操作数据库,这个的优点的维护方便,可以不借助webservice来实现,只要所有的应用服务器和这个状态服务器都是在一个局域网内。这是肯定可以实现的,但现在不太清楚频繁的读写数据效率能否达到需要。
    二是操作缓存,在数据读写的时候效率肯定是最高的。但存在的问题是需要借助webservice或其它一些网间传输的方法,webservice的自身效率也是个问题(个人感觉,没仔细研究过webservice)。再有就是用system.web.cache这个命名空间下的缓存内吗?那如果应用服务又有webform服务又有winform的服务的时候又怎么去解决对这个缓存的共同操作呢
      

  18.   

    为什么不要写到SQL Server里?
    难道用户消费2元不要记录到数据库?
      

  19.   

    通过Remoting来承载缓存,然后不同的应用程序通过Remoting来操作缓存.
      

  20.   

    LoveCherry 老大上次发布了一个例子的,我收藏了,我帮你把它挖出来了,你去下载一下看看,如果不能下载,明天再传代码给你http://community.csdn.net/Expert/topic/5074/5074722.xml?temp=.2256891