云函数websocket应用案例

2021-01-04 21:28:50 浏览数 (1)

背景

  在web开发当中,有两种场景需要前端和后端频繁交互,一种是后端数据变动频繁,需要实时通知前端,一种是多客户端需要实时交互,为了解决这两个问题,许多web开发者通过使用ajax实现长轮询来实现和后端的交互,这种方案的缺点是数据实时性不是很高,不断建立tcp链接性能损耗不可忽视。对于这种实时性要求高,数据变动频繁的需求,其实使用websocket的方案更加合适,websocket是一种实现全双工的一种非常好的方案。serverless虽然是无状态的,但是可以结合api网关的能力,实现websocket。

方案设计

整体架构图如下:

image.pngimage.png

实现步骤:

  • 登录云数据库 TencentDB 控制台,创建mysql,并初始化db,创建数据表,用于记录连接上来的客户
代码语言:txt复制
//替换为websocket连接地址
        let conn = new WebSocket("ws://service-xxx-xxx.sh.apigw.tencentcs.com/release/websocket");
        conn.onclose = function (evt) {
            var item = document.createElement("div");
            item.innerHTML = "<b>Connection closed.</b>";
            appendLog(item);
        };
        conn.onmessage = function (evt) {
			var item = document.createElement("div");
			item.innerText = "接收↓:";
			appendLog(item);
            var messages = evt.data.split('n');
            for (var i = 0; i < messages.length; i  ) {
                var item = document.createElement("div");
                item.innerText = messages[i];
                appendLog(item);
            }

        conn.send(msg.value);

登录云函数控制台,进入【函数服务】页面。创建Websocket注册函数,当用户连接api网关的时候,该注册函数就会把用户的连接信息记录到db,用于后续有消息推动登录云函数控制台,进入【函数服务】页面。创建Websocket传输函数。云函数收到消息后,会通过传输函数发送消息给其他客户端登录云函数控制台,进入【函数服务】页面。创建Websocket清理函数。当用户断开与api网关长连接的时候,该函数就清理db中的连接信息。配置API网关使用客户端接入,客户端可以是个网页,也可以是程序代码。 例如js客户端接入:

代码语言:txt复制
java客户端接入: URI uri = URI.create("ws://xxx.apigw.tencentcs.com/release/websocket");
MyWebSocketClient myClient = new MyWebSocketClient(uri);
// 往websocket服务端发送数据
try {
    myClient.connectBlocking(); //阻塞等待访问
} catch (InterruptedException e) {
    e.printStackTrace();
}
if (myClient.isOpen()) {
    myClient.send("发的ssss".getBytes());
} else {
    System.out.println("close");
}

0 人点赞