基于Spring Boot和SSE的实时消息推送系统

一、SSE技术深度解析

1.1 协议工作原理

ClientServerGET /stream (Accept: text/event-stream)HTTP/1.1 200 OKContent-Type: text/event-streamdata: 消息1\\n\\ndata: 消息2\\n\\nClientServer

1.2 与WebSocket对比

特性SSEWebSocket
协议HTTPWS/WSS
方向单向(服务端→客户端)双向
重连自动需手动实现
二进制仅文本支持二进制
复杂度中高

二、Spring Boot服务端实现

2.1 增强型SSE控制器

@RestController
@RequestMapping("/api/sse")
public class EnhancedSseController {private final Map<String, SseEmitter> emitters = new ConcurrentHashMap<>();private final ScheduledExecutorService scheduler =Executors.newScheduledThreadPool(4);@GetMapping("/subscribe/{clientId}")public SseEmitter subscribe(@PathVariable String clientId) {SseEmitter emitter = new SseEmitter(30_000L);// 心跳机制ScheduledFuture<?> heartbeat = scheduler.scheduleAtFixedRate(() -> sendHeartbeat(emitter),10, 10, TimeUnit.SECONDS);emitter.onCompletion(() -> {heartbeat.cancel(true);emitters.remove(clientId);});emitter.onTimeout(() -> {heartbeat.cancel(true);emitters.remove(clientId);});emitters.put(clientId, emitter);return emitter;}@PostMapping("/broadcast")public void broadcast(@RequestBody MessageDto message) {emitters.forEach((id, emitter) -> {try {emitter.send(SseEmitter.event().id(UUID.randomUUID().toString()).name("message").data(message).reconnectTime(5000L));} catch (IOException e) {emitter.complete();emitters.remove(id);}});}
}

2.2 消息实体设计

public class MessageDto {private MessageType type;private String from;private String content;private Instant timestamp;public enum MessageType {NOTIFICATION, ALERT, SYSTEM}
}

三、前端高级实现

3.1 带重连机制的EventSource

class ResilientEventSource {constructor(url, options = {}) {this.url = url;this.retryDelay = options.retryDelay || 3000;this.maxRetries = options.maxRetries || 5;this.eventHandlers = {};this.connect();}connect() {this.es = new EventSource(this.url);this.retryCount = 0;this.es.onopen = () => {this.retryCount = 0;this.onOpen?.();};this.es.onerror = () => {this.es.close();if (this.retryCount++ < this.maxRetries) {setTimeout(() => this.connect(), this.retryDelay);} else {this.onError?.();}};Object.entries(this.eventHandlers).forEach(([type, handler]) => {this.es.addEventListener(type, handler);});}addEventListener(type, handler) {this.eventHandlers[type] = handler;if (this.es) this.es.addEventListener(type, handler);}
}

3.2 Vue3集成示例

<template><div class="sse-container"><div v-for="msg in messages" :key="msg.id":class="['message', msg.type]"><span class="timestamp">{{ formatTime(msg.timestamp) }}</span><span class="content">{{ msg.content }}</span></div></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';const messages = ref([]);
let eventSource;onMounted(() => {eventSource = new ResilientEventSource('/api/sse/subscribe/user123', {retryDelay: 5000,maxRetries: Infinity});eventSource.addEventListener('message', (e) => {messages.value.push(JSON.parse(e.data));});
});onUnmounted(() => {eventSource?.close();
});
</script>

四、生产环境最佳实践

4.1 性能优化方案

  1. 连接池管理:限制最大连接数
  2. 消息批处理:合并短时间内的多个事件
  3. 压缩传输:启用gzip压缩
  4. 负载均衡:Nginx配置SSE支持

4.2 Nginx配置示例

server {location /api/sse {proxy_pass <http://backend>;proxy_http_version 1.1;proxy_set_header Connection '';proxy_buffering off;proxy_cache off;proxy_read_timeout 24h;}
}

五、安全增强措施

5.1 认证授权

@GetMapping("/secure-subscribe")
public SseEmitter secureSubscribe(@RequestHeader("Authorization") String token) {if (!jwtUtil.validateToken(token)) {throw new SecurityException("Invalid token");}String userId = jwtUtil.extractUserId(token);return sseService.subscribe(userId);
}

5.2 消息加密

public String encryptMessage(String raw) {return Base64.getEncoder().encodeToString(aesCipher.doFinal(raw.getBytes(StandardCharsets.UTF_8)));
}

六、监控与运维

6.1 关键监控指标

指标采集方式告警阈值
活跃连接数Micrometer>1000
消息延迟Prometheus>1s
错误率ELK>5%

6.2 健康检查端点

@GetMapping("/health")
public Map<String, Object> health() {return Map.of("status", "UP","connections", emitters.size(),"lastMessage", lastMessageTime);
}

七、扩展应用场景

7.1 实时日志监控

@Bean
public ApplicationListener<LoggingEvent> logListener() {return event -> {if (event.getLevel().isGreaterOrEqual(Level.WARN)) {sseService.broadcast(new MessageDto("SYSTEM",event.getLoggerName(),event.getFormattedMessage()));}};
}

7.2 股票行情推送

@Scheduled(fixedRate = 1_000)
public void pushStockQuotes() {stockService.getLatestQuotes().forEach(quote -> {sseService.sendToUser(quote.getUserId(),new MessageDto("STOCK",quote.getSymbol(),quote.getPrice().toString()));});
}

总结

本文实现的SSE实时消息推送系统具有以下优势:

  1. 高效实时:毫秒级消息延迟
  2. 资源友好:单连接持续复用
  3. 弹性可靠:自动重连机制
  4. 易于扩展:支持水平扩展

在实际应用中建议:

  • 根据业务需求选择合适的消息格式(JSON/Protobuf)
  • 实施完善的监控告警
  • 定期进行压力测试
  • 考虑消息持久化方案

通过合理设计和优化,该方案可支持从中小规模到百万级连接的消息推送场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92764.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 40 训练和测试的规范写法

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代…

分析代码并回答问题

代码 <template><div>Counter: {{ counter }}</div><div>Double Counter: {{ doubleCounter }}</div> </template><script setup lang"ts"> import { ref, computed } from "vue";const counter ref(0);const …

在macOS上扫描192.168.1.0/24子网的所有IP地址

在macOS上扫描192.168.1.0/24子网的所有IP地址&#xff0c;可以通过终端命令实现。以下是几种常用方法&#xff1a; 使用ping命令循环扫描 打开终端执行以下脚本&#xff0c;会逐个ping测试192.168.1.1到192.168.1.254的地址&#xff0c;并过滤出有响应的IP&#xff1a; for i …

Java基础05——类型转换(本文为个人学习笔记,内容整理自哔哩哔哩UP主【遇见狂神说】的公开课程。 > 所有知识点归属原作者,仅作非商业用途分享)

Java基础05——类型转换 类型转换 由于Java是强类型语言&#xff0c;所以要进行有些运算的时候&#xff0c;需要用到类型转换。 如&#xff1a;byte(占1个字节)&#xff0c;short(占2个字节)&#xff0c;char(占2个字节)→int(4个字节)→long(占8个字节)→float(占4个字节)→do…

mysql基础(二)五分钟掌握全量与增量备份

全量备份 Linux环境 数据备份 数据库的备份与恢复有多中方法&#xff0c;通过mysql自带的mysqldump工具可对数据库进行备份。语法&#xff1a; mysqldump -u username -p password --databases db_name > file_name .sql说明&#xff1a; -u参数指定用户名&#xff0c;usern…

使用Windbg分析多线程死锁项目实战问题分享

目录 1、问题描述 2、使用.effmach x86命令切换到32位上下文 3、切换到UI线程&#xff0c;发现UI线程死锁了 4、使用!locks命令查看临界区锁的详细信息&#xff0c;遇到了问题 5、使用dt命令查看临界区对象信息&#xff0c;找到发生死锁的多个线程 6、用户态锁与内核态锁…

防火墙组网方式总结

一、部署模式&#xff1a;灵活适配多样网络环境下一代防火墙&#xff08;NGAF&#xff09;具备极强的网络适应能力&#xff0c;支持五种核心部署模式&#xff0c;可根据不同网络需求灵活选择。路由模式&#xff1a;防火墙相当于路由器&#xff0c;位于内外网之间负责路由寻址&a…

AI大模型:(二)5.1 文生视频(Text-to-Video)模型发展史

目录 1.介绍 2.发展历史 2.1.早期探索阶段(2015-2019) 2.1.1.技术萌芽期 2.1.2.RNN/LSTM时代 2.2.技术突破期(2020-2021) 2.2.1 Transformer引入视频生成 2.2.2 扩散模型的兴起 2.3.商业化突破期(2022-2023) 2.3.1 产品化里程碑 2.3.2 竞争格局形成 2.4.革命…

14mm寻北仪能否塞进液压支架生死缝隙?

在煤矿井下世界的方寸之间&#xff0c;液压支架的每个关键节点都承载着千钧重压。顶梁铰接点、立柱顶端、掩护梁角落&#xff0c;恰恰是空间最为局促的“禁区”。ER-MNS-10A MEMS寻北仪应运而生&#xff01;它采用了先进的MEMS陀螺技术&#xff0c;以14mm至薄高度、40g极致轻盈…

python之浅拷贝深拷贝

文章目录潜拷贝(shallow copy)深拷贝(deep copy)总结一下python的浅拷贝和深拷贝.潜拷贝(shallow copy) python中潜拷贝指的是:构造一个新的复合对象&#xff0c;然后将原对象中的对象引用插入其中 平常开发过程中潜拷贝是比深拷贝更常见的场景. 比如编程中使用到的一些基本的…

普通大学本科生如何入门强化学习?

问题:你平时是如何紧跟大型语言模型和智能体技术前沿的&#xff1f;有哪些具体的学习和跟踪方式&#xff1f;回答:我会通过“输入-内化-实践”结合的方式跟踪前沿。首先&#xff0c;学术动态方面&#xff0c;每天花10分钟浏览arXiv的http://cs.CL和http://cs.AI板块&#xff0c…

新手向:Python实现数据可视化图表生成

Python数据可视化入门&#xff1a;从零开始生成图表数据可视化是数据分析过程中不可或缺的关键环节&#xff0c;它通过将抽象的数字信息转化为直观的图形展示&#xff0c;帮助分析师和决策者更快速、更准确地发现数据中隐藏的模式、规律和发展趋势。在当今大数据时代&#xff0…

VBA即用型代码手册:计算选择的单词数Count Words in Selection

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建及…

DNS(域名系统)

分层结构根域名&#xff08;ipv4&#xff0c;13台&#xff09;&#xff0c;二级域名&#xff0c;三级域名……相关记录A将域名解析为ipv4地址AAAA将域名解析为ipv6地址MX指名该区域为邮件服务区PTR反向查询将主机名解析为域名NS记录服务器的名字CNAME别名查询方式递归查询迭代查…

【大模型】强化学习算法总结

角色和术语定义 State&#xff1a;状态Action&#xff1a;动作Policy/actor model&#xff1a;策略模型&#xff0c;用于决策行动的主要模型Critic/value model&#xff1a;价值模型&#xff0c;用于评判某个行动的价值大小Reward model&#xff1a;奖励模型&#xff0c;用于给…

基于梅特卡夫定律的开源链动2+1模式AI智能名片S2B2C商城小程序价值重构研究

摘要&#xff1a;梅特卡夫定律揭示了网络价值与用户数量的平方关系&#xff0c;在互联网经济中&#xff0c;连接的深度与形式正因人的参与发生质变。本文以开源链动21模式、AI智能名片与S2B2C商城小程序的协同应用为研究对象&#xff0c;通过实证分析其在社群团购、下沉市场等场…

Ubuntu22.04安装CH340驱动及串口

一、CH340驱动安装 1.1 查看USB设备能否被识别 CtrlAltT打开终端&#xff1a; lsusb 插入设备前&#xff1a; 插入设备后&#xff1a; 输出中包含ID 1a86:7523 QinHeng Electronics CH340 serial converter的信息&#xff0c;这表明CH340设备已经被系统识别。 1.2 查看USB转串…

CPU缓存(CPU Cache)和TLB(Translation Lookaside Buffer)缓存现代计算机体系结构中用于提高性能的关键技术

CPU缓存&#xff08;CPU Cache&#xff09;和TLB&#xff08;Translation Lookaside Buffer&#xff09;缓存是现代计算机体系结构中用于提高性能的关键技术。它们通过减少CPU访问数据和指令的延迟来提高系统的整体效率。以下是对这两者的详细解释&#xff1a; 1. CPU 缓存 CPU…

唐扬·高并发系统设计40问

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/91644703 00开篇词 _ 为什么你要学习高并发系统设计&#xff1f;.pdf 00开篇词丨为什么你要学习高并发系统设计&#xff1f;.mp3 01 _ 高并发系统&#xff1a;它的通用设计方法是什么&#xff1f;.pdf …

基于Spring Data Elasticsearch的分布式全文检索与集群性能优化实践指南

基于Spring Data Elasticsearch的分布式全文检索与集群性能优化实践指南 技术背景与应用场景 随着大数据时代的到来&#xff0c;海量信息的存储与检索成为各类应用的核心需求。Elasticsearch 作为一款分布式搜索引擎&#xff0c;凭借其高可扩展、高可用和实时检索的优势&#x…