如何基于Jupyter内核自研NoteBook
简介自研NoteBook如何高效地管理 Jupyter Kernel 的生命周期、处理代码执行请求以及实现实时的消息推送是其中的核心。本文将分享一套基于微服务架构的 Jupyter 内核管理系统的设计思路和实现方案。租户Jupyter服务管理1.使用miniforge管理python的依赖包2.每个租户单独启动一个pod启动对应的jupyter服务启动命令如下/local/.miniforge3/bin/jupyter labextension disable jupyterlab/docmanager-extension:download /local/.miniforge3/bin/jupyter labextension disable jupyterlab/filebrowser-extension:download /local/.miniforge3/bin/jupyter labextension disable jupyterlab/docmanager-extension:open-browser-tab /local/.miniforge3/bin/jupyter labextension disable jupyterlab/filebrowser-extension:open-browser-tab //local/.miniforge3/bin/jupyter-lab --ServerApp.ip* --ServerApp.password --ServerApp.token --no-browser --allow-root --port8888 --NotebookApp.base_url/web/${IDE_CR_NAME}/jupyter --NotebookApp.disable_check_xsrfTrue整体架构系统采用微服务架构将功能拆分为多个独立的服务模块各司其职,核心组件职责- **Web 服务层**: 提供 REST API 和 WebSocket 服务处理前端请求管理用户会话- **Gateway 层**: 作为中间层管理内核连接池转发消息实现与 Jupyter Server 的解耦- **资源管理器**: 负责内核的路由和负载均衡决定将请求分发到哪个 Gateway 实例- **Jupyter Kernel**: 实际执行代码的计算内核一个pod部署一套jupyter服务技术选型- **后端框架**: Spring Boot- **数据持久化**: MyBatis MySQL- **实时通信**: WebSocket (JSR-356)- **消息中间件**: Redis Pub/Sub- **协议标准**: Jupyter Messaging Protocol 5.2概念解释1.Kernel (内核)Kernel 是 Jupyter 生态系统的核心它是一个独立的进程负责执行用户提交的代码。每个 Kernel 都运行在独立的进程中拥有自己的内存空间和执行环境。Kernel 的特点:- **语言特定**: 每个 Kernel 对应一种编程语言如 Python Kernel、Scala Kernel、Java Kernel 等- **状态保持**: Kernel 在运行期间会保持执行状态变量、函数、导入的模块等都会保留在内存中- **独立进程**: 每个 Kernel 都是独立的进程互不干扰一个 Kernel 崩溃不会影响其他 Kernel- **生命周期管理**: Kernel 可以被创建、启动、停止、重启和删除Kernel 的状态:- idle: 空闲状态等待执行代码- busy: 正在执行代码- starting: 正在启动中- dead: 已停止或崩溃**示例场景**:python # 在 Python Kernel 中执行 x 10 y 20 print(x y) # 输出: 30 # 变量 x 和 y 仍然保留在 Kernel 的内存中 # 后续的代码可以继续使用这些变量Session (会话)Session 在 Jupyter 中有两层含义1. **WebSocket Session**: 客户端与服务器之间的 WebSocket 连接会话2. **Jupyter Session**: Jupyter 协议中的会话标识用于关联请求和响应WebSocket Session:- **连接会话**: 前端通过 WebSocket 与后端建立的长连接- **双向通信**: 支持客户端和服务器之间的双向实时通信- **状态管理**: 每个 Session 都有唯一的标识符用于管理连接状态- **生命周期**: Session 从连接建立开始到连接关闭结束Jupyter Session:- **消息关联**: Jupyter 协议中每个消息都有一个 session 字段用于将请求和响应关联起来- **执行上下文**: 通常使用 Cell ID 作为 Session ID这样可以将执行结果与特定的代码单元关联- **消息追踪**: 通过 Session ID 可以追踪一次代码执行的所有相关消息**Session 的作用**:前端发送执行请求↓消息头中包含 session: cell-123↓Kernel 执行代码并返回结果↓响应消息中也包含相同的 session: cell-123↓前端可以根据 session 将结果匹配到对应的代码单元Cell (代码单元)**什么是 Cell**Cell 是 Notebook 中的基本组成单位是用户编写和执行代码的容器。**Cell 的类型**:- **Code Cell**: 代码单元包含可执行的代码- **Markdown Cell**: 文档单元用于编写说明文档- **Raw Cell**: 原始文本单元不会被执行**Cell 的生命周期**:创建 Cell↓编辑代码内容↓执行 Cell (发送到 Kernel)↓Kernel 执行代码↓返回执行结果↓显示结果 (输出、错误、状态等)↓保存执行历史Cell 的执行状态:- idle: 未执行或执行完成- running: 正在执行中- queued: 等待执行- error: 执行出错Cell 与 Kernel 的关系- 一个 Notebook 可以绑定一个 Kernel- 一个 Kernel 可以执行多个 Cell 的代码- Cell 的执行是顺序的但可以通过异步机制实现并发- 所有 Cell 共享同一个 Kernel 的执行环境变量、函数等**示例**:python# Cell 1import pandas as pddf pd.DataFrame({A: [1, 2, 3]})# Cell 2 (可以访问 Cell 1 中定义的变量)print(df.head()) # 输出 DataFrame 的前几行内核创建流程详解完整请求流程关键设计点内核创建接口**接口设计**:http POST /api/kernel/bind Content-Type: application/json { kernelName: python3, notebookId: notebook-uuid } **响应示例**:json { code: 0, data: { kernelId: kernel-uuid, status: idle } } 2.2.2 内核规格查询系统支持查询可用的内核类型前端可以根据此信息展示内核选择界面http GET /api/kernel/specs 返回所有已注册的内核规格包括 Python、Scala、Java 等。Session 管理机制3.1 双层 Session 架构系统采用双层 Session 管理将用户会话和内核会话分离3.1.1 用户级 WebSocket Session**连接端点**: ws://host/api/user/{userId}**职责**:- 用户级别的消息推送通道- 接收前端发送的业务请求- 通过 Redis Pub/Sub 接收系统推送的消息**Session 管理**:java// 使用线程安全的 Map 存储活跃的 WebSocket Sessionprivate static final MapString, Session SESSIONS_MAP new ConcurrentHashMap();// 在线用户计数private static final AtomicInteger ONLINE_COUNT new AtomicInteger(0);**关键特性**:- **自动订阅**: 连接建立时自动订阅用户专属的 Redis Channel- **心跳检测**: 支持心跳机制保持连接活跃- **优雅关闭**: 连接关闭时自动清理资源和监听器#### 3.1.2 内核级 WebSocket Session**连接端点**: ws://host/api/kernel/{kernelId}**职责**:- 内核级别的消息推送通道- 接收内核执行结果的实时推送- 每个内核有独立的订阅通道Gateway 层连接池管理Gateway 层维护一个 WebSocket 连接池管理所有与 Jupyter Kernel 的连接Service public class WebSocketPool { // 内核ID - WebSocket连接的映射 private final static MapString, WebSocketConnection connectionMap new ConcurrentHashMap(); public void addConnection(String kernelId, WebSocketConnection connection) { connectionMap.put(kernelId, connection); } public WebSocketConnection getConnection(String kernelId) { return connectionMap.get(kernelId); } public static void removeConnection(String kernelId) { connectionMap.remove(kernelId); }核心 API 设计内核管理 API| /api/kernel/specs | GET | 获取可用内核列表 || /api/kernel/list | GET | 获取运行中的内核列表 || /api/kernel/bind | POST | 创建并绑定内核到 Notebook || /api/kernel/delete | DELETE | 删除内核 |代码执行 API| /api/cell/add | POST | 添加新的代码单元 || /api/cell/save | POST | 保存代码单元内容 || /api/cell/run | POST | 执行代码单元 || /api/cell/result | GET | 获取执行结果 |Gateway 层 API| /api/gateway/kernel/create | POST | 创建内核实例 || /api/gateway/kernel/connect | POST | 建立 WebSocket 连接 || /api/gateway/message/send | POST | 发送代码执行请求 || /api/gateway/kernel/status | GET | 检查内核状态 |连接池管理Gateway 层维护 WebSocket 连接池避免重复创建连接java WebSocketConnection connection pool.getConnection(kernelId); if (connection null) { connection new WebSocketConnection(kernelId, endpoint); pool.addConnection(kernelId, connection); }

相关新闻

【无功优化】“碳中和”目标下电气互联系统有功-无功协同优化模型附Matlab代码

【无功优化】“碳中和”目标下电气互联系统有功-无功协同优化模型附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/8 23:51:43 阅读更多 →
有可能我已经彻底解决了自动化异常停止

有可能我已经彻底解决了自动化异常停止

因为如果打开的动作没有响应,就会导致发生异常,后面的自动打开代码全都会被跳过--------------------这就能解释:明明我有自动检测的部分,为什么没有效果。现在应该是正常了--------概率70%-----------------------意思就是&#…

2026/8/8 23:51:43 阅读更多 →
【无人机三维路径规划】基于多目标粒子群算法和多目标灰狼算法实现低空无人机给定动态约束、避障要求和起止点规范条件下,找到总转向角与相对高度波动最小的路径附Matlab代码

【无人机三维路径规划】基于多目标粒子群算法和多目标灰狼算法实现低空无人机给定动态约束、避障要求和起止点规范条件下,找到总转向角与相对高度波动最小的路径附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/8 23:51:43 阅读更多 →

最新新闻

告别“设备被占用“烦恼:USB-Disk-Ejector强力解决Windows弹出难题

告别“设备被占用“烦恼:USB-Disk-Ejector强力解决Windows弹出难题

告别"设备被占用"烦恼:USB-Disk-Ejector强力解决Windows弹出难题 【免费下载链接】USB-Disk-Ejector A program that allows you to quickly remove drives in Windows. It can eject USB disks, Firewire disks and memory cards. It is a quick, flexib…

2026/8/9 14:33:51 阅读更多 →
简单三步,让老Mac重获新生:OpenCore Legacy Patcher完整指南

简单三步,让老Mac重获新生:OpenCore Legacy Patcher完整指南

简单三步,让老Mac重获新生:OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 嘿,朋友&…

2026/8/9 14:33:51 阅读更多 →
SRC漏洞挖掘实战:从基础到高阶技巧

SRC漏洞挖掘实战:从基础到高阶技巧

1. SRC漏洞挖掘入门指南:从零基础到实战精通十年前我刚接触安全测试时,连最简单的XSS漏洞都发现不了。现在回头看,那些看似复杂的漏洞挖掘其实都有清晰的路径可循。这篇文章将把我这些年从甲方乙方、从漏洞平台到企业内网积累的实战经验&…

2026/8/9 14:33:51 阅读更多 →
联想设备微信客服接入与高效沟通指南

联想设备微信客服接入与高效沟通指南

1. 联想设备微信客服接入指南 作为联想设备的老用户,我深知遇到硬件问题时找不到官方客服的焦虑。上周我的ThinkPad突然无法充电,在尝试了官网400电话、在线客服排队后,意外发现微信客服的高效解决方案。本文将详细拆解联想全系设备&#xff…

2026/8/9 14:33:51 阅读更多 →
Java实现汉诺塔:递归与迭代算法详解

Java实现汉诺塔:递归与迭代算法详解

1. 汉诺塔问题背景与规则解析 汉诺塔(Tower of Hanoi)是法国数学家爱德华卢卡斯在1883年提出的经典数学难题。这个看似简单的游戏背后蕴含着深刻的递归思想,成为计算机科学中讲解递归概念的经典案例。 游戏由三根柱子和若干个大小不一的圆盘…

2026/8/9 14:33:51 阅读更多 →
从绿色工厂到零碳工厂:智碳能碳管理平台衔接路径与五家方案比较

从绿色工厂到零碳工厂:智碳能碳管理平台衔接路径与五家方案比较

从绿色工厂到零碳工厂:智碳能碳管理平台衔接路径与五家方案比较青岛智碳未来 智碳能碳管理平台摘要:智碳能碳管理平台在"绿色→零碳"梯度中的价值,在于**不把绿色工厂申报当作终点**——首次评价形成的组织边界、能耗台账、碳盘查…

2026/8/9 14:32:51 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →