互联网的系统需要考虑的方面特别多,淘宝的架构师给了我们很多的参照:http://m.csdn.net/article/2013-08-27/2816716。而在我们的程序的实现上,分布式的session管理机制成为了高可扩展性、高效集群的关键。本小短文讲述了分布式session管理机制的实现方式,为日常架构的开发实现提供一点参考。
一、为什么tomcat能够知道某个请求属于哪个用户
浏览器的诞生之时,浏览器面向的基本上都是超文本协议(html),超文本的内容基本上都是没有会话状态的静态文本。所以,页面的功能也就停留在了页面展示。1994年,网景公司前雇员Lou Moutulli将magic cookie的概念引入到web,才赋予了web记忆的功能。从此,通过cookie的机制,客户端与服务器端的会话诞生。
那么,同时访问服务器的客户端那么多,为什么服务器端能够知道当前的这个客户端是哪个已经登陆的用户呢?原理其实很简单。浏览器在每次发送http请求的时候,都会把一个叫jsessionid的cookie带上。服务器端就通过这个jsessionid在服务器的所有已经登陆的用户sessionMap中找到对应的session,由此,我们就可以从session中得到用户名、用户信息等等等等。
二、分布式sesssion管理机制
所谓的分布式session管理机制,就是利用memcached等缓存工具,把session的内容存储至memcached中。当客户端请求时,从memcached中调取session的内容。每次访问时更新memcached的时间戳,以保持session。这就实现了session的保持。而,这就要求我们能够自己实现tomcat的session机制。实际情况并不复杂,只需实现以下几点内容:1、在客户端自定义一个sid,存储会话的uuid,2、在memcached中以这个sid存储用户的session内容,包括用户名、用户信息等等;3、每次访问web服务器时,session内容都从memcached中获取。4、对于现阶段没有修改过的memcached,每次get后再put一次,以更新memcached中的时间戳。通过这种方式实现的系统,所有的session状态都存储于memcached分布式系统中,对于任意一个tomcat的删除或者重启都不会影响用户的正常使用。因此,我们的系统就可以完全具备了高可扩展性。
仅此提供一点互联网大负载系统实现的参考。
北京师范大学 计算机系 张人杰
2016.02.28