使用 HAProxy 作为 Websockets 负载平衡
为什么需要 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个协议:
- HTTP: 用于websocket设置
- TCP: websocket数据交换
HAProxy必须能够在这两个协议上支持websockets,而不会在任何时候中断TCP连接。
有两件事需要注意:
- 能够在不中断连接的情况下将连接从HTTP切换到TCP
- 同时巧妙地管理两个协议的超时
幸运的是,HAProxy 嵌入了正确负载平衡 websockets 所需的一切,并且可以满足上述 2 个要求。
它甚至可以将常规 HTTP 流量从 websocket 流量路由到不同的后端,并执行 websocket 感知健康检查(仅限设置阶段)。
下图显示了事情是如何发生的以及每个阶段涉及的 HAProxy 超时:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJed430d-1676608226736)(Websockets Load Balancing with HAProxy.assets/image-20230216112222291.png)]
在设置阶段,HAProxy可以工作在HTTP模式,处理七层信息。 它会自动检测 Connection:Upgrade 交换,并准备在升级协商成功时切换到隧道模式。 在此阶段,涉及 3 个超时:
- timeout client: 客户端不活动
- timeout connect: 允许的 TCP 连接建立时间
- timeout server: 允许服务器处理请求的时间
如果一切顺利,websocket 已建立,然后 HAProxy 故障转移到隧道模式,不再分析任何数据(无论如何,websocket 不使用 HTTP)。 这里涉及一个超时:
- timeout tunnel: 优先于客户端和服务器超时
- timeout connect 未使用,因为 TCP 连接已经建立
使用 HAProxy 作为 Websockets 负载平衡相关推荐
- HAProxy的Websocket负载平衡
为什么是 Websocket? HTTP 协议是无连接的,只有客户端可以从服务器请求信息.在任何情况下,服务器都可以联系客户端.HTTP 是纯半双工的.此外,服务器只能响应客户端请求一次. 某些网站或 ...
- nginx配置 负载均衡_如何配置NGINX负载平衡
nginx配置 负载均衡 The load balancing is the process of distributing traffic to multiple instances of an a ...
- haproxy1.7 mysql_Haproxy mysql故障转移负载平衡
我已经设置了 mysql master-master复制,现在我正在尝试使用Haproxy来平衡mysql服务器. >负载均衡器:192.168.1.5 > mysql1:192.168. ...
- HAproxy+Nginx7层负载均衡
一.关于4/7层负载平衡 1.1 4层负载均衡 将网络流量负载,平衡到多个服务器的最简单方法,是使用第4层(传输层)负载平衡.以这种方式进行负载均衡将根据IP范围和端口转发用户流量(即,如果请求进入h ...
- HAProxy高可用负载均衡代理服务
官网地址:https://www.haproxy.org/ 目录 最新版本 描述 主要特点 支持平台 性能 可靠性- 自2002年以来就使高流量网站保持在线 安全- 在13年内甚至没有一次入侵 下载 ...
- windows网络负载平衡
网络负载平衡的优点 1.网络负载平衡允许你将传入的请求传播到多台服务器上,即可以使用多台服务器共同分担对外的网络请求服务.网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应. 2.网络负 ...
- [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上)
[译]NGINX 和 ZooKeeper,动态负载平衡和部署(上) Aidan Carson · 2016-07-22 11:38 原文:NGINX and ZooKeeper, Dynamic Lo ...
- 洛谷P4016 负载平衡问题
洛谷P4016 负载平衡问题 题目大意: G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只 能在相邻的仓库之间 ...
- (译)如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)...
我一哥们考虑把他的一些基于linux的网站移到Azure上.如果你现在的网站是node.js, ASP,ASP.NET,或PHP做的,使用Azure web站点是最容易的.我会在这篇文章里向你展示如何 ...
最新文章
- CSDN湘苗培优,打造高素质技术人才
- R语言sys方法:sys.chmod函数改变指定文件的权限、Sys.Date函数返回系统的当前日期、Sys.time函数返回系统的当前时间
- python编程难吗-都说python很简单 真的很好学么?
- 中国一次性塑料餐具市场运营动态及供需态势分析报告2022年版
- MySQL数据库的总结_MySQL数据库应用总结(三)—MySQL数据库的基本操作
- Linux 如何查看命令所在位置/查看命令文件所在位置
- Linux C 中字符串化操作符#
- ConcurrentHashMap源码剖析(1.8版本)
- 构建嵌入式linux系统_用于构建嵌入式Linux系统的4种工具
- 韩顺平php视频笔记72-74 面向对象编程的三大特征3 重载override与重写overload 魔术常量
- Linux进程里运行新代码,linux调度器源码分析 - 新进程加入(三)
- java连接kvstore_Tendermint ABCI 应用 KVStore 源码详解
- Android自定义View控件
- Python 音频: sounddevice 使用 左声道/右声道/立体声 --- 播放,录音
- BackdoorBench
- 08-新闻发布系统数据库-新闻类别数据操作
- Flutter实战】文本组件及五大案例
- 麒麟 mips mysql_中标麒麟(龙芯CPU)--docker基础镜像制作
- 项目实训(十三)安装pun,pun的基础使用和概念
- 什么是互质数(或互素数) ?
热门文章
- 安卓课设<<云游APP>>
- 用go 语言 实现一个密码生成工具
- 论文中的reference、citation、bibliography、documentation
- 2023Matlab初级教程- 第一章 初识Matlab与界面介绍
- 路由器的恢复出厂设置、修改特权密码、备份配置文件和升级操作系统实际操作...
- 【C语言练习题】数组倒序输出
- 点石互动--石头之用户搜索行为与关键词分析(四):不变应万变
- redis修改端口号和host
- 1130 mysql 服务器_mysql 连接远程连接服务器 1130错误
- 在maven的pom.xml文件中导入tomcat插件后启动tomcat7报错
- HAProxy的Websocket负载平衡