编辑人员注释: 本博客文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写。

在 Windows Azure 网站中设置网站的多个实例是横向扩展网站的绝佳方式,Azure 最大程度地利用应用程序请求路由
IIS 扩展包以在活动实例之间分配连接到您的网站的用户。ARR 通过向连接的用户提供一个特殊的 Cookie(即关联 Cookie),因此可以在用户发出后续请求时知晓其在与哪个服务器实例通信,从而巧妙地对连接用户进行跟踪。这样我们即可确保客户端与特定服务器实例建立会话后,在会话处于活动状态时,客户端始终与同一台服务器进行通信。这对使用会话的应用程序(也称为无状态应用程序)尤为重要,因为特定于会话的数据自身不会从一台服务器移动到另一台服务器。应用程序可以设计用于执行此操作(通常通过将数据存储在某种共享存储中,如
SQL),但大多数应用程序并未这样做,因此通常我们要使每个用户连接到指定的服务器。如果用户移动到另一台服务器,将开始新的会话,并且无论应用程序使用何种会话数据,数据都将丢失(例如,购物车内容)。下面是此过程的简短描述:

1. 客户端连接到 Azure 网站

2. ARR 在前端 Azure 服务器上运行并接收请求

3. ARR 决定应将请求发送到哪个可用实例

4. ARR 将请求转发给所选服务器,创建 ARRAffinity Cookie 并将其附加到请求

5. 包含 ARRAffinity Cookie 的响应返回到客户端

6. 客户端接收响应时,将存储 Cookie 以供稍后使用(浏览器将为从服务器接收的 Cookie 执行此操作)

7. 当客户端提交后续请求时,将包括此 Cookie

8. 当 ARR 接收请求时,将查找 Cookie 并对其进行解码

9. 已解码的 Cookie 保存了之前使用的实例名称,以便 ARR 将请求转发到相同的实例,而非从池中进行选择

10.  在用户关闭浏览器之前(即清除 Cookie 时),将对相同站点的每个后续请求重复相同的步骤(步骤 7 - 9)

但是,也存在无需保留关联的情况。例如,某些用户未关闭其浏览器,并长时间地保持连接状态。这种情况下,关联 Cookie 将保留在浏览器中,使用户保持与服务器的连接,这可能持续几小时、几天甚至更长时间(理论上是无期限的!)。将电脑开着,浏览器也开着,这早已司空见惯,很多人都是这样(特别是工作区的计算机)。实际上,这将导致每个实例的用户分配失去平衡(这和超市中某些收银台被一个用户占用,而导致其他用户的等待时间变长的道理是一样的)。

根据应用程序及其功能,您可以有选择性地关注将用户连接到固定的服务器。如果这不是很重要或完全不重要,您可以禁用此关联以选择更好的负载平衡,我们已引入了此功能,以便您进行控制。

关联受关联 Cookie 控制,因此您仅需确保 Azure 未分发 Cookie 即可禁用关联。禁用后,用户发出的后续请求将视为“新请求”,ARR 将使用普通的负载平衡行为将请求路由到最佳服务器,而非尝试将其路由到“自己的”服务器。

关联 Cookie 如下所示:

可以通过以下两种方式禁用关联:

1. 在应用程序中

2. 在站点配置中

要在应用程序中控制此行为,您需要编写代码来发出一个特殊的 HTTP 头以指示应用程序请求路由器删除关联 Cookie。此头为
Arr-Disable-Session-Affinity,如果您将其设置为 true,ARR 将剔除 Cookie。例如,您可以将与此头类似的行添加到您的应用程序代码中:

headers.Add("Arr-Disable-Session-Affinity",  "True");

* 此示例针对 C#,但使用任何其他语言或平台也可以轻松实现。

如果您想在大多数情况下保持关联并且仅在特定的应用程序页面重置关联,则在应用程序的代码中设置此头将非常适合。但是,如果您想要完全禁用关联,您可以始终通过将 IIS 自身直接插入该头使 ARR 删除 Cookie。这可以通过
web.config 中的 customHeaders 配置部分实现。只需将以下内容添加到 web.config,并将 web.config 上传到站点的根目录即可:

但是请记住,web.config 中的配置非常敏感,如果文件格式错误,可能会导致站点无法正常运行。如果您之前没有使用过
web.config 文件,请阅读此入门指南

故障排除

如果您打算实施这一方案,您可能想知道如何确认它的运行情况并进行故障排除。ARR 关联 Cookie 正常情况下包含在任何 Azure 网站的第 1 个响应中,随后包含在客户端发送的任何请求以及从服务器接收的响应中。要查看其是否在运行,您可以使用多种 HTTP 故障排除和诊断工具中的任意一种。下面列出了一些较为常用的选项:

1. Fiddler

2. HTTPWatc

3. Network Monitor

4. WireShark

5. Firebug

您可以在此处查找关于其他一些工具的信息。上面列出的第
1 个工具 Fiddler 是最常用的工具之一,因为它可以与任何浏览器交互,并且是免费提供的。安装 Fiddler 后,它将记录您浏览到的任何 URL,然后您可以单击请求或响应的 Inspector 选项卡来查看详细信息。例如,您可以在下面查看 HTTP Headers 选项卡,其中显示了服务器使用 Set-Cookie 头发送的关联 Cookie:

如果您添加 Arr-Disable-Session-Affinity 头来禁用关联 Cookie,ARR 将不设置 Cookie,但它也会自行删除
Arr-Disable-Session-Affinity 头,因此如果您的进程正常运行,您将看不到 Cookie 和头。如果您看到 Cookie 和头,则意味着您设置头的方式有误。可能是头名称或头值的文本出错了。如果您只看到 Cookie 而并未看到头,这可能意味着您对 web.config 的更改无效,或您的头插入代码没有运行,您可以尝试通过添加其他的无关头来进行确认。一般来说,使用 web.config 设置头要比使用代码进行设置更加容易,因此,如有疑问,应该先简化设置以缩小要调查的范围。

最后,应该指出的是,禁用关联时不应掉以轻心。静态内容很少会出现问题,但是如果您正在运行应用程序,并且这些应用程序不是专门用来处理从一台服务器跳到另一台服务器的用户的,程序可能会失败。对于关联导致失衡的情况,这一新功能无疑是个大好消息。

本文翻译自:

http://blogs.msdn.com/b/windowsazure/archive/2013/11/18/disabling-arr-s-instance-affinity-in-windows-azure-web-sites.aspx

禁用 Windows Azure 网站中的 ARR 实例关联的更多相关文章

  1. 在 Windows Azure 网站中进行纵向扩展和横向扩展

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Byron Tardif 撰写. 当您开始一个新的 Web 项目,或者刚刚开始开发一般的网站和应用程序时,您可能希望从小处着手. ...

  2. 探索 Windows Azure 网站中的自动伸缩功能

     去年10月,我们发布了若干针对 WindowsAzure平台的更新,其中一项更新是添加了基于日期的自动伸缩调度支持(在不同的日期设置不同的规则). 在这篇博客文章中,我们将了解自动伸缩的概念,并 ...

  3. 进一步探索:Windows Azure 网站中解锁的配置选项

     编辑人员注释: 本文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 在 Windows Azure 网站 (WAWS) 中管理网站时,许多选项可使用 Azu ...

  4. 在 Windows Azure 网站中配置动态 IP 地址限制

    我们最近对 Windows Azure 网站进行了升级,并启用了IIS8的动态 IP 限制模块.现在,开发人员可以为其网站启用并配置动态 IP 限制功能(或简称 DIPR). 可以通过以下链接查看此 ...

  5. Windows Azure 网站上的 WebSocket 简介

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站最近新增了对 WebSocket 协议的支持..NE ...

  6. Windows Azure 网站的 IP 和域限制

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. 配置 Azure 网站 (WAWS) 的 IP 和域限制一直是用户最迫切希望我们提供 ...

  7. Windows Azure 网站:应用程序字符串和连接字符串的工作原理

    编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站上有一个方便的功能,即开发人员可将 Azure 中的 ...

  8. Windows Azure 网站上的 WordPress 3.8

     编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写. WordPr ...

  9. Windows Azure 网站 (WAWS) 中的服务器端包含 (SSI)

     编辑人员注释:本文章由 Windows Azure 网站团队的项目经理Erez Benari 撰写. Windows Azure 网站客户普遍关心的一个问题是关于我们对服务器端包含(Server ...

随机推荐

  1. iOS设计模式——MVC(Model-View-Controller)

    Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用.基于MVC设计 模式,Cocoa整体架构可以划分 ...

  2. 关于ASP控件对象的一些简单操作

    在线人数 Application.Lock(); Application[).ToString(); Application.UnLock(); Label1.Text = Application[& ...

  3. POJ 3623 Best Cow Line, Gold(字符串处理)

    题意:给你一个字符串,让你重新排列,只能从头或者尾部取出一个放到新字符串队列的最后.按照字典序. 解决方法:比较前后两个的大小,谁小输出谁,相等,就往当中比来确定当前应该拿最前面的还是最后面的,如果再 ...

  4. C++读写文件的简单例子

    #include <iostream> #include <fstream> using namespace std; void main() { ofstream in; i ...

  5. jQuery.validate 中文 API

    名称 返回类型 描述 validate(options) Validator 验证所选的 FORM. valid() Boolean 检查是否验证通过. rules() Options 返回元素的验证 ...

  6. 基本event封装:阻止冒泡、默认事件等

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> ...

  7. datatable,查询,排序,复制等操作

    DataTable排序,检索,合并详解 一.排序 获取DataTable的默认视图 对视图设置排序表达式 用排序后的视图导出的新DataTable替换就DataTable (Asc升序可省略,多列排序 ...

  8. wordpress 首页模板变量对应表

    最近开始学习wp,这里做一些笔记. 首页模板,第一行为前台显示的html代码.第二行为 wp-content/themes/模板目录 下 head.php文件中. 其中我将变量名 html用绿色标记 ...

  9. CPU卡

    CPU卡芯片通俗地讲就是指芯片内含有一个微处理器,它的功能相当于一台微型计算机.人们经常使用的集成电路卡(IC卡)上的金属片就是CPU卡芯片.CPU卡可适用于金融.保险.交警.政府行业等多个领域,具有 ...

  10. Win32 GDI基础(笔记)

    1.GDI名字的意义 GDI Graphic Device Interface,我说不清和GUI有什么区别.可能一种针对设备,一种针对用户而言吧,反正以后都说GDI,也就是Windows的图形编程. ...