利用DeepSeek实现服务器客户端模式的DuckDB原型

在网上看到韩国公司开发的一款GooseDB,DuckDB™ 的功能扩展分支,具有服务器/客户端、多会话和并发写入支持,使用 PostgreSQL 有线协议,但它是Freeware而不是开源,所以让DeepSeek实现之。
首先把readme页面发给他翻译,并让他据此写一个设计方案,看上去头头是道。

GooseDB:为协同数据分析而强化的DuckDB
GooseDB是基于DuckDB的强大功能扩展版本,旨在将协同数据分析提升至新高度。
在继承DuckDB卓越速度与分析能力的基础上,GooseDB针对现代数据工作流引入了关键增强功能,
包括服务器/客户端架构、多会话支持和并发写入能力,同时全面兼容强大的PostgreSQL有线协议。

核心特性:
• 服务器/客户端架构:GooseDB将DuckDB升级为真正的客户端-服务器数据库,允许多用户同时连接并交互同一数据库实例,
为协同数据探索与分析开辟了新可能。
• 多会话支持:通过支持多并发会话,团队可并行处理同一数据,优化工作流程并促进协作。
• 并发写入能力:与原生DuckDB不同,GooseDB支持并发写入,在保持高性能的同时实现实时数据更新与注入,
这对需要持续数据更新的应用至关重要。
• PostgreSQL有线协议:采用广泛使用的PostgreSQL有线协议,确保与现有数据库工具、客户端及库生态系统的无缝集成,
降低了熟悉PostgreSQL用户的学习成本。
• 增强的性能:保留DuckDB在分析查询方面的卓越性能,即使处理复杂数据集也能提供极速响应。
• 与现有DuckDB生态无缝集成:保持与现有DuckDB API及数据格式的兼容性,用户可轻松迁移现有项目。

使用优势:
• 强化协作:支持团队实时协同进行数据分析项目。
• 改进数据管理:通过并发写入支持简化数据注入与更新流程。
• 简化集成:利用PostgreSQL协议与现有工具无缝对接。
• 提升效率:借助更快的查询性能和协作工作流提高生产力。
• 可扩展性:通过改进的并发与服务器架构处理更大数据集和复杂工作负载。

适用场景:
• 协同数据科学:助力数据科学团队共同开展数据探索、模型开发与分析。
• 实时数据分析:为需要即时洞察的应用提供实时数据注入与分析能力。
• 商业智能:为业务用户提供强大的协同数据分析与报告平台。
• 数据仓库:构建支持并发写入和大数据集的高性能数据仓库。


软件设计方案(基于技术文档特性提炼)

1. 架构设计

  • 客户端-服务器模型:采用多线程服务器架构,通过TCP/IP协议监听客户端连接,使用PostgreSQL有线协议实现通信规范化
  • 连接池管理:实现会话管理器(Session Manager)维护多用户连接状态,支持会话隔离和资源分配
  • 并发控制层
    • 写操作:通过行级锁+多版本并发控制(MVCC)实现并发写入与数据一致性
    • 读操作:支持无锁快照读,兼容DuckDB原有向量化执行引擎

2. 核心模块

┌─────────────────────────────────┐  
│          Client Applications    │  
└─────────────────────────────────┘  │  
┌─────────────────────────────────┐  
│   PostgreSQL Wire Protocol Layer│  
│   (协议解析/消息序列化)         │  
└─────────────────────────────────┘  │  
┌─────────────────────────────────┐  
│   Session Manager              │  
│   (会话状态/查询路由)           │  
└─────────────────────────────────┘  │  
┌─────────────────────────────────┐  
│   Concurrency Controller       │  
│   (锁管理/MVCC协调)            │  
└─────────────────────────────────┘  │  
┌─────────────────────────────────┐  
│   DuckDB Execution Engine      │  
│   (优化器/向量化执行)           │  
└─────────────────────────────────┘  │  
┌─────────────────────────────────┐  
│   Storage Layer                │  
│   (数据持久化/索引管理)         │  
└─────────────────────────────────┘  

3. 关键技术实现

  • 协议适配层:基于libpq或自定义实现PostgreSQL报文解析,兼容常用SQL命令和扩展命令
  • 内存管理:扩展DuckDB的内存分配机制,支持多会话内存隔离与全局内存配额
  • 持久化策略
    • 数据文件格式保持与DuckDB兼容
    • 预写日志(WAL)支持并发写入崩溃恢复
  • 扩展语法支持:增加服务端专属命令(如SHOW_SESSIONS)并通过协议层封装传输

4. 性能优化方向

  • 连接建立:采用异步I/O模型处理高并发连接请求
  • 查询处理:复用DuckDB向量化执行引擎,增加分布式查询规划器扩展
  • 缓存机制:实现服务端结果集缓存,支持重复查询快速响应

5. 安全设计

  • 基于PostgreSQL协议的SSL加密传输
  • 角色权限管理系统(兼容DuckDB原有权限模型)
  • SQL注入防护通过协议层参数化查询实现

此设计方案聚焦协议兼容性、并发扩展和生态集成三大核心目标,在保持DuckDB性能优势的同时实现服务化能力升级。

于是,先让他实现第一部分

请用duckdb C API实现一个Demo。先实现客户端-服务器模型:采用多线程服务器架构,通过TCP/IP协议监听客户端连接,使用PostgreSQL有线协议实现通信规范化,不做别的

他给出了一个c服务端程序和一个python客户端程序。我的机器安装psycopg2失败,于是直接用postgresql客户端psql连接。

他的知识库里的duckdb版本较旧,说是0.9.0+, 其实有的数据结构还是更旧的。
比如duckdb_result结构,libduckdb 0.9.2的定义是这样的:

typedef struct {
#if DUCKDB_API_VERSION < DUCKDB_API_0_3_2idx_t column_count;idx_t row_count;idx_t rows_changed;duckdb_column *columns;char *error_message;
#else// deprecated, use duckdb_column_countidx_t __deprecated_column_count;// deprecated, use duckdb_row_countidx_t __deprecated_row_count;// deprecated, use duckdb_rows_changedidx_t __deprecated_rows_changed;// deprecated, use duckdb_column_ family of functionsduckdb_column *__deprecated_columns;// deprecated, use duckdb_result_errorchar *__deprecated_error_message;
#endifvoid *internal_data;
} duckdb_result;

而libduckdb 1.3.2变成了这样:

//! A query result consists of a pointer to its internal data.
//! Must be freed with 'duckdb_destroy_result'.
typedef struct {// deprecated, use duckdb_column_countidx_t deprecated_column_count;// deprecated, use duckdb_row_countidx_t deprecated_row_count;// deprecated, use duckdb_rows_changedidx_t deprecated_rows_changed;// deprecated, use duckdb_column_*-family of functionsduckdb_column *deprecated_columns;// deprecated, use duckdb_result_errorchar *deprecated_error_message;void *internal_data;
} duckdb_result;

而他就引用了column_count、row_count这些成员。于是替换成了带deprecated_前缀的版本。编译通过了。
服务器端

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:libduckdb
gcc goose2.c -o goose2 -I libduckdb -L libduckdb -lduckdb -lpthread
root@6ae32a5ffcde:/par# ./goose2
GooseDB server listening on port 5432
You can connect using: psql -h 127.0.0.1 -U any_user -d any_db -p 5432
Note: Username and database name are logged but not used for authentication
New connection from 127.0.0.1:34146
Client connected on socket 4

客户端

psql -h 127.0.0.1 -U any_user -d any_db -p 5432
^C

只能显示连接,而不能取到数据。看来需要进一步研究。
经过几轮交互,现在进展到这一步了。

服务端, 其中对应psql连接,PGSSLMODE=disable前是127.0.0.1:58912,后是127.0.0.1:39740

root@6ae32a5ffcde:/par# ./goose3
GooseDB server listening on port 5432
You can connect using: psql -h 127.0.0.1 -U any_user -d any_db -p 5432
Note: Username and database name are logged but not used for authentication
New connection from 127.0.0.1:58912
Client connected on socket 4
已打开DuckDB数据库
已连接DuckDB数据库
Received startup message, length: 8
已读取启动消息
New connection from 127.0.0.1:39740
Client connected on socket 5
已打开DuckDB数据库
已连接DuckDB数据库
Received startup message, length: 87
Connection parameters: user=any_user, database=any_db
已读取启动消息

客户端

psql -h 127.0.0.1 -U any_user -d any_db -p 5432
psql: error: connection to server at "127.0.0.1", port 5432 failed: received invalid response to SSL negotiation:export PGSSLMODE=disable
psql -h 127.0.0.1 -U any_user -d any_db -p 5432
psql: error: connection to server at "127.0.0.1", port 5432 failed: message contents do not agree with length in message type "S"
lost synchronization with server: got message type "i", length 1869479985

又改了一版

gcc goose4.c -o goose4 -I libduckdb -L libduckdb -lduckdb -lpthread
./goose4
GooseDB server listening on port 5432
You can connect using: psql -h 127.0.0.1 -U any_user -d any_db -p 5432
Note: Username and database name are logged but not used for authentication
New connection from 127.0.0.1:39146
Client connected on socket 4
已打开DuckDB数据库
已连接DuckDB数据库
Received startup message, length: 79
Received normal startup message
Connection parameters: user=, database=
已读取启动消息
Message too large: 4207 bytes, buffer size: 4096
Unknown message type: e

客户端

export PGSSLMODE=disable
psql -h 127.0.0.1 -U abc -d def -p 5432
psql (15.13 (Debian 15.13-0+deb12u1), server 14.0)
Type "help" for help.def=> select 1 a;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96944.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麦当劳APP逆向

版本 V 7.0.17.0反调试 梆梆企业加固 frida反调试部分代码 headers {"biz_scenario": "500","biz_from": "1004","User-Agent": "mcdonald_Android/7.0.17.0 (Android)","ct": "102","…

大数据毕业设计选题推荐-基于大数据的结核病数据可视化分析系统-Hadoop-Spark-数据可视化-BigData

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

Vue3 视频播放器完整指南 – @videojs-player/vue 从入门到精通

前言 在 Vue 3 生态中&#xff0c;视频播放功能是许多应用的核心需求。videojs-player/vue 是一个专门为 Vue 3 设计的视频播放器组件&#xff0c;基于成熟的 Video.js 库构建&#xff0c;提供了简单而强大的视频播放解决方案。 主要特性 Vue 3 组件化&#xff1a;原生 Vue …

【靶场练习】--DVWA第一关Brute Force(暴力破解)全难度分析

注意&#xff0c;这一关必须要使用Burpsuite来抓包 目录Low1.抓包2.发送到爆破模块3.选择爆破模式爆破模式介绍4.添加载荷5.添加字典6.爆破查看查看源码Medium查看源码High1.抓包2.在bp的extensions中找到CSRF Token Tracker&#xff0c;并安装3.构造字典4.成功爆破查看源码Imp…

Java语言——排序算法

一、基本概念排序&#xff1a;将n个数字按一定顺序排列&#xff08;比如&#xff1a;升序&#xff0c;或者降序&#xff09; ^内部排序 &#xff1a;若整个排序过程不需要访问外存便能完成&#xff0c;则称此类排序问题为内部排序 ^外部排序&#xff1a;若参加排序的记录数量很…

【Linux】人事档案——用户及组管理

目录 1 用户及组管理 2 用户及用户组管理命令 2.1 useradd&#xff1a;建立用户 useradd命令用于建立用户&#xff0c;该 2.2 passwd&#xff1a;更改用户密码 2.3 usermod&#xff1a;更改用户信息 2.4 groupadd&#xff1a;建立用户组 2.5 finger&#xff1a;查找并显…

给定一个有序的正数数组arr和一个正数range,如果可以自由选择arr中的数字,想累加得 到 1~range 范围上所有的数,返回arr最少还缺几个数。

给定一个有序的正数数组arr和一个正数range&#xff0c;如果可以自由选择arr中的数字&#xff0c;想累加得 到 1~range 范围上所有的数&#xff0c;返回arr最少还缺几个数。 #include <iostream> #include <vector>using namespace std;void func1(std::vector<…

BigemapPro快速添加历史影像(Arcgis卫星地图历史地图)

这是Esri(Arcgis)官方提供的历史影像数据&#xff0c;可放心使用。https://livingatlas.arcgis.com/wayback如何快速添加到Bigemap Pro软件里&#xff0c;详细步骤如下&#xff1a;复制下面的文本保存为 配置.bmmap,然后拖入软件就可以了{"BmLayerVersion":"1.0…

[免费]基于Python的Django医院管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是python222_小锋老师&#xff0c;看到一个不错的基于Python的Django医院管理系统&#xff0c;分享下哈。 项目视频演示 https://www.bilibili.com/video/BV1iPH8zmEut/ 项目介绍 随着人民生活水平日益增长&#xff0c;科技日益发达的今天&#xff0c;…

MyBatis 从入门到精通(第三篇)—— 动态 SQL、关联查询与查询缓存

在前两篇博客中&#xff0c;我们掌握了 MyBatis 的基础搭建、核心架构与 Mapper 代理开发&#xff0c;能应对简单的单表 CRUD 场景。但实际项目中&#xff0c;业务往往更复杂 —— 比如 “多条件动态查询”“员工与部门的关联查询”“高频查询的性能优化” 等。本篇将聚焦 MyBa…

Linux内核中IPv4的BEET模式封装机制解析

引言 在Linux网络栈中,IPSec提供了网络层的数据加密和认证服务。传统的IPSec支持两种模式:传输模式(Transport Mode)和隧道模式(Tunnel Mode)。然而,这两种模式各有优缺点:传输模式开销小但无法隐藏原始IP头;隧道模式提供完全封装但增加了开销。 BEET(Bound End-to…

设计模式——创建型模式

什么是设计模式&#xff1f;设计模式是软件工程中解决常见问题的经典方案&#xff0c;它们代表了最佳实践和经验总结。通过使用设计模式&#xff0c;开发者可以创建更加灵活、可维护和可扩展的代码结构。设计模式不是具体的代码实现&#xff0c;而是针对特定问题的通用解决方案…

我爱学算法之—— 位运算(上)

常见位运算 对于位运算&#xff1a; &&#xff1a;按位与&#xff0c;有0则0。 |&#xff1a;按位或&#xff0c;有1则1。 ^&#xff1a;按位异或&#xff0c;相同为0、不同为1。&#xff08;无进位相加&#xff09; ~&#xff1a;二进制位按位取反。 对于位运算的常见使用…

智能语音系统

智能语音系统通过技术手段让机器能够“听懂”、“理解”并“回应”人类的语音&#xff0c;是实现人机交互的关键技术之一。下面我将为你梳理智能语音系统的核心组成部分、工作原理、应用场景以及面临的挑战。&#x1f9e0; 核心技术与工作原理智能语音系统之所以能实现人机交互…

水泵自动化远程监测与控制的御控物联网解决方案

一、行业背景与痛点分析水泵作为工业生产、农业灌溉、城市供水等领域的核心设备&#xff0c;其运行效率直接影响系统稳定性与运营成本。然而&#xff0c;传统管理模式存在三大核心痛点&#xff1a;人工巡检低效&#xff1a;偏远地区水泵分布分散&#xff0c;依赖人工定期巡检&a…

Python实现点云法向量各种方向设定

本次我们分享点云法向量定向的四种方法&#xff0c;分别是XYZ轴、相机位置、最小生成树(MST)和质心设定方法。通常出现在三维点云处理、三维重建、计算机视觉或图形学中&#xff0c;需要估计点云的法向量方向。它们的核心任务是&#xff1a;在已知点坐标和局部几何结构&#xf…

腾讯云智能体开发平台

提供全球领先的云计算服务腾讯云&#xff0c;腾讯集团倾力打造的云计算品牌&#xff0c;面向全世界各个国家和地区的政府机构、企业组织和个人开发者&#xff0c;提供全球领先的云计算、大数据、人工智能等技术产品与服务&#xff0c;以卓越的科技能力打造丰富的行业解决方案&a…

css flex布局,设置flex-wrap:wrap换行后,如何保证子节点被内容撑高后,每一行的子节点高度一致。

flex布局&#xff0c;设置flex-wrap&#xff1a;wrap换行后&#xff0c;如何保证子节点被内容撑高后&#xff0c;每一行的子节点高度一致。核心&#xff1a;需要设置父节点和子节点&#xff1a;align-items: stretch&#xff0c;两个都要。代码&#xff1a;<div class"…

Nginx_Tomcat综合案例

要求 需求&#xff1a;通过 nginx 来代理两个 tomcat 服务器&#xff08;反向代理&#xff09;&#xff0c;然后通过 https://www.nginx.com 来进行访问。主机名IP软件nginx192.168.30.10nginxtomcat1192.168.30.11java&#xff0c;tomcattomcat2192.168.30.12java&#xff0c;…

【Vue2手录12】单文件组件SFC

一、知识回顾-Vue2项目基础操作与环境配置 1.1 项目启动 项目打开方式&#xff1a;直接将项目文件夹&#xff08;如my-app&#xff09;拖拽到 Visual Studio Code&#xff08;推荐编辑器&#xff09;&#xff0c;避免拖拽父级文件夹&#xff0c;防止路径混乱。启动命令&#xf…