基于SpringBoot+Vue3的实时通信解决方案
graph TD
A[消息必达] --> B(WebSocket+ACK确认)
A --> C(离线消息队列)
D[语音消息] --> E(Web Audio API)
D --> F(Opus编码压缩)
G[消息撤回] --> H(Redis过期控制)
G --> I(双端状态同步)
Loading
组件
选型
作用
核心框架
Spring Boot 3.1
服务端基础架构
通信协议
WebSocket
实时双向通信
消息队列
RabbitMQ
削峰填谷/离线消息
数据存储
MySQL+Redis
结构化存储/实时状态
语音处理
FFmpeg
音频转码处理
安全认证
JWT
用户身份验证
模块
技术方案
亮点
核心框架
Vue3+TypeScript
响应式开发
状态管理
Pinia
跨组件状态共享
UI框架
Element Plus
现代化交互组件
语音录制
Recorder.js
浏览器音频采集
实时通信
Socket.IO
事件驱动消息传递
数据持久化
IndexedDB
本地聊天记录缓存
sequenceDiagram
participant ClientA
participant Server
participant ClientB
ClientA->>Server: 发送消息(带唯一ID)
Server-->>ClientA: 返回ACK确认
Server->>ClientB: 推送消息
ClientB-->>Server: 返回接收ACK
Server->>ClientA: 送达状态更新
alt 消息未确认
Server->>Server: 进入重试队列(3次)
end
Loading
前端采集音频(WebRTC API)
Opus编码压缩(50%体积优化)
分块上传(断点续传支持)
服务端转码存储(HLS格式)
CDN加速分发
// 消息撤回逻辑示例
public Message recallMessage (String messageId , User operator ) {
Message msg = messageRepo .findById (messageId );
if (msg .getSender ().equals (operator ) &&
Duration .between (msg .getSendTime (), Instant .now ()).toMinutes () <= 2 ) {
msg .setStatus (MessageStatus .RECALLED );
// 发布撤回事件
eventPublisher .publishRecallEvent (msg );
return messageRepo .save (msg );
}
throw new BusinessException ("撤回条件不满足" );
}
# 使用Docker Compose部署
version: ' 3'
services:
redis:
image: redis:alpine
ports:
- " 6379:6379"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: securepass
app:
build: .
ports:
- " 8080:8080"
depends_on:
- redis
- mysql
---
> 📌 项目地址:https://github.com/poboll/echo-room-backend
> 📧 联系作者:caiths@icloud.com
> 📄 详细文档:[架构设计文档](./docs/ARCHITECTURE.md)
双ACK确认机制 - 发送端与服务端、服务端与接收端双重确认
音频优化处理 - Opus编码+分片上传节省60%带宽消耗
撤回事件驱动 - 通过消息队列广播撤回指令
混合存储策略 - Redis处理在线状态,MySQL持久化消息
本地缓存兜底 - IndexedDB保障弱网环境下基础体验
增加消息加密通道(TLS1.3+自定义加密)
实现分布式会话管理(Consul服务发现)
引入Sentinel进行流量控制
添加消息已读状态跟踪
开发移动端适配PWA版本