ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Perspective Server-only 架构实战:面向超大数据集的虚拟表服务端渲染方案

Perspective Server-only 架构实战:面向超大数据集的虚拟表服务端渲染方案 Perspective Server-only 架构实战面向超大数据集的虚拟表服务端渲染方案【免费下载链接】perspectiveA data visualization and analytics component, especially well-suited for large and/or streaming datasets.项目地址: https://gitcode.com/GitHub_Trending/pe/perspective导读Perspective 提供三种部署架构Client-only、Client/Server replicated 与 Server-only。本文聚焦Server-only纯服务端架构——这是 Perspective 为数据集极大、并发用户少的场景设计的部署模式数据集完整驻留在 Python 或 Node.js 服务端内存中浏览器通过 WebSocket 以虚拟表方式连接无需下载任何数据。读完本文你将掌握 Server-only 架构的适用边界、性能权衡、JavaScript 客户端接入代码、Node.js/Python 服务端搭建方法并理解它与另外两种架构的选型依据。一、什么是 Server-only 架构Server-only 是 Perspective 三种官方架构之一对应文档 docs/md/explanation/architecture/server_only.md。它的定位一句话即可概括For extremely large datasets with a small number of concurrent users.面向极大数据集与少量并发用户在该架构下数据集由 Python 或 Node.js 服务端在内存中实例化Web 应用通过虚拟连接connect virtually访问它。浏览器端不再创建本地 WebAssembly 引擎与本地Table而是持有一个指向服务端Table的引用所有数据与计算都发生在服务端。从架构图对应的 DOT 源文件 可以读出完整数据流服务端Python Server 内的PerspectiveManager线程持有table(df)并派生view({group_by: [State]})浏览器端WebWorker 2 中有一个table(...)服务端 view 以虚线color#D1A043styledashedpenwidth2连接到它代表虚拟表引用而非数据拷贝UI 层view再连接到perspective-viewer组件此处示例配置了viewheatmap、row-pivots[State]、column-pivots[Segment]。三个层次的连接全部是虚线恰如其分地表达了 Server-only 的本质浏览器端没有任何数据实体只有指向服务端对象的引用。二、核心优势零下载与列并行计算2.1 极佳的初始加载性能由于没有任何数据下载到浏览器Server-only 架构的初始加载性能非常好。即使数据集达到 GB 级别页面也能瞬间呈现因为传输的只是 WebSocket 上的控制消息与查询结果而非全量数据。2.2 列并行计算column-parallel文档明确说明Group-by and other operations will run column-parallel if configured.分组等操作在配置后将按列并行执行。这与服务端运行时直接相关PerspectiveTornadoHandler的源码注释指出Python 运行时utilizes Apache Arrow internal threadpools for threading and parallel processing利用 Apache Arrow 内部线程池进行线程化与并行处理并generates architecture optimized code因此从服务端运行时角度看Python 目前比 Node.js 更适合承担服务端计算见 tornado.py 第 100-109 行的论述。2.3 不使用 WebAssemblyServer-only 架构在浏览器端不使用 WebAssembly。这意味着对浏览器内存和 CPU 的占用极小——浏览器不需要下载几十 MB 的 wasm 引擎也不需要在本地复制数据集。相应地它也不要求浏览器支持 wasm 计算环境。三、关键代价交互性能与网络强耦合3.1 交互性能受制于网络往返Server-only 最大的短板是交互性能差every user interaction must page the server to render——每一次用户交互滚动、翻页、切换视图都必须向服务端发起请求来渲染。滚动等操作响应不够流畅且直接受网络延迟影响。3.2 Web 应用必须永远在线Web 应用必须通过 WebSocket 与服务端保持常连。一旦断开连接UI 的一切交互滚动等都会失效。这带来部署上的硬约束任何断连重连逻辑、负载均衡会话保持、服务端健康检查都必须纳入架构设计。3.3 连接数即性能瓶颈限制横向扩展Each connected browser will impact server performance as long as the connection is open——每个保持打开的浏览器连接都会持续消耗服务端资源进而拖慢所有客户端的交互响应。这一特性最终限制了该架构的横向可扩展性当并发连接数上升时服务端成为单点瓶颈。因此文档强调它只适合少量并发用户a small number of concurrent users的场景。3.4 数据一致性红利更新自动同步并持久作为补偿由于每个客户端都是虚拟读取服务端同一个Table编辑与更新等数据变更会自动反映到所有已连接的客户端并且在浏览器刷新后依然保持——数据只存在服务端一份天然具备单一事实来源single source of truth特性。四、JavaScript 客户端接入把虚拟表直接交给 load()文档给出了 Server-only 架构下perspective-viewer的完整接入代码。与 Client/Server replicated 架构 相比关键差异在于跳过中间层 WebAssemblyTable把虚拟表直接传给load()const websocket await perspective.websocket(ws://localhost:8080); const server_table await websocket.open_table(my_table); const viewer document.createElement(perspective-viewer); document.body.appendChild(viewer); await viewer.load(server_table);逐行拆解代码作用perspective.websocket(ws://localhost:8080)创建 WebSocket 客户端绑定到服务端 WebSocket 地址websocket.open_table(my_table)打开服务端已存在的命名表返回一个虚拟 Tabletable与view对象实际都驻留在服务端viewer.load(server_table)让perspective-viewer直接加载该虚拟表本地不产生数据拷贝如果换成 Client/Server replicated 架构同样的连接代码之后会多出一步复制const client_table await worker.table(server_view);再load(client_table)见 client_server.md。Server-only 恰恰省去了这一步——这是两种架构在代码层面最直观的差异。五、服务端实现Node.js 与 Python5.1 Node.js 端WebSocketServerNode.js 侧使用perspective-dev/client包提供的WebSocketServer。以下示例来自 docs/md/how_to/javascript/nodejs_server.mdconst { WebSocketServer, table } require(perspective-dev/client); const fs require(fs); // 在 8080 端口启动 WS/HTTP 宿主assets 属性允许 // WebSocketServer() 同时托管以该模块目录为根的文件结构。 const host new WebSocketServer({ assets: [__dirname], port: 8080 }); // 从文件系统读取 arrow 文件并托管为命名表。 const arr fs.readFileSync(__dirname /superstore.lz4.arrow); await table(arr, { name: table_one });浏览器端则通过open_table(table_one)绑定到这份预加载数据详见该文档第 27-37 行的 Client 实现。该文档同样点明了这一取舍的本质用网络带宽与服务端资源开销换取更小的浏览器内存与 CPU 占用。5.2 Python 端ServerPerspectiveTornadoHandlerPython 端在 Server/Client replicated 文档 中给出了 Tornado 服务器的搭建方式同一套服务端代码同样可以服务 Server-only 客户端from perspective import Server, PerspectiveTornadoHandler server Server() client server.new_local_client() client.table(csv, namemy_table) routes [( r/websocket, perspective.handlers.tornado.PerspectiveTornadoHandler, {perspective_server: server}, )] app tornado.web.Application(routes) app.listen(8080) loop tornado.ioloop.IOLoop.current() loop.start()围绕 PerspectiveTornadoHandler 源码第 113-159 行有几个对 Server-only 部署至关重要的实现细节本质PerspectiveTornadoHandler是perspective.ServerAPI 的 Tornado WebSocket 处理器为perspective-viewer等 JavaScriptWasmClient提供到服务端资源的虚拟接口大数据集参数源码明确提示处理大数据集时可能需要调大tornado.web.Application构造函数的websocket_max_message_size参数并传入max_buffer_size可选参数安全边界务必注意该处理器是参考集成不包含认证、授权、来源校验check_origin直接返回True或限流not safe to expose to untrusted networks不适合暴露到不可信网络。在 Server-only 这种服务端持有全量数据的架构下安全边界尤其重要——服务端就是数据本身线程模型构造函数接受可选的loopIOLoop 实例与executor用于调度来自 WebSocket 客户端的perspective.Server消息处理。六、Server-only 与虚拟服务器机制的关系理解 Server-only有必要连带理解 Perspective 的Virtual Server虚拟服务器机制二者共享虚拟访问的思想。官方 虚拟服务器概念文档 定义Virtual Server 允许 Perspective 查询外部数据源如 DuckDB、ClickHouse而不把整个数据集载入 Perspective 内置引擎。Perspective 将自身的查询操作group by、sort、filter 等翻译为外部数据源可原生执行的查询仅传输当前视图所需的数据。在源码层面rust/perspective-js/src/ts/virtual_server.ts 中的createMessageHandler展示了虚拟服务器与客户端之间的协议桥接worker 收到init命令时构造VirtualServer(handler)之后所有请求字节经virtualServer.handleRequest()处理并以 transferable buffer 回传。VirtualServerHandler接口、Features结构体均在 Rust 侧声明perspective-js的virtual_server.rs与perspective-client的features.rs并在该 TS 模块中重导出。对 Server-only 架构而言两个概念的分工是Server-only描述的是数据驻留服务端、浏览器虚拟连接的整体部署形态Virtual Server描述的是通过 handler 把查询翻译给外部引擎的数据接入方式——它可以运行在服务端也可以借助 wasm 引擎如duckdb/duckdb-wasm完全跑在浏览器内。两者叠加的典型形态是Python/Node.js 服务端通过虚拟服务器 handler 对接 DuckDB/ClickHouse浏览器再以 Server-only 方式虚拟连接该服务端形成浏览器 → Perspective 服务端 → 外部数据库的完整链路且任意一层都不复制全量数据。七、三种架构横向对比与选型建议维度Client-onlyClient/Server replicatedServer-only本文适用场景静态/用户提供的数据集、无服务端只读应用中等规模、实时同步/可编辑数据、多并发用户极大数据集、少量并发用户数据位置全部下载到浏览器wasm服务端一份 浏览器副本Arrow 同步增量仅服务端一份初始加载需下载全量数据需下载初始数据集零下载极快交互性能很好本地 wasm WebWorker很好客户端本地计算较差每次交互都要回服务端渲染网络依赖加载后无需连接WebSocket 同步增量必须常连 WebSocket断连即无法交互横向扩展无并发状态天然可扩展随用户数扩展良好受连接数限制扩展性差更新/编辑本地化刷新即丢失跨客户端同步自动同步到所有客户端且刷新持久WebAssembly使用客户端使用不使用选型建议综合三份架构文档的表述数据集极大如 1GB Arrow、并发用户少、对初始加载速度要求苛刻 →Server-only数据规模中等、需要多用户实时协同编辑、浏览器端交互必须流畅 →Client/Server replicated数据集可直接交给用户浏览器、无需服务端、追求极致交互体验 →Client-only官方文档甚至指出 1GB 的 Arrow 数据在客户端也能获得良好交互性能。八、结论Server-only 是 Perspective 架构家族中以服务端资源换取浏览器资源的极端方案它把数据与计算全部收敛到服务端用零下载换来极佳的初始加载体验代价是交互必须经过网络往返、连接数直接制约扩展性。它的正确打开方式是超大数据集 少量并发用户 可接受网络往返延迟并通过虚拟表机制天然获得编辑即全员可见、刷新不丢失的数据一致性。若你的场景开始出现大量并发用户官方给出的演进路径非常清晰——迁移到 Client/Server replicated 架构让浏览器分担交互计算服务端只负责同步增量。延伸阅读仓库内架构总览与三种模式的完整对比client_only.md、client_server.md服务端实现示例Node.js WebSocketServer、Python Tornado 教程虚拟服务器机制virtual_servers.md、虚拟服务器 TS 桥接源码、Tornado handler 源码【免费下载链接】perspectiveA data visualization and analytics component, especially well-suited for large and/or streaming datasets.项目地址: https://gitcode.com/GitHub_Trending/pe/perspective创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表