为什么需要 Websocket?

HTTP协议是无连接的,只有客户端可以从服务器请求信息。在任何情况下,服务器都可以联系客户端。HTTP是纯粹的半双工。此外,服务器只能回答一次客户端请求。
一些网站或web应用程序需要服务器不时地更新客户端。有几种方法可以做到:

  • 客户端定期请求服务器检查是否有新的可用信息
  • 客户端向服务器发送请求,一旦服务器有信息要提供给客户端,服务器就会立即应答(也称为长时间轮询)

但是由于HTTP的限制,这些方法有很多缺点。

因此设计了一个新协议:websockets,它允许客户端和服务器之间通过单个 TCP 连接进行两种方式的通信(全双工)。 此外,websockets 重新使用它初始化时的 HTTP 连接,这意味着它使用标准的 TCP 端口。

Websocket 如何工作?

基本上,一个 websocket 以 HTTP 请求开始,如下所示:

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: avkFOZvLE0gZTtEyrZPolA==
Host: localhost:8080
Sec-WebSocket-Protocol: echo-protocol

最重要的部分是“Connection: Upgrade”报头,它让客户端告诉服务器它想要更改到其他协议,其名称由“Upgrade: websocket”报头提供。

当一个具有websocket能力的服务器收到上面的请求时,它会回答如下的响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: tD0l5WXr+s0lqKRayF9ABifcpzY=
Sec-WebSocket-Protocol: echo-protocol

最重要的部分是状态码101,用于确认协议切换(从HTTP切换到websocket)以及“Connection: Upgrade” 和 “Upgrade: websocket” 报头。

从现在开始,用于 HTTP 请求/响应质询的 TCP 连接用于 websocket:每当一个点想要与另一个点交互时,它可以使用它。

一旦一个对等方决定或 TCP 连接关闭,套接字就会完成。

相关博客: 负载均衡器如何工作?

HAProxy 和 Websockets

如上所述,在websockets中嵌入了2个协议:

  1. HTTP: 用于websocket设置
  2. TCP: websocket数据交换

HAProxy必须能够在这两个协议上支持websockets,而不会在任何时候中断TCP连接。
有两件事需要注意:

  1. 能够在不中断连接的情况下将连接从HTTP切换到TCP
  2. 同时巧妙地管理两个协议的超时

幸运的是,HAProxy 嵌入了正确负载平衡 websockets 所需的一切,并且可以满足上述 2 个要求。

它甚至可以将常规 HTTP 流量从 websocket 流量路由到不同的后端,并执行 websocket 感知健康检查(仅限设置阶段)。

下图显示了事情是如何发生的以及每个阶段涉及的 HAProxy 超时:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJed430d-1676608226736)(Websockets Load Balancing with HAProxy.assets/image-20230216112222291.png)]

在设置阶段,HAProxy可以工作在HTTP模式,处理七层信息。 它会自动检测 Connection:Upgrade 交换,并准备在升级协商成功时切换到隧道模式。 在此阶段,涉及 3 个超时:

  1. timeout client: 客户端不活动
  2. timeout connect: 允许的 TCP 连接建立时间
  3. timeout server: 允许服务器处理请求的时间

如果一切顺利,websocket 已建立,然后 HAProxy 故障转移到隧道模式,不再分析任何数据(无论如何,websocket 不使用 HTTP)。 这里涉及一个超时:

  1. timeout tunnel: 优先于客户端和服务器超时
  2. timeout connect 未使用,因为 TCP 连接已经建立

    使用 HAProxy 作为 Websockets 负载平衡相关推荐

    1. HAProxy的Websocket负载平衡

      为什么是 Websocket? HTTP 协议是无连接的,只有客户端可以从服务器请求信息.在任何情况下,服务器都可以联系客户端.HTTP 是纯半双工的.此外,服务器只能响应客户端请求一次. 某些网站或 ...

    2. nginx配置 负载均衡_如何配置NGINX负载平衡

      nginx配置 负载均衡 The load balancing is the process of distributing traffic to multiple instances of an a ...

    3. haproxy1.7 mysql_Haproxy mysql故障转移负载平衡

      我已经设置了 mysql master-master复制,现在我正在尝试使用Haproxy来平衡mysql服务器. >负载均衡器:192.168.1.5 > mysql1:192.168. ...

    4. HAproxy+Nginx7层负载均衡

      一.关于4/7层负载平衡 1.1 4层负载均衡 将网络流量负载,平衡到多个服务器的最简单方法,是使用第4层(传输层)负载平衡.以这种方式进行负载均衡将根据IP范围和端口转发用户流量(即,如果请求进入h ...

    5. HAProxy高可用负载均衡代理服务

      官网地址:https://www.haproxy.org/ 目录 最新版本 描述 主要特点 支持平台 性能 可靠性- 自2002年以来就使高流量网站保持在线 安全- 在13年内甚至没有一次入侵 下载 ...

    6. windows网络负载平衡

      网络负载平衡的优点 1.网络负载平衡允许你将传入的请求传播到多台服务器上,即可以使用多台服务器共同分担对外的网络请求服务.网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应. 2.网络负 ...

    7. [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上)

      [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上) Aidan Carson · 2016-07-22 11:38 原文:NGINX and ZooKeeper, Dynamic Lo ...

    8. 洛谷P4016 负载平衡问题

      洛谷P4016 负载平衡问题 题目大意: G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只 能在相邻的仓库之间 ...

    9. (译)如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)...

      我一哥们考虑把他的一些基于linux的网站移到Azure上.如果你现在的网站是node.js, ASP,ASP.NET,或PHP做的,使用Azure web站点是最容易的.我会在这篇文章里向你展示如何 ...

    最新文章

    1. 树组件说明书java_java树组件
    2. 一分钟先生之拨云见日看绩效
    3. 【HeadFirst 设计模式学习笔记】6 命令模式
    4. 在批处理中运行.sql文件
    5. python属性错误怎么改_属性错误:无法设置属性
    6. bzoj2957:楼房重建
    7. Android之部分手机(oppo r9s)安装app出现崩溃问题解决办法
    8. C++ class实现邻接矩阵存储的图(完整代码)
    9. my-innodb-heavy-4G.cnf 配置文件参数介绍
    10. C - How Many Tables - HDU-1213
    11. python+opencv打开摄像头、拍摄指定次数的照片_python+openCV调用摄像头拍摄和处理图片的实现...
    12. Basler和Matrox的配置及调试
    13. VSTO 3.0 for Office 2007 Programming
    14. python数据读写 panda(to_csv和read_csv)【读取dat文件】【写入dat文件】【非csv文件并且有多列数据时】
    15. asp.net 下利用DirectoryEntry验证用户及获取域控制器下的用户结构信息
    16. Simulator installs an app drag-and-drop onto the Simulator window
    17. 小布老师oracle视频音乐,小布老师oracle视频讲座笔记(二)
    18. FCPX插件:镜头光晕眩光特效插件PHYX Flarelight
    19. 《响应式Web设计实践》一2.2 字体大小
    20. JavaEE初学之jsp+JavaBean实现页面简单计算器

    热门文章

    1. 28个精品Python爬虫实战项目
    2. python实验指导书答案_《python编程基础》实验指导书.doc
    3. win10下PS(Photoshop)磁性套索工具del键删除不了节点如何解决
    4. FPGA实现计时器功能(黑金开发平台)
    5. 入门 labelImg 数据标注
    6. spring中使用ftp连接池(ftpClientPool)
    7. 利用check酱监控网页并生成rss
    8. CI框架浅析(全篇)
    9. Bresenham’s algorithm( 布兰森汉姆算法)画直线
    10. 国外Assignment写作怎么考虑相关要点?