SSE、WebSocket 连接丢 Redis 里?那可踩大坑了!

SSE实时推送实战:从原理到生产环境踩坑全解析 实时推送是构建现代Web应用的核心能力之一。在HTTP协议基础上,SSE(Server-Sent Events)提供了一种轻量级的服务端单向推送方案,对比WebSocket,它无需协议升级,实现简单且天然支持断线重连与事件ID续传。理解事件流格式和HTTP协商机制,是掌握SSE的关键。在实际工程中,连接空闲超时是导致推送中断的常见隐患,通过合理设置心跳机制与代理层参数可有效规避。SSE在行情刷新、日志流、AI问答流式输出等场景中具有广泛应用价值。本文从原理出发,结合服务端与浏览器端实践,深入剖析生产环境中的 阅读详情

01 引言

这两天整理了一个simonking-ws/stream-nexus项目,原本定位就是一个轻量级的应用,不想使用任何第三方的中间件。

介绍项目的相关文档发不出后,有老铁问到能否集群部署。显然目前是不能的满足的。本节就聊聊实现的思路,后面时间允许的话也安排上。

02 实现思路

刚看这位老铁的提问,我本能的反应,这个简单呀,直接把客户端的连接从内存搬到中间件(Redis)里面去就好了。

2.1 简单测试

鉴于开发的习惯,总要先写个Demo测试一下。测试之后才发现根本行不通。

分别使用内存的对象和Redis中的对象发送,结果只收到内存对象的推送:

我们看看Redis中保存的是什么?

image-20260928154610346

Redis对象中只保留了客户端中保留了超时时间,显然是很多参数丢失了。

2.2 原因

应该会有和我一样想法的老铁吧!哈哈哈…

归根结底是因为连接是"活的"对象,Redis 是"死的"键值存储,两者根本不是一回事。连接本质上是"内核态对象",序列化没用。

一条 SSE/WebSocket 连接至少由这些东西组成:

部分归属可序列化吗
TCP Socket fd / 端口号OS 内核❌
TCP 收发缓冲区、滑动窗口状态OS 内核 + 网卡驱动❌
TLS Session、加密密钥、序列号协议栈❌
HTTP/1.1 解析状态、chunked 编码位置Servlet 容器❌
SseEmitter / WebSocketSession 句柄应用容器❌

一个连接从握手成功那一刻起,就和"建立它的那台机器的操作系统、JVM、Servlet 容器、网卡"绑死了。

当把 clientId → 8088机器的连接 这条映射关系序列化到 Redis 里,Redis 存的只是一条字符串,它指向的那根 TCP 还在原机器上。一旦那台机器宕机/重启/扩缩容,Redis 里这条映射就变成"幽灵指针"。

也就是说Redis存的只是"路由表",但真正的连接根本拿不走。

2.3 高可用方案

既然连接是基于内核、容器的,那就只能保存在当前的机器的进程中。高可用方案无非就是通过到各台机器触发自己的客户端推送消息即可。

可以通过Redis或者MQ等其他中间件,作为消息总线。如Redis

 业务系统 ──HTTP POST──▶ /push
                              │
                              ▼
                       推送入口网关 (任一实例)
                              │
                              ▼
                     Redis Pub/Sub (channel: biz:order:paid)
                              │
            ┌─────────────────┼─────────────────┐
            ▼                 ▼                 ▼
        sse/ws-1         sse/ws-2             sse/ws-3
      本地连接表查找       本地连接表查找         本地连接表查找
            │                 │                 │
            ▼                 ▼                 ▼
         客户端A          客户端B           客户端C

关键设计:

  1. 推送入口统一化,业务系统只调一次推送接口
  2. Redis Pub/Sub 的 channel 划分:
    • biz:module:{bizModule} —— 按业务模块广播
    • biz:client:{clientId} —— 定向推送
    • 推送时同时发到两类 channel,各实例根据本地订阅关系决定是否落地。
  3. 本地查找:每台实例订阅全量 channel,收到消息后只在自己的连接表里命中目标

03 单体与集群

程序代码的高可用深入人心,面试更是逃不掉的八股文。很多人都觉得集群就是比单体的项目牛逼,的确是的,集群就是牛逼。

但是,这个要看真实的业务场景。比如天猫、京东这类大厂,单体项目自然无法支撑,集群是必然选择,大厂里面有无数牛逼的大佬专门通过中间件维护者集群的高可用。

而作为一般公司,业务量没有那么大时,单体项目也可以支撑。但是项目没有复杂的中间件,维护成本很低。如果硬要上集群,当然也没问题,只不过增加了维护的成本。

所以,单体未必差、集群未必好!适合自己的项目就行。系统不是设计出来了,是不断迭代演化而来的。

04 小结

我一直在想Stream Nexus要不要去支持集群,集群必然需要引入中间件。好纠结呀!

Redis似乎已经是很多企业一定有的中间件,通过Redis的Pub/Sub 广播当做消息总线似乎也是一种不错的选择。

后续根据情况,可以支持(但不必须)集群,提供多种选择,完善项目。希望对正在折腾推送服务的老铁们有帮助。

FastAPI与ollama大模型异步流式响应实战 异步编程是现代Web开发的核心技术,通过事件循环机制实现高并发处理。Python的asyncio库提供了原生的异步支持,而FastAPI作为基于ASGI的异步Web框架,天然适合处理IO密集型任务。在实际工程中,将大模型服务如ollama与Web框架集成时,流式响应(StreamingResponse)能显著提升用户体验,避免长时间等待。本文通过FastAPI+ollama的实战案例,详解如何用httpx实现异步HTTP客户端,处理模型推理的流式输出,并解决异步编程中的常见陷阱,为AI服务集成提供可靠方案。 阅读详情

相关推荐

FastAPI+LangGraph构建生产级AI工作流

AI工作流本质上是状态管理、逻辑编排与服务交付的协同问题。传统Chain模式难以应对分支判断、循环重试和跨请求上下文等工程需求,而图模型(Directed Graph)通过显式State、条件边和节点化设计,实现了AI决策逻辑的可调试、可监控与可迭代。FastAPI则补足了HTTP网关、状态持久化、安全治理与多协议适配能力,使LangGraph真正落地为高可用AI服务。本文聚焦FastAPI与LangGraph协同架构,详解状态建模、图编排、流式响应及Redis会话管理等核心实践。

weixin_30596343的博客 672

题解 P1003 【铺地毯】

关于 P1003 铺地毯 的答案 and some problem 关于此题,铺地毯,那就一张张铺吧。 这样不是很好? 模拟 来一段: #include<bits/stdc++.h> using namespace std; int n; int a,b,g,k; int x,y; short mp[10010][10010];//map与我有仇 int main() ...

ayy28903的博客 263

《后端程序员的 AI 工程化 30 讲:RAG、工具调用、Agent 落地》第 19 讲 · 流式输出与 SSE:Spring Boot 里的正确写法

摘要(148字): 非流式响应导致用户白屏13.8秒,重复点击率高达12.7%,504错误频发。改用SSE流式后,首字节时间降至0.61秒,用户感知等待显著改善,重复点击率降为1.4%。流式不缩短总耗时,却解耦“生成时长”与“空闲超时”,避免网关因静默断连。但需应对连接占用、中间层缓冲、客户端中断等新挑战。本讲详解SSE协议与生产级实现,确保流式从“打字机效果”变为稳定可用的系统能力。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 23

uWSGI WebSockets与SSE:3行配置实现实时推送

本文基于 **uWSGI 官方文档(uwsgi-docs)** 整理,带你在 **3 行配置**内搞定 uWSGI 的 **WebSockets** 与 **SSE(Server-Sent Events)实时推送**:无需重写应用架构,不引入额外中间件,原生高性能实现开箱即用。无论你是想给网站加实时消息、在线协作,还是做数据流推送,这篇指南都能让你 10 分钟上手。🚀 ## 为什么选 uWSG

gitblog_00527的博客 906

[F2F] Java后端AI大纲

120 道 Java 后端 AI 方向面试题,按六个类别整理:数据与接口契约、高并发与流式响应、状态与架构、性能安全成本、工程化与可观测性、Function Calling 与 RAG。排版沿用 MySQL 经典 50 题的做法,第 3 节把试卷整份摊开供自测,第 4 节按同一套全局编号给参考答案:每题一句一针见血的结论,加 2~4 条能落到白板上的要点,写到具体类名、注解、配置项和阈值。

OxYGC 124

智慧农业物联网平台全栈开发实战:Spring Boot+Vue从部署到核心源码解析

物联网(IoT)技术通过连接物理设备与数字世界,实现了数据的实时采集与远程控制,其核心价值在于将感知、传输、处理与应用融为一体,为传统行业数字化转型提供了关键支撑。在智慧农业等典型应用场景中,物联网平台需要构建从设备接入、数据处理到可视化分析的全链路能力。这通常涉及MQTT/HTTP等设备通信协议、时序数据存储、实时告警规则引擎以及前后端分离架构等关键技术。本文聚焦于一个开箱即用的智慧农业物联网全栈解决方案,该方案基于Spring Boot后端与Vue.js前端,集成了ruoyi框架后端与springboo

weixin_34378767的博客 352

实时通信选型指南:短轮询、长轮询、SSE、WebSocket与MQTT对比

在Web应用从“请求-响应”走向实时推送的演进中,如何让服务端主动将数据送达客户端,是所有后端工程师必须面对的核心问题。短轮询用定时请求模拟推送,简单却浪费资源;长轮询通过挂起请求降低空转,却对服务器线程模型提出严苛要求;SSE基于HTTP实现轻量级单向流式推送,成为大模型流式输出的友好伙伴;WebSocket以全双工帧协议支撑双向实时交互;MQTT则通过Broker完成多对多发布订阅,在物联网与弱网场景中发挥巨大价值。理解每种方案的连接模型、实时性、服务器开销与适用边界,是正确选型的前提。本文结合Spri

weixin_34293246的博客 163

OpenBmc开发2:构建开发环境

编译环境VMware + ubuntu 18.04 编译环境构建:参考OpenBmc开发1:构建开发环境 1、打开一个Ternimal,进入openbmc目录下 2、查看有哪些不同的编译配置 find meta-* -name local.conf.sample 可以看到如下编译配置 3、生成编译配置 插入TEMPLATECONF,上边查询到的配置有很多,但是有一些...

master 2万+

JavaWeb HTTP长连接完整梳理

本文系统梳理了JavaWeb中HTTP长连接的两种类型:1)HTTP/1.1 Keep-Alive(TCP连接复用),通过复用连接减少握手开销,适用于页面资源加载和接口调用;2)业务层推送方案,包括长轮询、SSE和WebSocket,详细分析各自适用场景及实现要点。重点指出开发中常见问题:线程阻塞、集群部署、超时处理等,并提供解决方案建议。最后给出选型指南:根据业务需求选择Keep-Alive、长轮询、SSE或WebSocket,并强调异步处理的重要性。文章包含实践性强的注意事项和优化建议,适合开发者参考落

233

Hodgkin-Huxley Model

介绍了经典的动力学模型:HH Model

weixin_73557167的博客 2473

保姆级教程:用Smaart7和你的USB声卡搞定现场音响系统调试(附频谱与延时测试避坑指南)

本文提供Smaart7与USB声卡协同工作的现场音响系统调试指南,涵盖硬件连接、频谱分析、延时校准等关键步骤。通过详细的操作流程和常见问题解决方案,帮助音响工程师快速掌握专业测量技术,确保演出音质达到最佳状态。

weixin_29290259的博客 421

Spring Boot 3集群WebSocket推送:JWT认证+STOMP+Redis Pub/Sub实践

在微服务与水平扩展架构下,服务端主动向用户推送消息是IM、告警、订单通知等业务的核心能力。WebSocket作为全双工通信协议保障了实时互通,STOMP协议则在其上定义了订阅与路由语义。然而当应用部署为多实例集群时,单机内存Broker无法共享会话状态,跨节点消息常被静默丢弃。要解决这一痛点,可采用JWT完成STOMP握手阶段的身份绑定,借助Redis Pub/Sub实现消息的跨实例广播,并通过心跳与会话事件维护连接可靠性。这套方案尤其适合需要自建通知推送服务、且已意识到单机WebSocket无法支撑多实例

weixin_28312391的博客 148

数据分析项目:直播电商用户流失分析

其中,'Tenure'(在网时长)可能是影响用户流失的关键因素,意味着用户在平台上的停留时间越长,流失的可能性可能越低,这提示平台应注重提高用户粘性,增加用户在平台上的活跃度和停留时间。)的分析,挖掘用户流失的原因和模式,分析发现用户投诉处理效率(Complain)、距上次消费时长(DaySinceLastOrder)、会员生命周期(Tenure)等8项核心指标对流失预测贡献度达87%,模型准确率94.58%,并提出相应的建议。重视用户的满意度,及时处理用户的投诉和反馈,不断改进平台的服务和功能。

Nervousr的博客 2457

手搓直播后端高并发架构:从单机搭建到万人压测全实录

高并发系统设计是后端工程师迈向架构进阶的核心能力,其本质是通过缓存、消息队列、连接池复用等基础手段,让系统在峰值流量下保持稳定。缓存用于挡住重复查询,消息队列负责异步削峰,连接池与线程池则决定请求的吞吐上限。这些技术的价值在直播、秒杀、社交互动等真实场景中体现得淋漓尽致。本文以直播后端为实战载体,完整记录了一套不依赖商业云服务、从零搭建并支撑万人同时在线的技术方案:基于 Spring Boot 构建业务接口,Redis 处理在线统计与缓存防击穿,RabbitMQ 承接弹幕与礼物的异步落库,SRS 负责视频流

weixin_33866037的博客 391

飞牛NAS1.1.19更新后SSH连不上?两步快速恢复连接

飞牛NAS1.1.19版本更新后SSH无法连接😟,实则是官方安全策略升级默认关闭了该服务,本文分享两步实操配置恢复SSH连接💻,还同步了官方的设备安全配置建议,帮助用户兼顾使用与设备防护🔒。

XiaoqiangClub的博客 2092

【全覆盖算法】栅格地图实现布氏单元分解算法+栅格地图实现牛耕Boustrophedon Cellular Decomposition Path Planning

本文先对做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 281

从零自研Java原生IM系统:长连接、消息可靠性与高并发实践

在分布式系统架构中,长连接管理与消息可靠性是构建实时通信能力的基石,尤其在IM即时通讯场景下,如何保证消息不丢、不重、有序成为核心挑战。基于Java生态,利用Netty构建TCP长连接,配合自定义协议、心跳保活、消息序号与ACK机制,能够形成一套完整的消息投递链路。这种原生自研方案相比直接套用开源框架,具备更高的可控性与定制能力,可灵活应对客服分流、组织架构同步、多端登录等复杂业务需求。其技术价值不仅体现在底层原理的透彻掌控上,更在于能为高并发场景提供按需优化的空间。该类方案适用于需要深度定制的内部OA、业

weixin_30357231的博客 301

使用CubeMX配置STM32H7的FreeRTOS

本文将介绍如何使用CubeMX配置STM32H7的FreeRTOS,并提供相应的源代码示例。通过使用CubeMX,你可以轻松地配置FreeRTOS和系统资源,并生成相应的初始化代码和配置文件。在"FreeRTOS"选项卡的"Tasks"部分,可以配置系统中的任务。首先,打开CubeMX软件。在"FreeRTOS"选项卡的"Resources"部分,你可以配置FreeRTOS使用的资源,例如,堆内存和信号量。例如,我们可以创建两个简单的任务,一个任务将在循环中切换LED的状态,另一个任务将通过串口打印消息。

JeeVue的博客 711

业务系统接入AI助手,为何要独立会话服务?架构、选型与避坑实践

传统业务接口追求毫秒级响应,而AI对话以流式输出和长连接为典型特征,二者生命周期截然不同。若在Spring Boot主工程中直接透传大模型请求,高并发对话会迅速耗尽线程池与数据库连接,甚至拖垮简历下载、审批等核心链路。会话服务的价值在于独立承载长连接、Redis会话状态与SSE流式推送,通过旁路挂载与业务系统解耦,实现故障隔离与弹性伸缩。在招聘系统、CRM、OA等业务场景中接入AI助手时,需从并发模型、状态生命周期、流量特征三个维度判断内嵌还是独立,并权衡Spring Boot+SSE透传、消息队列削峰、私

weixin_34094282的博客 275

大模型——AI对话四象限

{ "摘要": "文章揭示了90%的人不会有效与AI沟通的问题,指出简单粗暴的提问只能得到标准答案。作者提出'AI对话四象限'模型:1)双方都懂时提效;2)AI懂但需学会分层提问;3)共同探索未知领域;4)向AI传授独家知识。强调沟通技巧的重要性,认为会提问的人不会被AI替代。最后呼吁读者尝试四象限思维,与AI碰撞火花。" }

308

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Open MCT性能压测实战:JMeter定制化四阶测试方法论

Open MCT作为面向航天与工业场景的实时监控平台,其性能评估不能依赖主观体验,而需基于可量化、可复现的基准测试。其核心挑战源于多协议混合通信模型——WebSocket长连接维持、SSE流式历史拉取与REST批量操作并存,导致通用Web压测工具失效。JMeter虽为业界主流,但必须通过定制插件(WebSocket Samplers、SSE Plugin、Ultimate Thread Group)适配Open MCT的子协议握手、事件流解析与阶梯式负载特征。技术价值在于精准定位瓶颈层级(前端渲染/网络传输

weixin_31082403的博客 237

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

全链路内存泄漏治理:从浏览器到Node.js的完整排查指南

内存泄漏是长期运行的应用中常见的隐患,它源于对象生命周期管理不当,导致垃圾回收机制无法释放不再使用的内存。在浏览器与Node.js环境中,V8引擎的垃圾回收依赖引用链的扫描,一旦全局变量、定时器、事件监听或闭包持有未预期的引用,内存占用便会持续攀升。这一问题的技术价值在于,通过建立从对象创建到销毁的完整生命周期管理,可以显著提升系统的稳定性与资源利用率。在数据大屏、企业后台、实时看板等需要长时间不刷新运行的场景中,内存泄漏不仅造成页面卡顿,甚至引发崩溃。因此,需要从前端组件治理、接口数据裁剪、长连接消息处理

weixin_34377919的博客 201

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

从零构建可交互行为分类演示系统:数据、模型与可视化实战

行为分类是机器学习与模式识别领域的核心任务,旨在通过算法模型自动识别和归类用户或系统的活动模式。其基本原理是从传感器数据、视频序列或事件日志中提取特征,利用分类模型(如SVM、随机森林或深度学习网络)进行模式匹配与预测。这项技术的核心价值在于将原始数据转化为可理解的语义信息,为决策提供支持。在实际工程中,一个完整的分类系统需要涵盖数据接口、模型推理与结果展示三大模块,涉及数据预处理、模型部署与服务化、前后端交互等关键技术环节。本文聚焦于构建一个端到端的Activity Classification Demo

weixin_30824479的博客 394

前端工程师转型AI全栈:从React到FastAPI的实战避坑指南

在现代软件开发中,全栈开发的概念已从传统的前后端技术栈扩展到包含人工智能模型的整合。理解AI模型的工作原理,特别是大语言模型(LLM)的概率性输出特性,是构建智能应用的基础。其技术价值在于将确定性交互界面与非确定性的智能推理相结合,从而创造出更智能、更个性化的用户体验。在实际工程实践中,这通常涉及前端(如React)、后端业务层(如Java/Spring Boot)与专门的AI服务层(如Python/FastAPI)的协同。通过HTTP API或RPC进行通信,开发者可以搭建起连接用户与AI模型的桥梁。本文

weixin_30947043的博客 337

FastAPI+LangGraph+MCP实战:从零搭建生产级AI Agent

大模型应用开发正从简单的Prompt调用向复杂的智能体(AI Agent)演进。构建一个生产级AI Agent,需要解决异步接口、状态编排和工具接入三大核心问题。FastAPI作为高性能Web框架,天然支持异步处理与SSE流式响应,保障了Agent的交互体验;LangGraph通过状态图机制对Agent流程进行精细编排,使多步骤任务、条件分支和持久化记忆成为可能;MCP协议则标准化了外部工具接入方式,实现了即插即用的工具扩展。三者结合构成了一套完整的Agent服务架构,广泛应用于智能客服、办公助手、数据分析

weixin_33863087的博客 282

【AI Agent】2026年9月 AI Agent 全栈开发最新技术面试宝典(含高频+必背+大厂真题)

本文整理了2026年AI Agent全栈开发最新技术面试题,涵盖基础概念、核心框架和系统设计等关键领域。重点解析了AI Agent与普通Chatbot的本质区别(自主闭环执行能力)、Agentic Loop的完整工作流程(规划-执行-观察-评估循环),以及ReAct范式的原理与适用场景。特别强调面试回答技巧:需结合工程实践中的典型问题、处理方案和量化指标,而非简单背诵定义。内容来自字节、阿里等大厂真实面经,适合3-5年经验开发者准备春招面试,突出考察候选人在复杂场景下的技术决策能力。

小江的记录本 4612
上一篇: Stream Nexus:我的轻量级推送中间件(sse、websocket)终于定下来了
下一篇: QClaw关停之后:一个工具的退场,一段关系的告别
智_永无止境
博客等级 码龄10年 803粉丝 403原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值