帐号重复登录处理

       前面说了"一个帐号多设备登录的处理"这里说说另一种情况,在不允许重复登录的要求下,

如何处理用户帐号重复登录后台服务? 这个看起来简单的问题,可很是纠缠了我一段时间。 


 一.选择哪种处理方法。
 首先,有两种可选择的方法:
    方法一. 如果用户已登录,则后续的登录请求都拒绝掉,并断掉新连接。
     好处:
    它能防止恶意发登录连接请求,同时,如用户访问处理是通过HASH来路由的话,
     可以在连接层就挡掉重复连接了。
     碰到的问题:
       1.在技术层面,TCP有时并不可靠,收不到连接断开的消息。这时有可能用户连接已经断开了。
       但服务端仍认为它在线,要一直等到超过心跳周期才断开。这期间客户端一直连接不上。
       2.在业务层面,存在用户之前登录过的设备不在身边,然后用新设备用户密码都对,但老登录不上去。 
       用户体验不好。

   方法二. 如果用户已登录,当有新登录请求时,如效验通过,则给已有连接发一条断开消息,然后断开这个连接。
      使用新的登录连接成为用户最新连接。

       这个方法的问题是,加重了服务端的处理任务,每一个新请求都要移到后面服务中处理一遍。
 我最后选的是方法二的方案。

 二. 那如何断开连接?
   这个地方有坑。    
    1. 发出因重复登录断开连接的提醒消息给被T设备时,可能因为业务关系,这个客户端前面已经排了一堆消息了。
    然后这个客户端慢慢的接收了一堆消息后,接到通知,你要被T了,然后就被T了....... 这期间,它还可能还在
    不停的发消息。
    2. 连接已被断开,但可能有些异步消息处理才刚处理完。这时,要合理的处理这种响应消息。可以丢弃一些,另一
    些可以转给新连接。

   怎么搞? 第二点可能没办法,但第一点可想点法子.
    简单粗暴点,不给客户端发啥消息了,直接断开。但记录下这个被T的设备的标识。当后面这个设备再发重连

   消息过来时,如果记录到这个被T过了,这时再发个重复登录断开连接通知,让它知道不要再重连了,然后再断开它的连接。


好像目前暂时只碰到这些问题。


Blog: http://blog.csdn.net/xcl168



你可能感兴趣的:(Golang)