-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feature/duckdb: POC duck db node api #17
base: main
Are you sure you want to change the base?
Conversation
Concernant le test de charge, j'ai utilisé l'outil Artillery que je ne connaissais pas.
Fichier de test : config:
target: http://localhost:3000/api/db-example
phases:
- duration: 60
arrivalRate: 1
rampTo: 5
name: Warm up phase
- duration: 60
arrivalRate: 5
rampTo: 10
name: Ramp up load
- duration: 30
arrivalRate: 10
rampTo: 30
name: Spike phase
# Load & configure a couple of useful plugins
# https://docs.art/reference/extensions
plugins:
ensure: {}
apdex: {}
metrics-by-endpoint: {}
apdex:
threshold: 100
ensure:
thresholds:
- http.response_time.p99: 100
- http.response_time.p95: 75
scenarios:
- flow:
- loop:
- get:
url: "/"
count: 100 Commande : J'ai fait plusieurs cas de tests, j'ai rajouté un limit sur les requêtes car sinon ça ne tenait pas la charge :
Analyse des résultats :
"aggregate": {
"counters": {
"vusers.created_by_name.0": 1230,
"vusers.created": 1230,
"http.requests": 212369,
"http.responses": 212200,
"http.codes.200": 106100,
"apdex.satisfied": 44135,
"apdex.tolerated": 28736,
"apdex.frustrated": 33229,
"plugins.metrics-by-endpoint./api/db-example/.codes.200": 106100,
"vusers.failed": 169,
"vusers.completed": 1061,
"plugins.metrics-by-endpoint./api/db-example/.errors.ETIMEDOUT": 169,
"errors.ETIMEDOUT": 169
},
"rates": {
"http.request_rate": 1576 // req/s
},
"period": 1739100460000,
"summaries": {
"http.response_time": {
"min": 0,
"max": 9948, //ms
"count": 212200,
"mean": 155.1,
},
}
}
En comparaison, encore un peu avant, on a de meilleures metrics lorsqu'il y a moins de vusers : {
"counters": {
"http.codes.308": 6475,
"http.responses": 12902,
"http.requests": 12954,
"http.codes.200": 6427,
"apdex.satisfied": 29,
"apdex.tolerated": 6398,
"apdex.frustrated": 0,
"plugins.metrics-by-endpoint./api/db-example/.codes.200": 6427,
"vusers.failed": 0,
"vusers.completed": 43,
"vusers.created_by_name.0": 95,
"vusers.created": 95
},
"rates": {
"http.request_rate": 1310
},
"summaries": {
"http.response_time": {
"min": 14,
"max": 309,
"count": 12902,
"mean": 98.3,
},
}
} Je ne pense pas qu'on devra tenir une charge aussi grande mais cela me semble acceptable. A suivre :
|
Tâche - Tester intégration node avec duckdb
Dans cette PR, j'ai testé l'intégration de la librairie
duckdb/duckdb-node-neo
pour faire des requêts sur la base duckdb.sise_resultats
. En commentaire j'ai aussi donné d'autres exemples de requêtes.Je ne suis pas allé dans des requêtes très complexes mais à priori duckdb a son propre dialect de requête qui ressemble fortement à PostgreSQL (source).
Note :
Il est possible de définir une fonction de conversion à appliquer en fonction des types (voir ce gist).
=> Pour notre usage cela ne posera peut être pas de problème ?
=> Peut être faudra-t-il faire une archi qui permettrait de switcher de provider si besoin ? (ajout d'une interface + impl) ?
=> Voir ancienne lib probablement plus stable (lib) qui a un wrapper typescript (lib)
On peut aussi récupérer un format json, mais dans ce cas certains types de données sont transformées en objets "riches" qui permettent de représenter la valeur.