跳转到内容
这是一个实验性功能,API 可能会频繁更改。

自动重连

WebSocket 等实时通信中发生连接中断时,此功能会自动尝试重新连接。它基于一定的逻辑进行重新连接,并发出成功和失败事件。

autoReconnect 函数创建一个 AutoReconnect 类实例,以便使用重新连接功能。

导入

import { autoReconnect } from "@tai-kun/surrealdb";

语法

function autoReconnect(
db: Client,
options?: AutoReconnectOptions
): AutoReconnect;

参数

db

Surreal 类的实例对象。

options

指定重新连接设置的选项。可以指定重新连接间隔、最大延迟时间和重新连接条件等。如果使用默认设置,则可以省略。

backoffLimit?: number
指定尝试重新连接的最大次数。默认值为 Infinity
initialDelay?: number
尝试第一次重新连接之前的延迟时间(毫秒)。默认值为 500
maxDelay?: number
重新连接延迟时间(毫秒)的最大值。随着指数退避的进行,延迟会增加,但此值是上限。默认值为 30_000(30 秒)。
shouldReconnect?: { ping?: { threshold: number; perMillis: number }} | (error) => boolean
指定执行重新连接的条件。如果指定为函数,则根据错误事件的参数判断是否执行重新连接。

返回值

返回 AutoReconnect 类的实例。此实例可用于控制重新连接、获取状态和监视事件。

.getReconnectionInfo(): ReconnectionInfo
获取当前的重新连接信息(.state.phase)。它们分别表示:
.state:
  • "waiting" … 初始状态。尚未进行任何重新连接尝试。
  • "running" … 正在重新连接。
  • "success" … 重新连接成功。
  • "failure" … 重新连接失败。
.phase:
  • "waiting" … 初始状态,尚未进行任何重新连接尝试。
  • "pending" … 重新连接已请求,正在等待一段时间后执行。
  • "closing" … 正在断开连接。
  • "connecting" … 正在连接中;即使断开连接失败,也会尝试连接。
  • "succeeded" … 重新连接成功。
  • "failed" … 重新连接失败。
statephase
"waiting""waiting"|"pending"
"running""closing"|"connecting"
"success""pending"|"succeeded"
"failure""pending"|"failed"
.enable(): void
启用重新连接功能。调用此方法后,将执行重新连接。默认情况下已启用。
.disable(): void
禁用重新连接功能。调用此方法后,将禁用重新连接。
.reset(): void
重置重新连接计数器。这将初始化重新连接的指数退避逻辑。
.enabled: boolean
指示重新连接功能是否启用的布尔值。如果为 true,则重新连接已启用。

例子

import { autoReconnect, Surreal } from "@tai-kun/surrealdb";
const db = new Surreal();
const ar = autoReconnect(db, {
initialDelay: 1000,
maxDelay: 30000,
backoffLimit: 5,
shouldReconnect: {
ping: {
perMillis: 60000, // 1 分钟内,
threshold: 3, // 3 次以上 ping 失败后,重新连接。
},
},
});
ar.on("pending", (endpoint, duration) => {
console.log(`${duration / 1000} 秒后将重新连接到 ${endpoint}...`);
});
ar.on("success", (endpoint) => {
console.log(`已成功重新连接到 ${endpoint} 🎉`);
});
ar.on("failure", (endpoint, cause) => {
console.error(`重新连接到 ${endpoint} 失败了 🤯`);
console.error("原因:", cause);
});
try {
await db.connect("ws://127.0.0.1:8000");
// 长时间运行的各种处理
} finally {
await db.close();
}

注意

  • 重新连接逻辑对于调整 WebSocket 连接的稳定性和连接恢复频率非常重要。应根据系统需求和用例调整选项设置。
  • autoReconnect 尝试恢复连接丢失,但不能保证在所有情况下都能完全恢复。