Next-generation Jupyter kernel management with decoupled client connections
Project description
nextgen-kernels-api
A next-generation Jupyter kernel client architecture that enables shared kernel connections and centralized message routing.
Motivation
In the upstream Jupyter Server implementation, each WebSocket connection establishes its own set of ZMQ sockets to the kernel:
graph LR
WS1[WebSocket 1] --> ZMQ1[ZMQ Client 1]
WS2[WebSocket 2] --> ZMQ2[ZMQ Client 2]
WS3[WebSocket 3] --> ZMQ3[ZMQ Client 3]
ZMQ1 --> K[Kernel]
ZMQ2 --> K
ZMQ3 --> K
Problems:
- Resource overhead: Multiple redundant ZMQ connections per kernel
- State fragmentation: No centralized view of kernel execution state
- Lost messages: No way to route kernel messages to server-side consumers (YDocs, etc.)
Architecture
This project introduces a Client Registry that manages a single shared kernel client per kernel:
graph TB
subgraph Consumers
WS1[WebSocket 1]
WS2[WebSocket 2]
WS3[WebSocket 3]
YD[YDoc / Server Documents]
end
subgraph "Client Registry"
KC[Shared Kernel Client]
end
WS1 -->|register as listener| KC
WS2 -->|register as listener| KC
WS3 -->|register as listener| KC
YD -.->|route messages directly| KC
KC <-->|single ZMQ connection| K[Kernel]
style YD stroke-dasharray: 5 5
Client Lifecycle
sequenceDiagram
participant WS as WebSocket
participant CR as Client Registry
participant KC as Kernel Client
participant K as Kernel
WS->>CR: WebSocket connects
CR->>CR: get_or_create_client(kernel_id)
CR->>KC: add_listener(websocket_callback)
KC-->>WS: broadcast current state
par Background Connection
CR->>K: wait for kernel ready
CR->>KC: connect channels
KC->>K: test communication
KC->>KC: mark connection ready
KC->>KC: process queued messages
end
WS->>KC: send message to kernel
K-->>KC: kernel response
KC-->>WS: route to all listeners
KC-->>YD: route to YDoc (if registered)
Key Design Principles
- Single Client per Kernel: One shared ZMQ connection per kernel, used by all consumers
- Listener Pattern: WebSockets and server-side components register as message listeners
- Centralized State: Track execution state, activity, and lifecycle from one place
- Message Queuing: Queue messages during startup, deliver when connection ready
- Server-Side Routing: Enable direct message flow to YDocs for accurate state tracking
Features
- Shared Kernel Client: Single ZMQ connection per kernel, shared across all consumers
- Message Listener API: Register callbacks to receive kernel messages from all channels
- Connection Management: Robust connect/disconnect/reconnect with health checks
- State Tracking: Monitor execution state (
idle,busy,starting) via status messages - Message Queuing: Queue messages during connection setup, deliver when ready
- Message Cache: Track outgoing requests and map responses to source channels
Integration with Jupyter Server Documents
This architecture is designed to work seamlessly with jupyter-server-documents, enabling server-side YDocs to receive kernel messages directly:
Benefits:
- Accurate execution state: YDoc always knows if kernel is busy/idle
- No lost outputs: Cell outputs flow directly to YDoc, even if no WebSocket connected
- Real-time collaboration: All clients (WebSockets + YDoc) see kernel state simultaneously
To integrate, simply register the YDoc as a listener on the shared kernel client:
# In your YDoc initialization
client_registry = app.settings["client_registry"]
client = client_registry.get_client(kernel_id)
client.add_listener(ydoc.handle_kernel_message)
Installation
pip install nextgen-kernels-api
Enable the extension:
jupyter server extension enable nextgen_kernels_api
This extension will automatically override the default Jupyter Server kernel APIs when the server starts.
License
BSD-3-Clause
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nextgen_kernels_api-0.2.0.tar.gz.
File metadata
- Download URL: nextgen_kernels_api-0.2.0.tar.gz
- Upload date:
- Size: 21.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d9b24aa165a9e1c5d173cdf03363d8adaf7a0c68d8005f14e5a3be52f31c622
|
|
| MD5 |
e94dbcb35402c7e2ae319d466368dc9f
|
|
| BLAKE2b-256 |
fd1f8620089d66ef4ac1bed28fa6340e493ae16a0f1c10e4b9f9f8665555e543
|
File details
Details for the file nextgen_kernels_api-0.2.0-py3-none-any.whl.
File metadata
- Download URL: nextgen_kernels_api-0.2.0-py3-none-any.whl
- Upload date:
- Size: 25.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c66479bf6eab69a74eeca20b12456cf76a97f88b22627d8d8f1138b4805746d
|
|
| MD5 |
175d7012517194f2eb51ae75fa8f367b
|
|
| BLAKE2b-256 |
416e58f7682430b54fbadbba39eaedf9c18292f0a3d48c7ac5bc36c2e345ba8c
|