心跳检测
心跳检测功能用于监控连接状态,当连接超时自动断开并清理资源。
启用心跳检测
typescript
import { AutoStore } from 'autostore'
import { AutoStoreBroadcastSyncer, WorkerTransport } from '@autostorejs/syncer'
// 在广播器中启用心跳检测
const broadcaster = new AutoStoreBroadcastSyncer(store, {
heartbeat: 3000 // 3秒心跳间隔
})
// 添加传输器
const transport = new WorkerTransport({
worker: port,
autoConnect: true
})
// 广播器会自动为每个传输器启用心跳检测
broadcaster.addTransport(transport)在传输器中直接使用
typescript
import { WorkerTransport } from '@autostorejs/syncer'
const transport = new WorkerTransport({
worker: worker,
heartbeat: 5000 // 5秒心跳间隔
})
await transport.connect()
// 当心跳超时时,会触发 timeout 事件
transport.on('timeout', () => {
console.log('连接超时,已自动断开')
})心跳机制
心跳检测通过以下方式工作:
- 定时发送 ping:每个心跳间隔发送一个
$ping消息 - 等待 pong 响应:收到
$ping后,对端会立即回复$pong - 超时检测:如果在规定时间内没有收到
$pong,则认为连接超时 - 自动断开:超时后自动断开连接并触发
timeout事件
typescript
// 内部实现原理
transport.on('connect', () => {
// 启动定时器,定期发送 ping
setInterval(() => {
transport.send({ type: '$ping', value: Date.now() })
}, heartbeatInterval)
})
transport.onReceive((operate) => {
if (operate.type === '$ping') {
// 收到 ping,立即回复 pong
transport.send({ type: '$pong', value: operate.value })
} else if (operate.type === '$pong') {
// 收到 pong,更新最后活跃时间
lastActiveTime = Date.now()
}
})loading
演示完整呈现心跳生命周期:点击「建立连接」后可看到每秒一次的 $ping/$pong 往返流水;点击「模拟对端失联」后对端停止应答,连续多次未收到 $pong 即触发 timeout 事件,传输器自动断开(状态指示灯变红)。
配置选项
typescript
interface AutoStoreSyncTransportOptions {
/**
* 心跳间隔(毫秒)
* 默认:3000(3秒)
* 设置为 0 或不设置则禁用心跳检测
*/
heartbeat?: number
}事件监听
typescript
transport.on('timeout', () => {
console.log('连接超时')
})
transport.on('disconnect', () => {
console.log('连接已断开')
})
transport.on('error', (error) => {
console.error('连接错误:', error)
})在 AutoStoreBroadcastSyncer 中使用
广播器会自动管理所有连接的传输器的心跳:
typescript
const broadcaster = new AutoStoreBroadcastSyncer(store, {
heartbeat: 3000 // 为所有传输器设置心跳
})
broadcaster.on('timeout', (transportId) => {
console.log(`客户端 ${transportId} 心跳超时,已移除`)
})注意事项
- 网络延迟:心跳间隔应大于网络延迟和响应时间
- 性能影响:过短的心跳间隔会增加网络流量
- 合理设置:根据应用场景设置合适的心跳间隔
心跳间隔建议
| 应用场景 | 建议心跳间隔 |
|---|---|
| 局域网 | 3000-5000ms |
| 互联网应用 | 10000-30000ms |
| 移动网络 | 30000-60000ms |
| 实时应用 | 1000-3000ms |
完整示例
typescript
import { AutoStore } from 'autostore'
import { AutoStoreBroadcastSyncer, WorkerTransport } from '@autostorejs/syncer'
// 创建主 store
const store = new AutoStore({
count: 0,
clients: []
})
// 创建广播器,启用心跳检测
const broadcaster = new AutoStoreBroadcastSyncer(store, {
autostart: true,
heartbeat: 3000 // 3秒心跳检测
})
// 监听客户端超时
broadcaster.on('timeout', (transport) => {
console.log(`客户端 ${transport.id} 超时断开`)
})
// 监听连接事件
self.addEventListener('connect', (event) => {
const port = event.ports[0]
port.start()
const transport = new WorkerTransport({
worker: port,
autoConnect: true
})
broadcaster.addTransport(transport)
console.log(`客户端 ${transport.id} 已连接`)
})