ELB使用WebSocket协议实现聊天信息实时交互
WebSocket协议是一种在单个TCP连接上进行全双工通信的网络协议。WebSocket协议通信下,服务器可以主动向客户端发送数据,使得客户端和服务器之间的连接更持久,数据交换更简单,通信过程更高效。应用型ELB默认支持WebSocket协议,可以帮助您对需要实时通信的业务进行负载。
Websocket协议概述
- 什么是Websocket协议
当前Web应用场景日渐丰富多样,对通信技术的要求也更高。例如实时社交、协同办公、在线客服通知等功能要求服务器能够实时推送数据。采用轮询技术的传统方案,即客户端在固定时间间隔内向服务器发送请求以获取最新数据,在以上场景存在明显缺陷。如果客户端需要频繁发送请求,而HTTP头字段信息冗长,会导致有效数据信息占比低、带宽资源浪费并增加服务器的压力。
为了适应以上业务场景需求,HTML5引入支持了WebSocket协议。在全双工通信下,服务器和客户端能同时收发数据,服务器可以主动推送新数据,减少客户端的询问请求。这种双向通信机制有效减少通信冗余,提升了实时业务体验,还可以帮助您节省服务器资源和带宽资源。
更多关于WebSocket协议的详细信息,您参考官方文档The WebSocket Protocol。
ELB的HTTP/HTTPS监听默认支持WebSocket协议。
- Websocket协议适用场景
Websocket协议的核心优势为全双工实时通信,广泛应用于需要高频交互和低延迟的业务场景。
- 实时社交与互动:在线聊天室、直播弹幕、多人在线棋牌类游戏等需要不同玩家的状态同步。
- 协同办公与在线教育:多人文档在线编辑、在线课堂互动等需要结果共享。
- 地图导航:交通导航中乘客位置变化和主动推送拥堵情况。
- 客服与通知:用户与客服之间即时信息互通。
实践方案架构

本实践方案提供一个简易的聊天信息实时交互示例如下:客户端向服务器端发送请求,服务器端进行响应,客户端接收响应后发送新的请求,服务器端再次响应的实时交互。
准备工作
- 创建独享型ELB实例,并选择了应用型规格实例,且ELB已绑定EIP。具体操作,请参见购买独享型负载均衡器和绑定IPv4公网IP。
- 创建两台ECS,ECS与已创建的ELB实例属于同一个VPC,更多详细设置请参考快速创建ECS,本实践方案以ECS安装CentOS系统为例。第一台ECS_client用作客户端发送HTTP请求,第二台ECS_server用作部署WebSocket应用的后端服务器。
步骤一:在后端服务器中部署WebSocket应用
- 远程登录后端服务器ECS_server。
弹性云服务器有多种登录方法,具体请参见登录弹性云服务器。
- 执行以下命令确保服务器端的python版本不低于python 3.7。
yum install python39
- websockets 库提供了简洁的 API,使得在 Python 中建立 WebSocket 连接变得容易,执行以下命令安装最新版websockets库。
- 安装Python包管理工具pip。
sudo yum install python3-pip
- 安装WebSocket
pip install websockets
- 安装Python包管理工具pip。
- 在后端服务器中,新建目录websocket。
mkdir websocket
- 在websocket目录下,新建一个websocket_server.py文件,并且在其中部署测试websocket应用服务。
- 新建websocket_server.py文件。
vi websocket_server.py
- 按i键进入编辑模式。
- 新建websocket_server.py文件。
- 按Esc键,输入:wq保存websocket_server.py文件。
- 运行websocket_server.py文件。
python3 websocket_server.py
- 收到如图2的回显,表示WebSocket应用部署成功。
步骤二:在客户端中部署WebSocket应用
- 远程登录客户端ECS_client。
弹性云服务器有多种登录方法,具体请参见登录弹性云服务器。
- 执行以下命令确保客户端的python版本不低于python 3.7。
yum install python39
- 执行以下命令在客户端中安装最新版websockets库。
- 安装Python包管理工具pip。
sudo yum install python3-pip
- 安装WebSocket
pip install websockets
- 安装Python包管理工具pip。
- 在客户端服务器中,新建目录websocket_client。
mkdir websocket_client
- 在websocket目录下,新建一个websocket_client.py文件,并且在其中部署websocket应用服务。
- 新建websocket_client.py文件。
vi websocket_client.py
- 按i键进入编辑模式。
- 新建websocket_client.py文件。
- 按Esc键,输入:wq保存websocket_client.py文件。
步骤三:创建HTTP后端服务器组并添加后端服务器
- 进入后端服务器组列表页面。
- 在后端服务器列表页面,单击页面右上角“创建后端服务器组”按钮。
- 在配置后端分配策略页面,选择将后端服务器组Server_Group关联至已经创建完成的ELB实例,后端协议选择“HTTP”。
- 其余设置保持默认,单击“下一步”。
- 在添加后端服务器页面,云服务器页签下,单击“添加云服务器”。
- 在添加后端服务器侧拉窗中,选择ECS_server,并设置业务端口为8081。
- 单击“下一步”后确认配置信息。
- 单击“立即创建”。
步骤四:创建HTTP监听器并选择后端服务器组
- 进入弹性负载均衡列表页面。
- 在目标弹性负载均衡实例的操作列,单击“添加监听器”。
- 在添加监听器页面,协议类型选择“HTTP”,端口设置为“8081”。
图3 添加HTTP监听器
- 单击“下一步:配置后端分配策略”,后端服务器组参数选择“使用已有”。选择步骤三创建完成的服务器组Server_Group,完成后单击“下一步:确认配置”。
- 确认配置参数后,单击“提交”,完成HTTP监听器的创建。
步骤五:验证结果
- 远程登录客户端ECS_client。
- 运行代码python websocket_client.py文件。
python3 websocket_client.py
- 看到客户端和后端服务器相继打印“Sent: Hello server, this is client!”和“Received: Hello client, this is server!”,验证了ELB通过WebSocket协议实现了实时聊天。
图4 ELB通过WebSocket协议实现了实时聊天。