Cloud Foundry Session Affinity(Sticky Session)的实现

会话保持(Session Affinity),有时又称粘滞会话(Sticky Sessions), 是负载均衡领域设计须要着力解决的重要问题之一,也是一个相对比较复杂的问题。html

会话保持是指在负载均衡器上的一种机制,在完成负载均衡任务的同时,还负责一系列相关连的访问请求会分配到一台服务器上。浏览器

当用户向服务器发起请求,服务器建立一个session,并把session id以cookie的形式写回给客户。服务器

看一个例子:当我访问SAP UI5应用时,cookie

在http请求的头部观察到客户端要求服务器返回以cookie的形式返回session id的请求字段:session

在服务器响应的头部字段果真返回了session id:app

这些cookie信息可以在Chrome开发者工具的Application标签页里的Cookies区域查看:负载均衡

如此一来,只要客户的浏览器不关,再去访问服务器时,访问请求会自动附上session id去,服务器端检测到这个session id后,就会使用内存中维持的与这个id对应的session为客户端服务。工具

再回到咱们讨论的会话保持这个话题。何时须要会话保持?举个你们天天都会遇到的例子,你们在淘宝或者京东上购物时,从完成用户身份认证到浏览店铺,选择心仪商品加入购物车,一直到最后下单完成支付,须要通过不少次和服务器的交互过程才能完成整个交易。因为这几回交互过程从顺序上和逻辑上是密切相关的,服务器在进行这些交互过程的某一个交互步骤时须要一个上下文(Context),即上一次交互过程的输出,所以要求这些相关的交互过程都由一台服务器完成。spa

在这种状况下,假设负载均衡器仍然把这些相关交互session分散到不一样的服务器实例上,就会带来很糟糕的用户体验,好比客户在浏览器上每点击一次,都会弹出登陆页面。或者即便用户输入了正确的验证码,却仍然提示验证码错误。因为服务器处理实例不同,也有可能形成客户放入购物车的物品丢失。设计

这就是会话保持机制引入的缘由:确保把来自同一客户的一个完整会话的请求转发至后台同一台服务器进行处理。

那么Cloud Foundry的Session Affinity是怎么实现的呢?

官方文档有介绍:

https://docs.cloudfoundry.org/concepts/http-routing.html#sessions

(1) To support sticky sessions, configure your app to return a JSESSIONID cookie in responses. The app generates a JSESSIONID as a long hash in the following format:

您的应用在响应结果里须要加上一个JSESSIONID字段,长度以下:

1A530637289A03B07199A44E8D531427

(2) If an app returns a JSESSIONID cookie to a client request, the CF routing tier generates a unique VCAP_ID for the app instance based on its GUID in the following format:

CF routing tier基于app生成的JSESSIONID生成一个VCAP_ID: 323f211e-fea3-4161-9bd1-615392327913

(3) 接下来客户每次发起请求,必须同时提供JSESSIONID和VCAP_ID。JSESSION_ID交给应用,用于实现session粘连。而VCAP_ID用于标识服务的应用实例,若是应用挂了,gorouter会把请求路由到另外一个应用实例上。

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

相关文章
相关标签/搜索