尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Project NOMAD实时推送实现:Redis与Transmit中间件如何协作

Project NOMAD实时推送实现:Redis与Transmit中间件如何协作 Project NOMAD实时推送实现Redis与Transmit中间件如何协作【免费下载链接】project-nomadProject NOMAD is an offline-first knowledge and education server. Wikipedia, thousands of books, courses, maps, and optional local AI, all running on hardware you own with no internet required.项目地址: https://gitcode.com/GitHub_Trending/pr/project-nomadProject NOMAD 是一个离线优先的知识与教育服务器Wikipedia、书籍、课程、地图与本地 AI 全部运行在你自己的硬件上。要让用户实时看到服务安装进度、跑分遥测、模型下载状态它用AdonisJS Transmit Redis搭出了一条从后端到浏览器的实时推送管道。这篇文章带你快速看懂这套实时推送机制的协作方式。为什么 Project NOMAD 需要实时推送 离线服务器里有很多长任务安装一个容器服务可能持续几分钟跑一次性能基准测试要逐阶段产出数据下载 AI 模型则以 GB 计。如果靠页面轮询进度既迟钝又浪费请求。因此 NOMAD 把以下事件都接入了实时通道定义在 admin/constants/broadcast.ts频道用途service-installation容器安装/停止/更新的活动流service-updates服务更新可用通知benchmark-progress/benchmark-telemetry性能基准的阶段与遥测数据ollama-model-download本地 AI 模型下载进度实时推送三大部件1. Redis 作为传输层一个配置文件搞定Transmit 本身是 AdonisJS 的实时 WebSocket 组件真正承载消息的是 Redis。整个传输层配置只有十几行位于 admin/config/transmit.ts使用redis传输驱动连接地址、端口、库号全部来自环境变量所有消息键统一加前缀transmit:避免键名冲突pingInterval: 30s保持连接心跳也就是说Transmit 负责怎么说WebSocket 协议Redis 负责怎么传消息队列与发布订阅两者解耦后可独立扩容。2. 注册实时路由在 admin/start/routes.ts 中只有一行transmit.registerRoutes()就为应用挂载了 WebSocket 升级、订阅与鉴权所需的 HTTP 路由。浏览器之后所有实时交互都走这里。3. 频道常量集中管理所有频道名集中在 admin/constants/broadcast.ts 中前后端共用同一份定义前端在 admin/inertia/constants 处按相同常量引用从源头上杜绝了拼错频道名导致订阅失效这类问题。后端如何推送以容器安装为例 当 Docker 服务执行安装、停止、迁移等操作时会通过私有方法_broadcast向service-installation频道广播事件实现见 admin/app/services/docker_service.ts。每条事件包含四要素service_name—— 是哪个服务如 Kiwix、Ollamastatus—— 阶段状态initializing、recreating、update-rollback等message—— 人类可读的进度描述timestamp—— 事件发生时间同时调用logger.info落盘一份日志推送给用户与记录到日志两条线并行。性能基准的遥测推送同理admin/app/services/benchmark_telemetry.ts 在每轮采样后调用transmit.broadcast把指标推给前端。前端如何接收React Hook 三行订阅 ⚡前端入口在 admin/inertia/app/app.tsx整个 React 应用被TransmitProvider包裹页面加载即与服务器建立 WebSocket 长连接。之后任何组件只需一个 Hook 就能订阅频道典型如安装活动流 admin/inertia/hooks/useServiceInstallationActivity.tssubscribe(channel, callback)订阅service-installation每收到一条事件就追加到活动列表状态中组件卸载时unsubscribe()自动断开页面里的安装活动信息流组件admin/inertia/components/InstallActivityFeed.tsx消费这个 Hook于是后端每执行一步浏览器就即时滚动出一行新的进度全程零轮询。同样的模式也复用在模型下载进度admin/inertia/hooks/useOllamaModelDownloads.ts与基准测试实时读屏admin/inertia/hooks/useBenchmarkRun.ts等场景中——一套机制处处复用。完整链路总结 ✅把整条管道串起来Project NOMAD 的实时推送只有五步后端业务服务如 DockerService调用transmit.broadcast(频道, 事件)Transmit 经 Redis 传输层发布消息键前缀transmit:Redis 将消息投递给所有已订阅的 WebSocket 连接浏览器端TransmitProvider维持长连接并接收消息React Hook 的subscribe回调更新组件状态界面即时刷新Redis 保证多进程/多节点下消息不丢失、可扩展Transmit 屏蔽了 WebSocket 的协议细节——这正是 NOMAD 能让一个离线服务器拥有在线产品般实时体验的关键设计。如果你想深入前端实时交互可以顺着 admin/inertia/hooks 目录继续浏览各个订阅 Hook想了解整体能力可参考 README.md 与 admin/docs 目录下的官方文档。【免费下载链接】project-nomadProject NOMAD is an offline-first knowledge and education server. Wikipedia, thousands of books, courses, maps, and optional local AI, all running on hardware you own with no internet required.项目地址: https://gitcode.com/GitHub_Trending/pr/project-nomad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表