SNA架构的几种实现方式

参考资料:
Shared Nothing Architecture与PHP的童话
Shared Nothing Architecture

   以往集群架构都采用Session共享模式进行设计,而后PHP等方面提出了SNA架构,主张Session不共享。SNA架构思想,无论对企业应用还是大型互联网站,极大提高了web应用的吞吐量和性能。
   一般SNA架构以集成分布式Cache例如 memcached 的方案居多,此处姑且称为 Cache模式。


   我结合公司电信项目的情况,以及思考,总结另一种方案,供参考。
   SNA思想的关键就是每个集群内web server实例不互相共享session,Cache模式主张session数据都放到分布式缓存中,意味着,逻辑上集群内还是要共享session信息;这种考虑源于负载均衡时,同一个IP发来的两个请求,可能走到不同的 Web Server上。

   因此,只要同一IP的两个请求转发到同一个 Web  server实例,那么就可以不需要全局的 session信息缓存。
   1) 我所在的移动项目下,采用 F5硬件负载均衡器,使用IP记忆机制实现了这一点。因此,各 web server实例的session无需共享,仍然保存在自己的session内存中,节省了网络开销和Cache命中查找时间。
   F5很贵,因此对于网站一般负担不起,但可以采用软件负载来做到这一点。

   切分模式的SNA架构:
   2) IP Memory(IP记忆):负载服务器记录 客户端IP -> ServerID 的关系,模拟F5;
   3) (Dispatch by Rule)按规则转发:IP记忆需要维护一张路由table, 因此,需要消耗一定内存,以及映射关系查找的时间;
      我们将客户端的所有IP看作一个集合 IP Set,按固定规则将其平均分配集群的server实例上去,这样就可以节省路由table的开销。 关键是分配算法,可以考虑的有:
      2.1) 简单数值法: IP各节加总 = X, 假定集群实例个数为 N,编号1-N, 那么每次请求选择的目标server id = X mod N。
      2.2) hash值法: 有的系统可能想基于 userid 进行请求分配, 那么可以采用 X = hashCode(userid), serverID = X mod N;
      具体情况下, 可以灵活选择使用那个数据项判断请求分配的逻辑。这个思想参考了  memcached 的集群管理思想。
   

   4) stickySession方式。
      一般apache等采用这种方式做负载均衡。但必须结合 jvmRoute。 第一次被分配的 web server必须返回一个 jvmRoute在response中,并由 apache 送到客户端浏览器,第二次请求发起时,request信息中将包含 JSESSIONID 和 对应的 jvmRoute, apache根据次找到对应的 server,完成 stickySession机制。


结论: 切分模式的SNA架构,基于规则进行请求转发,可以省去分布式Cache的使用,更进一步的提升系统吞吐量和响应性。

你可能感兴趣的:(设计模式,Web,cache,memcached,企业应用)