单独对websocket抽象封装,支撑了公司不同业务的消息即时通讯!

一、背景

公司之前很多涉及到后端需要主动与前端web交互的业务,代码耦合严重,新的业务场景需要即时通信的得重新接入websocket,花费很多时间和精力,因此需要将websocket(缩写为:ws)抽象为公司内部的通讯服务,可以解决业务不同需求,比如:

  1. 业务采用了轮询方式来获取服务器异步请求的结果(支付回调订单、业务订单)。
  2. 系统中有部分业务使用了即时推送功能(反扫二维码定时刷新、充电端口加载刷新)。
  3. 提高系统的响应速率,同步调用重构为异步调用方式,调用结果以websocket方式推送给前端,降低接口延迟性。
  4. 考虑未来有新的业务需要使用websocket即时通讯支撑。

二、重构目标

  • 规范ws通讯工程项目结构和写法。
  • 剔除业务代码,提高接入效率。
  • 使用推送代替不合理的接口轮询。
  • 支撑原有同步调用优化为异步调用,接口响应结果通过ws推送给前端,提高系统的整体响应效率。
  • 使用MQ代替Redis发布订阅和微服务调用

核心设计

项目结构

三、业务流程

3.1 应用关系图

消息推送(Fanout)

消息接收处理(Topic)

3.2 业务时序图

从上到下依次为:

  1. websocket客户端注册,连接流程
  2. 推送消息到服务端流程
  3. 推送消息到客户端流程

四、消息分类

5.1 客户端→服务端

描述

应用场景为客户端主动向服务端推送消息,在服务端执行相应的业务流程。

现有系统中有此应用场景的业务是:反扫二维码请求开始刷新,用户要请求开始刷新启动二维码

5.2 服务端→客户端

描述

应用场景为服务端触发了某个事件,需要推送相应结果到某个客户端。

现有系统中有此应用场景的业务是:支付完成后,等待第三方服务器回调,回调成功结果推送

5.3 客户端 →客户端

描述

应用场景为客户端需要向另一客户端推送消息。

现有系统中有此应用场景的业务是:C端用户发送接口请求,推送响应结果到用户H5页面中

五、Websocket API设计

5.1 请求websocket连接token

请求方式:GET

统一请求接口url:域名/xxx/websocket/token

json 复制代码
{
  "result": 0,
  "description": "无",
  "data":"wss://dws.test.com:8086/socket/asrwqgvsd" //连接url
}

5.2 使用返回的url连接websocket

连接方式: wss

连接url: wss://dws.test.com:8086/socket/{token}

六、统一消息体

json 复制代码
{
  "sendType": "",
  "messageType": "消息类型",
  "businessType": "",
  "fromUniqueId": "发送端唯一id",
  "toUniqueId": "接收端唯一id",
  "fromClientType": "发送端类型",
  "toClientType": "接收端类型",
  "timestamp": 0,
  "content": "业务数据",
  "tags": [
    "标签集"
  ],
  "businesses": [
    "业务集"
  ]
}

七、统一调用方式

7.1 Websocket API聚合封装

7.2 业务统一调用

总结

本文主要记录我基于对websocket做的抽象统一封装的整体设计思想,从项目代码设计上采用了DDD的思想建模,降低了代码的耦合程度,不同业务在需要使用ws即时通讯可以做到"即引即用"的效果,不再需要考虑websocket接入底层的配置和逻辑。好了,今天的分享就到此结束了,如果文章对你有所帮助,欢迎 点赞👍+评论💬+收藏❤,我是:austin流川枫,我们下期见~

相关推荐
花间相见22 分钟前
【计算基础|MySQL18】Buffer Pool 与内存管理
后端·sql·mysql
花间相见2 小时前
【计算基础|Redis01】【上手】安装连接、配置与通用命令
数据库·后端·面试
我命由我123452 小时前
6-3.Python 异常处理 - 异常处理进阶(else 块与 finally 块、异常传递、自定义异常)
开发语言·前端·数据库·后端·python·学习·java-ee
深入云栈2 小时前
Netty 4.2.x 源码深度解析 (二十一):Pipeline 事件传播 —— Inbound 与 Outbound 的双向流转
java·后端·架构
卷无止境2 小时前
长篇写作 Skill 横向盘点:从单文件指令到多智能体流水线
后端·python
斯维赤2 小时前
微信步数的10点定时推送,看似简单,实则暗藏玄机
java·后端
RobinDevNotes2 小时前
crontab 管不住时,该上 Airflow 了
后端
系统集成-鹰翔2 小时前
ERP接口月度统计少了零单月份:SQLite分组与最近三个月均值排查
javascript·数据库·经验分享·后端
我的xiaodoujiao3 小时前
Django 权限系统项目实战详细图文教程 3--系统登录功能实现
后端·python·django
SimonKing3 小时前
号外号外,Stream-Nexus推送项目支持集群部署了
java·后端·程序员