websocket需配合自定义pub/sub模块实现消息分发,通过单例事件中心管理channel订阅与路由,支持通配符匹配、生命周期自动绑定、连接状态透出及断线重连策略。

WebSocket 本身不提供发布订阅(Pub/Sub)能力,但可以作为底层通信通道,配合自定义的 Pub/Sub 模块实现多通道、解耦的消息分发。关键在于把 WebSocket 连接封装为“消息总线”的输入源,再用一个轻量级的事件中心管理多个主题(channel)的订阅与派发。
用单例事件中心统一管理订阅关系
避免每个业务模块直接操作 WebSocket 实例,而是通过一个全局事件中心注册 channel 和回调。这个中心负责:缓存订阅者、按 channel 分组、接收原始消息后路由到对应 listeners。
- 使用 Map 或 plain object 存储 channel → [callback1, callback2] 映射
- 支持通配符订阅(如
"user.*")可借助 micromatch 或简易 glob 匹配逻辑 - 提供
subscribe(channel, cb)、unsubscribe(channel, cb)、publish(channel, data)接口(注意:publish 是内部调用,不对外暴露)
WebSocket 收到消息后按规则解析并分发
服务端推送的消息通常带 channel 字段或固定结构(如 { type: 'chat', payload: {...} })。前端需在 onmessage 中解析,提取 channel 并触发对应事件。
- 推荐约定服务端消息格式:
{ channel: 'order.update', data: { id: 123, status: 'shipped' } } - 收到消息后,先校验
channel是否存在订阅者,再遍历执行回调,传入data - 可加一层中间件支持消息过滤、日志、错误捕获(例如对特定 channel 做防抖或节流)
支持动态 channel 订阅/退订,避免内存泄漏
页面组件挂载时订阅,卸载时必须退订。建议封装 Hook(React)或指令(Vue),自动绑定生命周期。
- React 示例:
useChannel('notification', handler)内部调用subscribe,并在 useEffect cleanup 中unsubscribe - 退订时严格比对函数引用(不能传匿名函数),或用 Symbol 作唯一标识辅助管理
- 可加弱引用 Map 缓存订阅者,配合 GC 友好清理(非必需,但大型应用建议)
连接状态与重连策略需透出给上层感知
Pub/Sub 不应屏蔽连接异常。事件中心应暴露 onOpen、onError、onClose 等钩子,并允许业务监听连接状态变化。
- 断线重连期间新订阅暂存,恢复后补发最近 N 条历史消息(需服务端支持)
- 对 critical channel(如支付结果)可设优先级重试,普通 channel 可降级为轮询 fallback
- 提供
isConnected()方法供组件判断是否可安全发送订阅请求
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











