跳转到内容
这是一项实验性功能,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" … 已请求重连,正在等待一段时间后执行。
  • "disconnecting" … 正在断开连接。
  • "connecting" … 正在连接。即使断开连接失败,也会尝试连接。
  • "succeeded" … 重连成功。
  • "failed" … 重连失败。
statephase
"waiting""waiting"|"pending"
"running""disconnecting"|"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.disconnect();
}

注意

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