首页/新闻资讯/正文详情

Litestar Channels psycopg 后端实战指南:用 PostgreSQL LISTEN/NOTIFY 做零额外中间件事件广播

发布时间:2026/9/27 8:31:42 来源:云帆数科 栏目:资讯中心
Litestar Channels psycopg 后端实战指南:用 PostgreSQL LISTEN/NOTIFY 做零额外中间件事件广播
Litestar Channels psycopg 后端实战指南用 PostgreSQL LISTEN/NOTIFY 做零额外中间件事件广播【免费下载链接】litestarLight, flexible and extensible ASGI framework | Built to scale项目地址: https://gitcode.com/GitHub_Trending/li/litestarLitestar 的 Channels 子系统负责事件流路由最常见的用途是把一条消息广播给多个进程里的 WebSocket 客户端PsycoPgChannelsBackend是其中基于 psycopg3 异步驱动的实现把已有的 PostgreSQL 直接当作消息 broker靠原生的LISTEN/NOTIFY完成跨进程投递。如果你的项目重度依赖 psycopg3又不想为低频广播单独引入一个 Redis这篇 Litestar Channels psycopg 后端接入与原理指南讲的就是它怎么配置、一条消息如何从NOTIFY走到 WebSocket、有哪些坑、以及和其他后端怎么对比。多实例 WebSocket 广播不接 broker 会卡在哪先说清楚不接外部 broker 时的症状MemoryChannelsBackend把所有数据存在进程内存里性能是所有后端里最高的但进程之间互不可见。应用一旦横向扩容到多进程、多实例A 进程发布的事件到不了 B 进程的连接上的客户端——广播直接失效。Channels 的解法是把消息存储与扇出抽象成ChannelsBackend定义在 litestar/channels/backends/base.py由它负责和 broker 通信发布、接收。所有共享同一 broker 的后端实例都能收到相同的消息跨进程通信就此成立。PsycoPgChannelsBackend是这个抽象在 psycopg3 上的实现broker 就是你现有的 PostgreSQL——跨进程一致性由数据库保证任何进程只要LISTEN了某个频道就能收到任意进程发出的NOTIFY。接入前的检查项只有一条psycopg3 版本必须 ≥ 3.2.4这是 docs/usage/channels.rst 在 Backends 一节的明确要求。3 分钟接入步骤dsn 与 ChannelsPlugin 怎么配接入配置只有三行核心关键词就一个pg_dsn。backend PsycoPgChannelsBackend( pg_dsnpostgresql://user:passwordlocalhost:5432/mydb, ) channels ChannelsPlugin( backendbackend, channels[general, notifications], create_ws_route_handlersTrue, )为什么这样写构造函数只收pg_dsn一个参数插件拿到channels声明后create_ws_route_handlersTrue会为每个频道自动生成一条 WebSocket 路由省去手写转发逻辑。生命周期你不用管——litestar/channels/plugin.py 里的ChannelsPlugin在应用启动时调用backend.on_startup()、关闭时调用backend.on_shutdown()启动阶段打开一条专用监听连接并拉起后台监听任务关闭阶段置停止标志、停掉监听、清空订阅集合并经AsyncExitStack统一释放连接异常路径下连接也不会泄漏。两个配置细节决定你能否少踩坑。第一后端内部所有连接都以autocommitTrue打开——LISTEN/NOTIFY这类指令不依赖事务上下文事务包裹反而没意义。第二频道名拼 SQL 时走 psycopg 的Identifier安全转义不会出现在文本字面量之外SQL 注入风险被工具链挡掉。另外记一条运行期行为插件层的publish()是同步非阻塞方法消息先进内部队列、由后台 worker 异步写入后端它返回时不保证已发布需要立即确认时用await channels.wait_published(data, channels)它会绕过队列直接调用backend.publish。 向未声明的频道发布或订阅会抛ChannelsException如果你的频道名要动态生成插件参数arbitrary_channels_allowedTrue可以允许临时建频道此时只生成一条用路径参数承载频道名的路由。一条消息的完整链路从 NOTIFY 到被消费发布端的实现很直白async def publish(self, data: bytes, channels: Iterable[str]) - None: dec_data data.decode(utf-8) async with await AsyncConnection[Any].connect(self._pg_dsn, autocommitTrue) as conn: for channel in channels: await conn.execute( SQL(NOTIFY {channel}, {data}).format(channelIdentifier(channel), datadec_data) )这段代码回答了两个为什么NOTIFY的载荷本质是文本所以入参bytes先decode(utf-8)接收端再encode还原守住事件一律为 bytes的接口约定每次发布新开一条短连接是因为监听连接被notifies()迭代长期占用复用它会和接收循环互相阻塞——逐频道NOTIFY天然就是 fanout所有LISTEN该频道的连接无论属于哪个进程都会收到。完整链路四步publish发出NOTIFY→ 监听任务收到通知并put_nowait进_event_queue→ 插件的订阅 worker 调stream_events()逐个消费 → 路由到对应频道的 Subscriber最终经 WebSocket 发给客户端。监听任务的节奏由两个常量控制_LISTEN_POLL_INTERVAL 0.1秒一轮notifies()每轮之间检查停止标志停止监听时先置_stop_listening True最多等_STOP_LISTENER_TIMEOUT 5.0秒让循环自己退出超时再cancel()任务即先礼后兵。错误传播走同一条队列监听循环捕获到异常后原样重抛CancelledError其他任何异常比如连接中断都作为对象放进事件队列stream_events从队列取到Exception实例时直接raise插件的订阅 worker 因此能感知故障并中止而不是静默丢消息。还有一处容易漏掉的竞态UNLISTEN生效前队列里可能还残留旧频道的事件。stream_events在取出事件后会再校验一次channel in self._subscribed_channels才 yield退订后的旧事件就此被丢弃——这是订阅集合与网络 IO 解耦后必须补的双重校验。不支持历史回放怎么办get_history 直接抛 NotImplementedError⚠️ 这个后端不支持频道历史回放get_history()直接抛NotImplementedError。落到使用上就是三条路全部堵死ChannelsPlugin.subscribe(..., historyN)会失败、put_subscriber_history()会失败、生成 WebSocket 路由时设置发送历史示例见 docs/examples/channels/put_history.py也会失败。所以你应该按需求换后端需要历史就用RedisChannelsStreamBackend基于 Redis Streams纯本地开发或单进程应用可以用MemoryChannelsBackend(history20)启用内存历史。同为 PostgreSQL 驱动的AsyncPgChannelsBackendlitestar/channels/backends/asyncpg.py在get_history上行为一致选型时别指望它补上这块能力。五个后端横向对比psycoPg 后端适合什么场景docs/usage/channels.rst 当前实现的后端对比如下后端Broker支持历史适用场景MemoryChannelsBackend进程内存支持history参数测试、本地开发、单进程应用RedisChannelsPubSubBackendRedis Pub/Sub否低延迟、无需历史的跨进程广播RedisChannelsStreamBackendRedis Streams支持需要历史与持久化的跨进程广播AsyncPgChannelsBackendPostgreSQLasyncpg 驱动否已深度使用 asyncpg 的项目PsycoPgChannelsBackendPostgreSQLpsycopg3 驱动否已深度使用 psycopg3 的项目选型建议按依赖现状走项目已经在用 psycopg3广播只是低频通知、管理端刷新这类需求就复用现有 PostgreSQL 基础设施减少一个中间件项目用的是 asyncpg则选AsyncPgChannelsBackend——两个后端功能对齐构造参数名不同pg_dsnvsdsn/make_connection。延迟和吞吐是硬指标时Redis Pub/Sub 通常是更优选择需要历史加持久化上 Redis Streams。不连数据库也能测假连接验证并发与错误处理这个后端的单元测试tests/unit/test_channels/test_psycopg_backend.py不连真实数据库而是注入假连接对象三个测试各验证一条关键契约test_subscription_mutations_are_serialized用asyncio.gather同时发起两次subscribe断言连接上活跃操作数峰值为 1——订阅变更在_listener_lock内串行执行不会并发写坏监听连接test_stream_events_propagates_listener_failures注入一个notifies()持续抛RuntimeError(listener failed)的连接断言该异常能从stream_events传播给消费者test_stream_events_filters_queued_events_after_unsubscribe队列里预置旧频道和新频道各一条事件断言退订后旧事件被过滤、新事件正常放行。假连接 队列断言的写法正好对应前文的内部状态机本地想验证并发与错误传播行为时照着抄即可配合 tests/unit/test_channels/conftest.py 和各后端共用的行为契约测试覆盖是完整的。边界结论项目已在用 psycopg3、广播是低频需求、不想新增中间件——PsycoPgChannelsBackend直接用确认 psycopg3 ≥ 3.2.4需要历史回放或更高吞吐——换RedisChannelsStreamBackend或RedisChannelsPubSubBackend不要在这个后端上硬做。【免费下载链接】litestarLight, flexible and extensible ASGI framework | Built to scale项目地址: https://gitcode.com/GitHub_Trending/li/litestar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

工业级高精度表面瑕疵检测中无监督对抗自编码器(AnoGAN / FastFlow)实战
工业级高精度表面瑕疵检测中无监督对抗自编码器(AnoGAN / FastFlow)实战

工业级高精度表面瑕疵检测中无监督对抗自编码器(AnoGAN / FastFlow)实战在半导体晶圆封装、高精汽车发动机气缸内壁、高端精密皮革与织物、以及医药胶囊胶皮表面等工业视觉缺陷检测(Industrial Defect Detection / Visual Anomaly Detection&… · 2026/9/27 8:31:41

如何模板wordpress最佳实践
如何模板wordpress最佳实践

不懂代码也能用wordpress做站?这份速查手册帮你避坑 很多新手站长最大的顾虑就是:自己完全不懂代码,想做个网站是不是难如登天?其实不然。只要你掌握正确的方法,用WordPress模板建站根本不需要你会写一行PHP。… · 2026/9/27 8:31:29

AlgoNote 单源最短路径(一):Dijkstra 算法朴素实现与堆优化实战指南
AlgoNote 单源最短路径(一):Dijkstra 算法朴素实现与堆优化实战指南

教程文档知识库 【免费下载链接】AlgoNote ⛽️「算法通关手册」:从零开始的「算法与数据结构」学习教程,200 道「算法面试热门题目」,1000 道「LeetCode 题目解析」,持续更新中! 项目地址: https://gitcod… · 2026/9/27 8:31:10

排水管网检测手段怎么选?CCTV、声呐与管道机器人
排水管网检测手段怎么选?CCTV、声呐与管道机器人

一、先问一个问题:这次检测,管道里有多少水 排水管网检测手段的选择,第一个决定因素不是设备贵不贵,而是管内水位。同样一段管道,满水和半水状态适用的手段完全不同。把这一点先定下来,选型就成功了一半。… · 2026/9/27 9:05:00

服装公司网站怎么做才不亏?源码下载避坑全攻略
服装公司网站怎么做才不亏?源码下载避坑全攻略

服装公司网站怎么做才不亏?源码下载避坑全攻略 找建站公司最怕什么?怕被坑高价,更怕钱花出去了,手里连个像样的 源码下载 链接都拿不到,或者拿到一堆加密过的“黑盒”代码。干了十年建站,见过太多服装老板在装修完官网后,因为服务器到期、供应商跑路… · 2026/9/27 9:04:53

React Joyride v3 引导式导览完整实战指南:useJoyride Hook、Step 配置、事件系统与自定义组件
React Joyride v3 引导式导览完整实战指南:useJoyride Hook、Step 配置、事件系统与自定义组件

前端UI组件 【免费下载链接】react-joyride Create guided tours in your apps 项目地址: https://gitcode.com/gh_mirrors/re/react-joyride 点击查看 免费下载 本文是 React Joyride v3(当前仓库 react-joyride 的核心能力)的完整技术指南… · 2026/9/27 9:04:47

Jellyfin Media Player:五步装好跨平台 MPV 播放器
Jellyfin Media Player:五步装好跨平台 MPV 播放器

Jellyfin Media Player:五步装好跨平台 MPV 播放器 【免费下载链接】jellyfin-desktop Jellyfin Desktop Client 项目地址: https://gitcode.com/GitHub_Trending/je/jellyfin-desktop Jellyfin Media Player 是 Jellyfin 开源项目出品的跨平台播放桌面客户端… · 2026/9/27 9:04:47

波音网站开发避坑指南:拒绝模板,3步打造高转化官网
波音网站开发避坑指南:拒绝模板,3步打造高转化官网

波音网站开发避坑指南:拒绝模板,3步打造高转化官网 还在用那些千篇一律的模板网站?打开一看,全是“关于我们”、“产品展示”的套路,配色土气,排版僵硬,客户点进来三秒就关了。这就是典型的“模板网站太丑不够用”的痛点。很多中小企业老板在找外包做… · 2026/9/27 9:04:47

Mosquitto 1.0.2 Bugfix 发布解读:持久化恢复、CMake 安装与 db_dump 修复
Mosquitto 1.0.2 Bugfix 发布解读:持久化恢复、CMake 安装与 db_dump 修复

物联网消息队列后端 【免费下载链接】mosquitto Eclipse Mosquitto - An open source MQTT broker 项目地址: https://gitcode.com/gh_mirrors/mosquit/mosquitto 点击查看 免费下载 导读 本文围绕 Eclipse Mosquitto 1.0.2 的 bugfix 发布说明(见 ver… · 2026/9/27 9:04:41

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码