当前位置: 首页 > news >正文

Python:关于数据服务中的Web API的设计

搭建类似joinquant、tushare类似的私有数据服务应用,有以下一些点需要注意:

需要说明的是,这里讨论的是web api前后端,当然还有其它方案,thrift,grpc等。因为要考虑到一鱼两吃,本文只探讨web api。在web api的基础上,可以提供封装sdk库,供前端函数式调用服务或纯手动写restful api 的方式,自己封装调用函数服务。

一、性能

性能主要取决于后端,前端可以考虑性能更好的语言、多线程和异步。
后端开发上,主要是序列化+压缩。
1、序列化

需要考虑跨语言的问题。比如,如果后端用python开发,用pickle序列化,前端用julia,用rust调用就会存在反序列化的问题。
如果用json序列化,虽然会通用,但效率会差一些。
阿里的Fury据说是一个跨语言的序列化的库,没有试用过。

https://furyio.org

python:

pip install pyfury

在这里插入图片描述比如python:

from typing import Dict
import pyfuryclass SomeClass:f1: "SomeClass"f2: Dict[str, str]f3: Dict[str, str]fury = pyfury.Fury(ref_tracking=True)
fury.register_class(SomeClass, "example.SomeClass")
obj = SomeClass()
obj.f2 = {"k1": "v1", "k2": "v2"}
obj.f1, obj.f3 = obj, obj.f2
data = fury.serialize(obj)
# bytes can be data serialized by other languages.
print(fury.deserialize(data))

这个库,正好缓解不少跨语言的痛点。但是并不一定可以解决所有语言的痛点,比如,对于R,或C#呢,就不知道是否可以。

当然,还是有其它解决办法的。比如,可以在这个基础上进行跨语言ffi封装,不过技术上会复杂一些。

2、压缩
不仅需要考虑性能,选择读写高效的库,而且还要考虑跨语言的问题。
在这里插入图片描述
显然,API是要跨网络的,对压缩比,以及压缩和解压来综合考量比较,需要根据场景来选取。有人喜欢zstd,也有人喜欢别的。

3、数据库还是文件系统

这个具体还是要看场景(并发、性能、硬件条件等),看应用服务的要求,各有优点。

(1)数据库

是选择TDengine,还是Clickhouse,还是DolphinDB? 还是采用其它?当然性能(读/写还是读和写)要求高,一般的数据库就不需要考虑了(如mysql之类)。

(2)文件系统

是选择Hdf5?还是Feather,还是Parquet,还有 Jay?Csv文件格式当源数可以考虑,但是当文件服务的一线服务支持,性能太差了。

Parquet压缩比好,但速度略慢于Feather。hdf5对字符串性能要差,需要进行特别处理。最好还是把最常用的数据格式做个比较,还要看看空间占用情况。

hdf5文件我还碰到过硬盘空间澎胀(空间占用异常暴涨)的事情,这些都需要自已摸索。

4、异步

后端如果采用异步的方式,有利于提升并发的效率。这里异步的框架的深度和广度,也需要进一步探讨。是在网络IO层,还是包括数据库的访问?

就异步而言,异步支持最好的是rust,特别适合做后端。

5、带宽资源

这个主要看你有多豪了。没什么说的,上预算。

二、前端的灵活性

1、关于前端服务模式的适用性

可以考虑在前端提供不同的选择,比如,是python sdk模式(提供安装包),还是纯restful模式(手写post,get等),以及不同的语言选择,来指定特定后端的序列化和压缩库的选择,便于前端有更好的适用性和体验。

这个可以在前端的headers中,或者post的params参数中,可以带入让后端判断的参数即可以。

这个可以通过写比较详细的示例,让大家更易于上手。

2、关于前端服务对后端的约束

前端如果python用户多,后端用python开发有使用上有一定的优势。前后端数据格式容易对齐(序列化)和Dataframe等。rust也非常适合,可以通过PYO3提供相应的前端适用服务封装。包括polars也是rust封装的,pandas2.x上有很多还赶不上。

相关文章:

Python:关于数据服务中的Web API的设计

搭建类似joinquant、tushare类似的私有数据服务应用,有以下一些点需要注意: 需要说明的是,这里讨论的是web api前后端,当然还有其它方案,thrift,grpc等。因为要考虑到一鱼两吃,本文只探讨web ap…...

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机(完整图文详细步骤教程)

VMwareWorkstation17.0虚拟机安装搭建PcDos2000虚拟机(完整图文详细步骤教程) 一、PcDos20001.PcDos2000简介2.PcDos2000下载 二、创建PcDos2000虚拟机1.新建虚拟机2.类型配置3.类型配置4.选择版本5.命名、存位置6.磁盘容量7.调整虚拟配置7.1 调整虚拟配…...

第七个程序:两个字符串连接后计算长度

实验步骤; 第一步:新建项目 第二步:程序编写 第三步:运行结果 Labview一共7个字节,长度为7,一个字母一个字节 汉字为2个字节,图一为4,图二为8 所以结果分别为11和15 视频教学: 字…...

【大数据】-- dataworks 创建odps 的 hudi 外表

文档:创建OSS外部表_云原生大数据计算服务 MaxCompute(MaxCompute)-阿里云帮助中心 举例:创建 odps 的 hudi 外表 CREATE EXTERNAL TABLE IF NOT EXISTS my_project.ods_hudi_mysql_words_h_all (id BIGINT COMMENT 主键id,`words` STRING COMMENT 词…...

ChatGPT与GEE+ENVI+python高光谱,多光谱等成像遥感数据处理技术

原文链接:ChatGPT与GEEENVIpython高光谱,多光谱等成像遥感技术 第一遥感科学与AI基础 一:遥感科学的基本原理和历史 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 最新进展和未来趋势 二:ChatGPT 什么是ChatGPT&a…...

学习linux从0到初级工程师-3

一、LNMP 1.1 搭建LNMP LNMP:LinuxNginxMysqlPHP LNMP优势: 1.web服务器一种,Nginx处理静态文件、索引文件,自动索引的效率非常高; 2.作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行…...

java实现文件上传到本地

很多时候我们都需要进行文件上传和下载的操作,具体怎么实现网上的代码其实也是挺多的,刚好我的项目中也遇到了文件上传和下载的需求,本篇博文具体讲解上传操作,下篇博文讲解下载操作。 我们具体来想一想要将一个从前端传来的文件…...

基于springboot+vue的多媒体素材库的开发与应用系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…...

《GitHub新手入门指南:从零开始掌握基本用法》

在现代软件开发和技术社区中,GitHub已经成为了一个不可或缺的平台。它不仅是一个代码托管平台,更是一个技术交流、学习分享的社交平台。但对于初学者来说,GitHub可能会有些令人望而却步。本文将详细介绍GitHub的基本用法,帮助新手快速入门并融入这个充满活力的技术社区。 …...

K8S存储卷与PV,PVC

一、前言 Kubernetes(K8s)中的存储卷是用于在容器之间共享数据的一种机制。存储卷可以在多个Pod之间共享数据,并且可以保持数据的持久性,即使Pod被重新调度或者删除,数据也不会丢失。 Kubernetes支持多种类型的存储卷…...

(科目三)简答题汇总

模块一 信息和计算机基础 一、简述信息的的特征 【记忆技巧】普传功夫真驾驶 普遍性:信息是无时不有的,无时不在的载体依附性:信息不能独立存在,必须有载体。价值性:同一则信息,对不同的人来说,价值不同。时效性:同…...

8、Redis-Jedis、Lettuce和一个Demo

目录 一、Jedis 二、Lettuce 三、一个Demo Java集成Redis主要有3个方案:Jedis、Lettuce和Redisson。 其中,Jedis、Lettuce侧重于单例Redis,而Redisson侧重于分布式服务。 项目资源在文末 一、Jedis 1、创建SpringBoot项目 2、引入依赖 …...

(Linux学习六)用户特殊权限类型,suid,chattr,umask

一、特殊位suid,针对文件/程序时,具备临时提升权限 分析:root运行是超管的权限,普通用户运行时是普通用户的权限 root /usr/bin/cat(root) /root/file1.txt ok alice/usr/bin/cat(alice) /root/file1.txt 无法访问rootchmod us filename …...

Mysql 数据类型的转换之 cast()

语法 cast( value as type) value 要进行数据转换的值(可以为任何类型)。type 要转换为的数据类型。type 的常见的类型可以为 : decimal十进制浮点数。可以使用可选的 M 和 D 参数指定最大位数 (M) 和小数点后的位数 (D)float浮点数dou…...

python重命名指定文件夹下的所有文件

最近要测试OCR功能,图片的命名有点杂乱无章.每次找指定名字的图片非常的不容易,所以写了一个小工具来重名了所有的图片. 我这里就用0001到9999的字符串命名了. import os def rename_files(folder_path):# 获取文件夹中所有文件名files os.listdir(folder_path)num 1# 遍历…...

通过多线程并发方式实现服务器

与多进程实现对比来看。 示例来源于网络视频 #include <stdio.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> #include <ctype.h> #include <unistd.h> #include <fcntl.h>#include "wrap.h"#de…...

【C语言】指针超级无敌金刚霹雳进阶(但不难,还是基础)

点击这里访问我的博客主页~~ 对指针概念还不太清楚的点击这里访问上一篇指针初阶2.0 上上篇指针初阶1.0 谢谢各位大佬的支持咯 今天我们一起来学习指针进阶内容 指针进阶 一、指针变量1、字符指针变量2、数组指针变量①数组指针变量的定义②数组指针变量的初始化 3、函数指…...

上位机图像处理和嵌入式模块部署(qmacvisual入门)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 虽然我们前面学习了很多的知识点&#xff0c;比如说在windows这边&#xff0c;用qt写界面&#xff0c;用opencv写图像处理代码&#xff1b;在linux…...

数据库事务问题整理-MySQL

什么是数据库事务&#xff1f; 数据库事务( transaction)是访问并可能操作&#xff08;增删改查都可能有&#xff09;各种数据项的一个数据库操作序列&#xff08;可能有1或多个SQL语句&#xff09;&#xff0c;这些操作要么全部执行,要么全部不执行&#xff0c;是一个不可分割…...

工具函数模板题(蓝桥杯 C++ 代码 注解)

目录 一、Vector容器&#xff1a; 二、Queue队列 三、Map映射 四、题目&#xff08;快递分拣 vector&#xff09;&#xff1a; 代码&#xff1a; 五、题目&#xff08;CLZ银行问题 queue&#xff09;&#xff1a; 代码&#xff1a; 六、题目&#xff08;费里的语言 map&…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...