玩蛇记-给tornado加入Session之可跨主域-跨应用的Server Farm原理篇
WARNING!
阅读本文需要具有使用python编程的能力以及Web编程的经验,起码应该知道python是什么,Session是什么。初学者慎入,某些描述语焉不详,小心误入歧途,欢迎高手踊跃拍砖。本文代码仅仅作为示例使用,用于说明在tornado中实现session的过程以及方法,未经过任何编译或者运行,请勿直接copy到项目中使用,本人不对此行为造成的后果负任何责任。(此文实现内容源于商业项目,恕未能直接提供源码)
所谓保暖思YY,昨天我们解决了在tornado中使用Session的问题,那么再进一步,当我们需要将应用水平分割,把一些功能单独移出来部署到不同的服务器,不同的域名下的时候,如果仍然要保持会话和会话中的数据的话,就需要我们做一些额外的工作了。很多网站是采用强制指定cookie的域名到主域的方式来实现,不过这样有安全性的隐患,所以我们不打算这么办。根据昨天的分析我们可以知道,其实session是需要依赖于Cookie来保持其SessionID,所以我们如果需要让Session能够跨域跨服,那么要解决的就是两点,其一是存储的跨域跨服,其二就是SessionID要能够安全的传递到不同的应用服务器,存储比较好解决,会话数据都要统一的都是自己的应用,所以服务器都是可访问的,可以单立一台Session Server上部署Memcached来共享访问,或者Mysql,或者其他网络数据库(sql,nosql,均可)。其二就是共享SessionID的方式了。由于Session会话主要是用来记录登录用户的信息,所以这里我们认定以登录服务器的Session为主。所以同步SessionID的过程和SSO的过程大同小异。过程如下图:
我们通过加密的token来同步SessionID,这个过程和SSO的过程几乎是一致的,这样即使各个应用在不同的主域下也能够够让应用正常使用Session。这种方式退出比SSO要方便,只需要删掉Memcached里的数据项就可以让所有的应用自然退出,由于各个模块在同步后都有SessionID,所以在随便哪个应用都可以通过删掉Session来退出。
具体的代码我们在下一章来继续讨论。