「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」
1、问题引入
首先,写这篇文章是因为之前开发的一个需要实时推送消息到web端的功能(PS:需要将交易额实时展示)。这里我们都知道http是无状态协议,后端是无法主动向前端数据的,只能被动等待浏览器的请求,所以就需要前端不断地轮询请求来实现数据的实时展示。刚开始我也是这样实现的:
//页面初始化,轮询后台服务器
$(function () {
ajaxSearch();
});
let ajaxSearch = function () {
Util.ajaxRequest({
url: "getBatchLog.json",
async: false,
afterSuccess: function (json) {
let logArrs = Tools.str2Json(json.returnmsg);
let rowDatas = [];
for (let i = 0; i < logArrs.length; i++) {
let serviceGrid = createServiceGrid(logArrs[i]);
}
//1s轮询一次
window.setTimeout(ajaxSearch, 1000);
return false;
}
}, false);
};
但这样实现并不是最优解,一方面很考验服务器的处理能力,如果每个用户都打开了很多需要轮询的页面,那么并发请求是非常恐怖的。而且JS轮询的效率是很低的。
此时,引入WebSocket就很有必要,那么下面就为大家介绍下WebSocket的应用。
2、WebSocket基本概念
首先,WebSocket是建立在TCP 协议之上的,本质仍然是TCP/IP连接,只不过变成了长连接。可以建立从服务器到客户端的全双工通信,这就表明服务器端是可以主动向客户端推送数据的。其数据格式既可以为文本形式,也可以为二进制形式,支持数据加密。(PS:协议标识为ws,加密的为wss,建立在TLS协议之上。URL形式:ws://127.0.0.1:8080/test)WebSocket是H5中的协议,所以只要支持H5的浏览器都可以使用WebSocket。
在分布式环境下,涉及到多个WebSocket节点时,如果采用了负载均衡,要注意发送消息时,可能有的节点连接的用户收不到。这就需要我们在中间再加一层,负载到的节点将消息发送到MQ,MQ再push给所有的WebSocket节点,然后就可以正常推送给所有用户。
好了、本期就先介绍到这里,有什么需要交流的,大家可以随时私信我。😊