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上有很多還趕不上。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/710692.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/710692.shtml
英文地址,請注明出處:http://en.pswp.cn/news/710692.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高項軟考電子版論文答題紙(附下載)

24年軟考又要來了,作為高項軟考的攔路虎,論文你準備好了嗎?!記住在開始考試之前一定要用論文答題紙上把準備好的論文,在規定的時間內寫上幾遍,一是現在很少動筆寫字了。二是、熟悉一下論文考試的感覺。 準備…

UniApp Vue 3 中的網絡請求封裝詳解及用法

在UniApp中,結合Vue 3的強大特性,進行網絡請求的封裝是項目中常見的需求。這樣的封裝不僅提高了代碼的可維護性,還使得在組件中使用網絡請求更加簡潔。本文將詳細介紹UniApp Vue 3中的網絡請求封裝,并提供一個簡單的用法示例。 1…

索引使用規則4——覆蓋索引回表查詢

覆蓋索引:查詢使用了索引,并且需要返回的列,在索引里面都可以找到,減少select*的使用 1、using index condition Extra 為using index condition 表明查找使用了索引,但是需要回表查詢(也就是先二級索引&…

第十八屆全國大學生智能汽車競賽——攝像頭算法(附帶個人經驗)

文章目錄 前言一、攝像頭圖像處理1、攝像頭圖像采集2、圖像二值化與大津算法 二、左右邊界,中線掃描 前言 參加了第十六,十七和第十八屆全國大學生智能車競賽,對攝像頭的學習有部分心得,分享給大家,三屆車賽&#xff…

【C語言基礎】:深入理解指針(一)

文章目錄 一、內存和地址1. 內存2. 如何理解編址 二、指針變量和地址2.1 取地址操作符(&)2.2 指針變量和解引用操作符(*)2.2.1 指針變量2.2.2 如何拆解指針變量2.2.3 解引用操作符 2.3 指針變量的大小 三、指針變量類型的意義3.1 指針的解引用3.2 指針 - 整數3.3 void*指針…

HCIA-HarmonyOS設備開發認證V2.0-習題

目錄 習題一習題二(待續...)堅持就有收獲 習題一 # HarmonyOS簡介 1. 以下哪幾項屬于OpenHarmony的技術特性?()A. 統一OS,彈性部署B. 一次開發,多端部署C. 硬件互助,資源共享2. Ope…

從零開始的Java知識(下)

從零開始的Java知識 雙列數據集合(Day1)Map 雙列數據集合(Day1) Map 注意點: Map一次加入一個key-value一個key對應一個valuekey與key之間是不重復的key-value被稱為鍵值對,鍵值對對象或者是entry對象 …

離散數學

(理解大于識記, 這么多公式我是記不住) 命題邏輯 P P P Q Q Q P \neg P P 否定/非 P ∧ Q P \wedge Q P∧Q 合取/與 P ∨ Q P \vee Q P∨Q 析取/或 P → Q P \to Q P→Q 蘊含 P ? Q P \leftrightarrow Q P?Q 等價0010011011011010001001101111 P → Q P\to Q P→Q 的自然語…

openssl 加密文件(支持大文件,對稱、非對稱)

一、非對稱加密(小文件) 生成 2048 位密鑰 openssl genrsa -out rsa2048.key 2048從 rsa2048.key 密鑰文件中提取出公鑰 pub2048.key openssl rsa -in rsa2048.key -pubout -out pub2048.key使用 pub2048.key 公鑰加密一個文件 (data.zip 為原始文件&…

C# WPF編程-創建項目

1.創建新項目 選擇“WPF應用程序”》“下一步” 2. 設置項目 設置項目名稱,保存位置等參數>下一步 3.選擇框架 4.項目創建成功 5.運行項目

兩張二值化圖像融合

python實現,已知兩張二值化圖像,對比兩張圖,將像素點一致的坐標保留原來顏色,不一致的坐標像素值變為128 讀取原圖 import cv2 import matplotlib.pyplot as plt import numpy as npcup_file_pathname"/home/wzc/zlt_self/…

vue-顯示數據

? v-text和v-html專門用來展示數據, 其作用和插值表達式類似。v-text和v-html可以避免插值閃爍問題. ? 當網速比較慢時, 使用{{}}來展示數據, 有可能會產生插值閃爍問題。 ? 插值閃爍: 在數據未加載完成時,頁面會顯示出原始的{{}}, 過一會才會展示正常數據.語法…

Opencv實戰(5)平滑處理與常見函數

平滑處理 Opencv實戰: Opencv(1)讀取與圖像操作 Opencv(2)繪圖與圖像操作 Opencv(3)詳解霍夫變換 Opencv(4)詳解輪廓 文章目錄 平滑處理1.均值濾波2.方框濾波3.高斯濾波4.中值濾波5.雙邊濾波 常見函數(1).createTrackbar()(2).SetMouseCallback() 圖像的平滑處理是…

細數Android開發者的艱辛歷程,android零基礎

首先我們來看一下組件化項目和傳統項目的區別: 在傳統的項目里 我們通常情況下會有一個commonLib的Libary模塊和一個app的application模塊,業務中的邏輯都寫在app中各個功能模塊放到不同的包下。這樣做有以下幾個主要的缺點: 1.無論分包做的再好&…

【Linux】USB Functionfs編程:libusb接口詳解

1、USB host_app代碼注釋 #include <libusb.h> libusb頭文件,編譯時鏈接庫:libusb-1.0#define VENDOR 0x1d6b 廠商:Linux Foundation #define PRODUCT 0x0105 設備:FunctionFS Gadge

Zynq—AD9238數據采集DDR3緩存千兆以太網發送實驗(一)

ACM9238 高速雙通道ADC模塊自助服務手冊AD9238 一、實驗目的 本次實驗通過電腦上的網絡調試助手&#xff0c;將命令幀進行發送&#xff0c;然后通過ACZ7015開發板上的以太網芯片接收&#xff0c;隨后將接收到的數據轉換成命令&#xff0c;從而實現對ACM9238模塊采樣頻率、數據…

JavaScript中的new Proxy()和Object.defineProperty使用詳細,Vue2和vue3中雙向數據綁定的原理

簡介&#xff1a; Object.defineProperty() 是 JavaScript 中一個強大且常用的方法&#xff0c;用于定義對象屬性&#xff0c;允許我們精確地控制屬性的行為&#xff0c;包括讀取、寫入和刪除等操作&#xff0c;是vue2中雙向數據綁定的原理&#xff1b; new Proxy() 是ES6中一…

Tomcat布署及優化

1.Tomcat簡介 Tomcat 是 Java 語言開發的&#xff0c;Tomcat 服務器是一個免費的開放源代碼的 Web 應用服務器&#xff0c;Tomcat 屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試 JSP 程序的首選。一般來說&…

在實訓云平臺上配置云主機

文章目錄 零、學習目標一、實訓云升級二、實訓云登錄&#xff08;一&#xff09;登錄實訓云&#xff08;二&#xff09;切換界面語言&#xff08;三&#xff09;規劃云主機實例 三、創建網絡三、創建路由器2024-2-29更新到此四、添加接口五、創建端口六、添加安全組規則七、創建…

反相輸入放大器與生俱來的坑

我們都知道反相放大器能將輸入的信號反相放大&#xff0c;這是很基本的知識&#xff0c;學過電路的一般都知道。反相放大器的公式為Vout -Vin*Rf/Rin&#xff08;運算放大器應用匯總&#xff09;。根據已知的公式&#xff0c;能很輕松的完成設計&#xff0c;但反相放大器與生俱…