TRPC 中的订阅与 WebSocket 实现详解
前言
在现代 Web 应用中,实时数据推送已成为提升用户体验的关键功能。TRPC 作为一个强大的类型安全 RPC 框架,提供了完善的订阅机制和 WebSocket 支持,让开发者能够轻松实现实时数据交互功能。本文将深入探讨 TRPC 中订阅功能的实现原理和使用方法。
订阅功能基础实现
服务端订阅过程
在 TRPC 服务端实现订阅功能主要分为以下几个步骤:
- 创建事件发射器:可以使用 Node.js 内置的 EventEmitter 或 Redis 等外部服务
- 定义订阅过程:在路由中创建 subscription 类型的端点
- 实现数据推送:通过事件发射器触发数据更新
import { EventEmitter } from 'events';
import * as trpc from '@trpc/server';
const ee = new EventEmitter();
export const appRouter = trpc
.router()
.subscription('onAdd', {
resolve({ ctx }) {
return new trpc.Subscription<Post>((emit) => {
const onAdd = (data: Post) => {
emit.data(data); // 向客户端推送数据
};
ee.on('add', onAdd);
return () => {
ee.off('add', onAdd); // 清理函数
};
});
},
});
客户端订阅实现
客户端实现订阅需要以下步骤:
- 创建 WebSocket 客户端连接
- 配置 TRPC 客户端使用 WebSocket 传输
- 调用订阅端点并处理返回数据
import { createWSClient, wsLink } from '@trpc/client/links/wsLink';
const wsClient = createWSClient({
url: `ws://localhost:3001`,
});
const client = createTRPCClient<AppRouter>({
links: [
wsLink({
client: wsClient,
}),
],
});
WebSocket 服务器配置
TRPC 提供了专门的 WebSocket 服务器适配器,简化了 WebSocket 服务的创建和管理:
import { applyWSSHandler } from '@trpc/server/adapters/ws';
import ws from 'ws';
const wss = new ws.Server({ port: 3001 });
const handler = applyWSSHandler({
wss,
router: appRouter,
createContext
});
// 连接管理
wss.on('connection', (ws) => {
console.log(`新连接 (${wss.clients.size})`);
ws.once('close', () => {
console.log(`连接关闭 (${wss.clients.size})`);
});
});
订阅生命周期管理
TRPC 订阅功能提供了完整的生命周期管理:
- 订阅开始:客户端发起订阅请求
- 数据推送:服务端通过 emit.data() 推送数据
- 订阅停止:客户端断开连接或主动取消订阅
- 资源清理:执行返回的清理函数
RPC 协议规范
TRPC 的 WebSocket 通信遵循 JSON-RPC 2.0 规范,并扩展了订阅相关操作:
查询/变更请求格式
{
id: number | string;
jsonrpc?: '2.0';
method: 'query' | 'mutation';
params: {
path: string;
input?: unknown; // 过程输入参数
};
}
订阅操作格式
开始订阅:
{
id: number | string;
method: 'subscription';
params: {
path: string;
input?: unknown;
};
}
停止订阅:
{
id: number | string; // 订阅ID
method: 'subscription.stop';
}
错误处理机制
TRPC 遵循 JSON-RPC 的错误规范,提供了详细的错误信息:
- 错误代码
- 错误消息
- 可选错误数据
- 堆栈跟踪(开发环境)
最佳实践建议
- 生产环境:考虑使用 Redis 等外部服务替代 EventEmitter,以支持多实例部署
- 连接管理:实现心跳机制保持连接活跃
- 错误恢复:客户端应实现自动重连逻辑
- 性能优化:对大量订阅考虑使用批处理或节流
结语
TRPC 的订阅功能为开发者提供了一种类型安全、高效的实时数据交互方案。通过本文的介绍,相信您已经掌握了在 TRPC 中实现实时功能的核心要点。在实际项目中,可以根据具体需求灵活运用这些技术,构建出响应迅速、用户体验优秀的应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考