当前位置: 首页 > news >正文

FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍

以下是对 FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍,涵盖技术原理、实现步骤、协作流程和适用场景。


1. 技术概述

1.1 FastAPI
  • 特性:基于 Python 的现代异步框架,支持 async/await,性能高效,适合高并发场景。
  • 作用:作为主框架,提供 HTTP API 和 WebSocket 端点,处理客户端请求并转发消息。
1.2 Redis Pub/Sub
  • 特性:Redis 的发布-订阅(Pub/Sub)机制,支持消息的实时广播。
  • 作用:作为消息中转站,负责将消息从发布者(Publisher)广播到所有订阅者(Subscriber)。
1.3 WebSocket
  • 特性:全双工通信协议,允许客户端和服务端实时双向通信。
  • 作用:建立客户端与服务端的持久化连接,用于推送实时消息。

2. 组合方案原理

通过 FastAPI 提供 HTTP 接口和 WebSocket 端点,结合 Redis Pub/Sub 实现消息广播,最终通过 WebSocket 将消息实时推送给客户端。其核心流程如下:

  1. 客户端请求:客户端通过 HTTP 或 WebSocket 向 FastAPI 发起请求。
  2. 消息发布:其他服务或客户端通过 FastAPI 的 HTTP 接口向 Redis 发布消息。
  3. 消息广播:Redis 将消息推送到订阅的频道(Channel)。
  4. 消息接收:FastAPI 的 WebSocket 端点监听 Redis 的消息,并通过 WebSocket 将消息推送给所有已连接的客户端。

3. 实现步骤

3.1 环境准备
  • 依赖安装
    pip install fastapi[all] redis-async
    
  • Redis 启动:确保 Redis 服务已运行(如 redis-server)。
3.2 FastAPI WebSocket 端点

创建一个 WebSocket 端点,处理客户端连接和消息广播:

from fastapi import FastAPI, WebSocket
from redis.asyncio import Redis
from redis.asyncio.client import PubSubapp = FastAPI()
redis_client = Redis(host="localhost", port=6379, db=0)
pubsub: PubSub = None  # 全局 Pub/Sub 对象@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()# 客户端连接时订阅 Redis 频道global pubsubif not pubsub:pubsub = redis_client.pubsub()await pubsub.subscribe("realtime_channel")# 创建异步任务监听 Redis 消息async def message_handler():while True:message = await pubsub.get_message(ignore_subscribe_messages=True)if message:data = message["data"].decode("utf-8")await websocket.send_text(data)try:await message_handler()finally:await websocket.close()
3.3 消息发布接口

通过 FastAPI 的 HTTP 接口发布消息到 Redis:

@app.post("/publish")
async def publish_message(message: str):await redis_client.publish("realtime_channel", message)return {"status": "success", "message": message}
3.4 客户端示例(JavaScript)

通过 WebSocket 连接接收消息:

const ws = new WebSocket("ws://localhost:8000/ws");ws.onopen = () => {console.log("Connected to WebSocket server");
};ws.onmessage = (event) => {const message = event.data;console.log("Received message:", message);
};// 发布消息(通过 HTTP)
fetch('http://localhost:8000/publish', {method: 'POST',headers: { 'Content-Type': 'application/json' },body: JSON.stringify({ "message": "Hello WebSocket!" })
});

4. 协作流程

  1. 客户端连接:客户端通过 WebSocket 连接到 /ws 端点。
  2. 订阅频道:FastAPI 的 WebSocket 端点在客户端连接时,自动订阅 Redis 的 realtime_channel
  3. 消息发布:其他服务或客户端通过 /publish 接口向 Redis 发送消息。
  4. 消息广播:Redis 将消息推送到所有订阅 realtime_channel 的客户端(包括 FastAPI 的 WebSocket 端点)。
  5. 消息推送:FastAPI 的 message_handler 接收 Redis 消息,通过 WebSocket 将其推送给所有连接的客户端。

5. 优势与适用场景

优势
  • 高性能:FastAPI 的异步特性与 Redis 的高效广播相结合,支持高并发实时通信。
  • 解耦架构:消息发布者和消费者无需直接通信,通过 Redis 中间件解耦。
  • 实时性:WebSocket 实现全双工通信,消息延迟极低。
适用场景
  • 实时聊天室:消息即时推送至所有在线用户。
  • 实时仪表盘:实时更新数据(如股票价格、物联网传感器数据)。
  • 游戏通知:游戏内事件(如玩家动作、比赛结果)的实时推送。
  • 系统监控:服务器监控告警实时通知运维团队。

6. 注意事项

  1. 消息可靠性
    • Redis Pub/Sub 是非持久化、非确认机制,消息可能因网络问题丢失。
    • 重要消息需结合持久化队列(如 RabbitMQ)或冗余机制。
  2. 性能优化
    • 高并发场景下,考虑 Redis 集群或分片。
    • 频道命名规范化,避免资源浪费。
  3. 安全性
    • WebSocket 连接需验证身份(如 JWT 认证)。
    • 限制 Redis 频道的订阅权限。
  4. 错误处理
    • 监听 Redis 连接中断,自动重连。
    • 异常消息格式需有容错机制。

7. 扩展建议

  1. 数据过滤:根据客户端权限或主题过滤推送的消息。
  2. 消息队列:结合 RabbitMQ 或 Kafka 处理高可靠性场景。
  3. 缓存机制:对历史消息进行缓存,供新连接的客户端拉取。
  4. 日志监控:记录消息发布和订阅日志,便于调试和审计。

通过此方案,可以快速构建高性能、低延迟的实时通信系统,适用于多种需要实时交互的应用场景。

相关文章:

FastAPI + Redis Pub/Sub + WebSocket 组合解决方案的详细介绍

以下是对 FastAPI Redis Pub/Sub WebSocket 组合解决方案的详细介绍,涵盖技术原理、实现步骤、协作流程和适用场景。 1. 技术概述 1.1 FastAPI 特性:基于 Python 的现代异步框架,支持 async/await,性能高效,适合高…...

泛型的诗意——深入C++模板的艺术与科学(模版进阶)

前言: 在之前,小编讲述了模版的初阶内容,当时小编讲述了模版的书写,方便之后容器的讲解以及模拟实现,现在小编已经带领各位学习了很多容器,模版初阶的知识已经用的很多了,今天小编讲述一下全新的…...

【极致版】华为云Astro轻应用抽取IoTDA影子设备参数生成表格页面全流程

做份极致详细Astro调取iotda影子设备数据的操作手册,每一步都分成: 要进入哪个界面 点哪个按钮 要填什么内容(样例) 如果出错怎么办 填写示例 完全对应你这个需求:Astro轻应用抽取IoTDA影子设备数据,…...

业务中台与数据中台:企业数字化转型的核心引擎

前言:在当今数字化浪潮下,企业为了提升运营效率、加速创新步伐并更好地适应市场变化,业务中台与数据中台应运而生,成为企业架构中的关键组成部分。本文将深入探讨业务中台和数据中台的简介、发展史、技术流环节以及在实际生产中的…...

前端分页与瀑布流最佳实践笔记 - React Antd 版

前端分页与瀑布流最佳实践笔记 - React Antd 版 1. 分页与瀑布流对比 分页(Pagination)瀑布流(Infinite Scroll)展示方式按页分批加载,有明确页码控件滚动到底部时自动加载更多内容,无明显分页用户控制用…...

【网络原理】从零开始深入理解TCP的各项特性和机制.(三)

上篇介绍了网络原理传输层TCP协议的知识,本篇博客给大家带来的是网络原理剩余的内容, 总体来说,这部分内容没有上两篇文章那么重要,本篇知识有一个印象即可. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分…...

MySQL:13.用户管理

13. 用户管理 如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。 13.1 用户 13.1.1 用户信息 MySQL中的用户,都存储在系统数据库mysql的user表中 mysql> use mysql; Database changed mysql> select h…...

leetcode0103. 二叉树的锯齿形层序遍历-medium

1 题目:二叉树的锯齿形层序遍历 官方标定难度:中 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行&#xf…...

【Go语言】ORM(对象关系映射)库

github.com/jinzhu/gorm 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,用于简化与关系型数据库的交互。以下是关于它的关键信息: 核心特点 全功能 ORM 支持主流数据库:MySQL、PostgreSQL、SQLite、SQL Server 等。…...

Java : GUI

AWT 初始化界面 直接封装起来: panel 的添加 布局 流式布局,控制按钮的位置 东西南北中布局 网格布局 frame.pack();java函数,会自动选择最优的布局 事件监听 给按钮添加 添加文本 画笔 鼠标监听 键盘监听 JDialog”弹窗 默认有关闭事件 标签&#…...

ipa包安装到apple手机上

获ipa包的方式 ipatool 下载appStore的ipa包-CSDN博客 方式一:巨魔商店 原理是利用apple的漏洞,但是有低版本的系统要求 TrollStore - Always Sideload Any IPAs For FreeTrollStore - The ultimate jailbreak app for iOS. Permanently install any …...

JavaScript输出数据的方法

1. console.log() console.log()是最常用的方法之一,用于在浏览器的控制台(Console)中输出信息。这对于调试和查看变量的值非常有用。 console.log("Hello, world!");2. alert() alert()方法会弹出一个带有指定消息和确定按钮的警告…...

操作系统:计算机世界的基石与演进

一、操作系统的本质与核心功能 操作系统如同计算机系统的"总管家",在硬件与应用之间架起关键桥梁。从不同视角观察,其核心功能呈现多维价值: 硬件视角的双重使命: 硬件管理者:通过内存管理、进程调度和设…...

FFmpeg之三 录制音频并保存, API编解码从理论到实战

在学习FFmpeg的时候,想拿demo来练习,官方虽有示例,但更像是工具演示,新手不好掌握,在网上找不到有文章,能给出完整的示例和关键点的分析说明,一步一个错误,慢慢啃过来的,…...

幂等性处理解决方案实战示例

幂等性处理解决方案实战示例 幂等性是指对同一个操作执行一次或多次,产生的结果是相同的。在分布式系统、网络请求和金融交易等场景中,幂等性设计至关重要。下面我将介绍几种常见的幂等性处理方案及其实战示例。 1. 唯一标识符方案 原理:为…...

华为仓颉编程语言的实际用法与使用领域详解

华为仓颉编程语言的实际用法与使用领域详解 一、语言概述与核心特性 华为仓颉编程语言是面向万物智联时代的系统级编程语言,其核心特性包括: 三重内存安全机制:所有权系统 + 引用检查 + 硬件辅助防护零成本抽象:高级语法不牺牲底层性能全场景支持:从嵌入式设备到量子计算…...

JavaEE-多线程实战01

Java 多线程入门:第一个多线程程序 在 Java 中,多线程编程是非常重要的一部分。本篇文章将通过示例,带你快速了解如何创建第一个多线程程序,并深入分析其运行机制。 1. 创建一个线程类并继承 Thread 在 Java 中,我们…...

当AI浏览器和AI搜索替代掉传统搜索份额时,老牌的搜索引擎市场何去何从。

AI搜索与传统搜索优劣势分析 AI搜索优势 理解和处理查询方式更智能:利用自然语言处理(NLP)和机器学习技术,能够更好地理解用户的意图和上下文,处理复杂的问答、长尾问题以及多轮对话,提供更为精准和相关的…...

大模型——Spring.new快速构建AI驱动的定制化商业应用

大模型——Spring.new快速构建AI驱动的定制化商业应用 Spring.new 是一个基于人工智能的在线平台,专注于帮助营销经理和产品经理快速构建定制化工作流和小型应用。它通过自然语言输入,让用户描述需求,自动生成连接 Notion、Airtable、Slack 等工具的工作流或应用,例如将 F…...

django admin 中更新表数据 之后再将数据返回管理界面

在Django中,更新数据库中的数据并将其重新显示在Django Admin界面上通常涉及到几个步骤。这里我将详细说明如何在Django Admin中更新表数据,并确保更新后的数据能够立即在管理界面上显示。 定义模型 首先,确保你的模型(Model&…...

深度理解linux系统—— 进程概念

一、进程 进程,什么是进程? 在课本,教材中是这样描述的:程序的一个执行示例,正在执行的程序; 从内核角度来说,进程就是担当分配系统资源(CPU时间,内存)的实体…...

【如何使用solidwork编辑结构导入到simscope】

这里写自定义目录标题 欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 To use Simscape Multibody Link, you must install MATLAB and the CAD applications on the same computer. To ensure the successful installation of Simscape Multibody Link, before launching yo…...

Flink 时态维度表 Join 与缓存机制实战

一、引言:为什么需要时态维度表? 在实时数仓建设中,维度表是不可或缺的一环,例如: 风控系统中,用户的风险等级在不同时间可能变化; 营销体系中,商品的促销标签会动态调整&#xff…...

Apache Tomcat 漏洞(CVE-2025-24813)导致服务器面临 RCE 风险

CVE-2025-24813Apache Tomcat 中发现了一个严重安全漏洞,标识为,该漏洞可能导致服务器面临远程代码执行 (RCE)、信息泄露和数据损坏的风险。 此缺陷影响以下版本: Apache Tomcat11.0.0-M1通过11.0.2Apache Tomcat10.1.0-M1通过10.1.34Apache Tomcat9.0.0-M1通过9.0.98了解 …...

来自B站-AI匠的“RAG的prompt设计指南“的部分截图

来自B站-AI匠的“RAG的prompt设计指南“的部分截图 0. 引言1. RAG提示词 - 部分视频截图2. 总结 - 部分视频截图3. 举例 - 部分视频截图 0. 引言 这个文章记录的是B站Up主AI匠关于RAG的prompt设计指南的视频截图。 1. RAG提示词 - 部分视频截图 笔记: Up主推荐Fa…...

【Linux】Centos7 在 Docker 上安装 Redis7.0(最新详细教程)

一、拉取 Redis 镜像 1. 从 阿里云加速器(docker hub)拉取 redis镜像,选择镜像标签为 7.2.4 docker pull redis:7.2.4 2. 准备 Redis 的配置文件(便于后期对配置文件进行修改) 3.在服务器上创建需要挂载的文件夹 mk…...

Java使用微信云服务HTTP API操作微信云开发数据库

可以直接用的工具类代码 package com.kstc.qgy.util;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.kstc.qgy.model.exception.WxException; import com.kstc.qgy.model.service.Limit; imp…...

Linux的权限

目录 1、用户分类 1.1 超级用户(root)和普通用户 1.2 普通<->超级 1.3 sudo 2、文件和目录的权限 2.1 chown&&chgrp 2.1.1 chown 2.1.2 chgrp 2.2 chmod 总结一下&#xff1a; 3、文件和目录的默认权限 4、共享文件 4.1 理解多用户隔离 4.2 /tmp/ 1…...

ACT游戏和MMORPG经济形态区别以及对经济循环的思考

对于原神的明日之后经济形态的不同解析 对于MMORPG游戏来说&#xff0c;如果采用开放市场经济的设计&#xff0c;以明日之后为例&#xff0c;系统产出端为采集、运营活动投放&#xff1b;玩家产出端为交易&#xff1b;消耗端为武器耐久的减少。但我好奇&#xff0c;在ACT游戏里…...

zynq7035的arm一秒钟最多可以支持触发多少次中断

一、概述 1.关于zynq7035的ARM处理器一秒能够支持多少次中断触发&#xff0c;需要综合来考虑。需要确定ARM处理器的参数&#xff0c;目前zynq7000系列&#xff0c;使用的双核Cortex-A9处理器。其中主频大概在500MHZ~1GHZ左右&#xff0c;不同的用户配置的主频可能稍微有差别。 …...

Spring MVC 拦截器教程

一、拦截器核心概念 1.1 拦截器 vs 过滤器 特性过滤器 (Filter)拦截器 (Interceptor)依赖关系Servlet容器Spring MVC框架作用范围所有Web请求Controller请求实现机制Java EE标准Java反射AOP生命周期服务器启动时初始化随Spring容器初始化功能场景字符编码、安全过滤权限校验、…...

【HPC存储性能测试】02-ior带宽性能测试

文章目录 一、前言二、软件安装1、安装依赖2、安装软件 三、参数说明1、mpirun参数2、ior参数 四、测试说明 一、前言 ior introduction | github hpc ior IOR 测试工具使用 POSIX、 MPIIO 或 HDF5接口对并行文件系统进行基准测试 通常使用IOR测试工具时&#xff0c;一般会配合…...

【RabbitMQ】保证消息不丢失

要确保 RabbitMQ 在消费者&#xff08;Python 服务&#xff09;重启或挂掉时消息不丢失&#xff0c;需结合 消息持久化、确认机制&#xff08;ACK&#xff09; 和 死信队列&#xff08;DLX&#xff09; 实现高可靠性&#xff1a; 1. 消息持久化&#xff08;Durability&#xff…...

算法效率的钥匙:从大O看复杂度计算 —— C语言数据结构第一讲

目录 1.数据结构与算法 1.1数据结构介绍 1.2算法介绍 2.算法效率 2.1复杂度 2.1.1时间复杂度 2.1.1.1时间复杂度计算示例1 2.1.1.2时间复杂度计算示例2 2.1.1.3时间复杂度计算示例3 2.1.1.4时间复杂度计算示例4 2.1.1.5时间复杂度计算示例5 2.1.1.6时间复杂度计算示例6…...

AI赋能守护行车安全新防线,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建驾驶车辆场景下驾驶员疲劳分心驾驶行为智能检测预警系统

在当今社会&#xff0c;随着科技生产力的飞速发展&#xff0c;汽车早已成为人们日常出行不可或缺的交通工具。它不仅极大地提高了人们的出行效率&#xff0c;也为生活带来了诸多便利。然而&#xff0c;随着汽车保有量的不断增加&#xff0c;交通安全问题也日益凸显。疲劳驾驶和…...

HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)

HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析&#xff1a; 嵌入式操作系统特点是内核精简、专用性强、高实时性&#xff0c;而"功能强大"通常指的是通用操作系统&#x…...

【音视频】SDL事件

SDL 事件 函数 SDL_WaitEvent()&#xff1a; 等待一个事件SDL_PushEvent()&#xff1a; 发送一个事件SDL_PumpEvents()&#xff1a; 将硬件设备产生的事件放入事件队列&#xff0c;用于读取事件&#xff0c;在调用该函数之前&#xff0c;必须调用SDL_PumpEvents搜集键盘等事件…...

[特殊字符]实战:使用 Canal + MQ + ES + Redis + XXL-Job 打造高性能地理抢单系统

&#x1f4da;目录 项目背景 技术栈总览 详细流程分析 3.1 Canal监听MySQL Binlog 3.2 MQ中转传递订单变化 3.3 Elasticsearch存储并查询附近订单 3.4 Redis高性能抢单Lua防止抢单冲突 3.5 XXL-Job定时任务处理 完整系统流程图 总结 一、项目背景 针对类似外卖、跑…...

FPGA基础之基础语法

一、基本模块结构 Verilog 代码以 模块&#xff08;Module&#xff09; 为单位&#xff0c;每个模块对应一个硬件功能单元&#xff08;如逻辑门、寄存器等&#xff09;。 基本格式&#xff1a; module 模块名 (// 输入输出端口声明input 端口1,input 端口2,output 端口3 );…...

影楼精修-皮肤瑕疵祛除算法解析

注意&#xff1a;本文样例图片为了避免侵权&#xff0c;均使用AIGC生成&#xff1b; 顾名思义&#xff0c;皮肤瑕疵祛除旨在祛除人像照片皮肤区域的痘痘/斑点/痣/胎记等瑕疵&#xff1b;当前主流算法方案可分为传统图像处理方法和基于深度学习的方法&#xff0c;本文重点介绍基…...

2025蓝桥杯省赛网络安全组wp

文章目录 黑客密室逃脱ezEvtxflowzipEnigma星际xml解析器EBC-TrainAES-CBC 黑客密室逃脱 提示猜文件名&#xff0c;猜几个常见的&#xff0c;app.py读到源码 这里也是脑抽了一下&#xff0c;把密钥看成1236了。。。卡了五分钟左右&#xff0c;解出来的时候已经降到300多分了&a…...

【数据结构】·励志大厂版(复习+刷题):二叉树

前引&#xff1a;哈喽小伙伴们&#xff01;经过几个月的间隔&#xff0c;还是逃脱不了再次复习的命运&#xff01;&#xff01;&#xff01;本篇文章没有冗杂的闲话&#xff0c;全是干货教学&#xff0c;带你横扫二叉树的几种遍历&#xff0c;怎么前序、、中序、后续&#xff1…...

Spark-Streaming2

一&#xff0e;有状态转化操作 1. UpdateStateByKey UpdateStateByKey 原语用于记录历史记录&#xff0c;有时&#xff0c;我们需要在 DStream 中跨批次维护状态(例如流计算中累加 wordcount)。针对这种情况&#xff0c;updateStateByKey()为我们提供了对一个状态变量的访问&…...

《深入浅出Git:从版本控制原理到高效协作实战》​

Git的原理和使用 1、Git初识与安装2、Git基本操作2.1、创建Git本地仓库2.2、配置Git2.3、认识工作区、暂存区、版本库2.4、修改文件2.5、版本回退2.6、撤销修改2.7、删除文件 3、Git分支管理3.1、理解分支3.2、创建、切换、合并分支3.3、删除分支3.4、合并冲突3.5、合并模式3.6…...

内耗型选手如何能做到不内耗?

以下是针对「内耗型选手」的系统性解决方案&#xff0c;结合认知神经科学、行为心理学和效能管理理论&#xff0c;提供可落地的策略框架&#xff1a; 一、建立「内耗熵值」监测系统 1. 绘制内耗热力图 用时间轴记录每日内耗触发点&#xff1a; 时间段内耗场景能量损耗值&…...

pyspark将hive数据写入Excel文件中

不多解释直接上代码&#xff0c;少python包的自己直接下载 #!/usr/bin/env python # -*- encoding: utf-8 -*- from pyspark.sql import SparkSession import pandas as pd import os# 初始化 SparkSession 并启用 Hive 支持 spark SparkSession.builder \.appName("sel…...

Java大师成长计划之第5天:Java中的集合框架

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在 Java 编程中&#xff0c;集合框架…...

rt-linux下的D状态的堆栈抓取及TASK_RTLOCK_WAIT状态

一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里的 2.1 一节里的代码&#xff0c;我们已经有了一个比较强大的抓取D状态和等IO状态超过阈值的waker和wakee的堆栈状态的内核模块。在之前的博客 增加等IO状态的唤醒堆栈打印及缺页异常导致iowa…...

数据结构【堆和链式结构】

堆和链式结构 1.堆的概念和定义1.1堆1.2二叉树的性质 2.堆的实现3.实现链式二叉树3.1链式二叉树的概念3.2前中后遍历3.3遍历&#xff08;举例&#xff09; 1.堆的概念和定义 1.1堆 定义&#xff1a;是特殊的二叉树 #mermaid-svg-vWPNPMGSLe0nGNcd {font-family:"trebuch…...

聊一聊自动化测试

目录 一、自动化测试的定义与核心价值 &#xff08;一&#xff09;什么是自动化测试 &#xff08;二&#xff09;核心价值&#xff1a;从人工到智能的跨越 二、自动化测试的发展阶段 &#xff08;一&#xff09;萌芽阶段&#xff08;早期&#xff09; &#xff08;二&…...