Line 45: |
Line 45: |
| === Frontend === | | === Frontend === |
| For its first version, at least (it could change), the whole frontend will be developed in Javascript. | | For its first version, at least (it could change), the whole frontend will be developed in Javascript. |
| + | |
| + | == Workload test == |
| + | As we said earlier, FastAPI is known to be very fast. But we need to have a few metrics to verify if it will be able to scale. |
| + | |
| + | Folksonomy Engine won't be used for each product of the database. As of today (2021-10), Open Food Facts has a mean of 0.77 requests per second, with pikes up to 100 req/s. The usage of Folksonomy Engine will be mechanically lower than Open Food Facts requests. |
| + | |
| + | === Tests === |
| + | If not specified, all our tests are made on a Raspberry Pi 4: because of the very low price of it, hardware -- and tests -- are easily reproducible. |
| + | |
| + | Testing 10,000 queries to <code>/ping</code> (includes a database request) give the following results: |
| + | $ ab -n 10000 -c 10 <nowiki>http://192.168.0.42:8000/ping</nowiki> |
| + | |
| + | Requests per second: 307.11 [#/sec] (mean) |
| + | Time per request: 32.562 [ms] (mean) |
| + | Publishing 2,000 new key/value pairs on 2,000 different products give the following result: |
| + | $ time ./fe_test.sh |
| + | |
| + | real 0m25,006s |
| + | user 0m30,612s |
| + | sys 0m21,014ssh |
| + | corresponding to 80 requests per second. We obtained similar results for 20,000. |
| + | |
| + | Dealing with the fact that our production servers are at least 10 or 20 times more powerfull than a Raspeberry Pi, we can conclude that Folksonomy Engine is correctly build to scale up. |
| + | |
| + | === Key/values injection script === |
| + | |
| + | <pre> |
| + | #!/usr/bin/bash |
| + | |
| + | # This script is creating NB number of key/value pairs in Folksonomy Engine API |
| + | # DO NOT USE ON PRODUCTION |
| + | |
| + | |
| + | # Number of products to be created |
| + | NB=2000 |
| + | # Server URL |
| + | S='http://192.168.0.42:8000' |
| + | # User name |
| + | U='charlesnepote' |
| + | # Password |
| + | read -p "OFF password: " PASS |
| + | #PASS='' |
| + | |
| + | |
| + | TOKEN=`curl -X 'POST' \ |
| + | "$S/auth" \ |
| + | -H 'accept: application/json' \ |
| + | -H 'Content-Type: application/x-www-form-urlencoded' \ |
| + | -d "grant_type=&username=$U&password=$PASS&scope=&client_id=&client_secret=" \ |
| + | | jq -r '.access_token'` |
| + | echo "Token: $TOKEN" |
| + | |
| + | counter=1 |
| + | while [ $counter -le $NB ] |
| + | do |
| + | echo $counter |
| + | ((counter++)) |
| + | # Create a random key and value |
| + | # https://stackoverflow.com/questions/32484504/using-random-to-generate-a-random-string-in-bash |
| + | P=`LC_ALL=C tr -dc 0-9 </dev/urandom | head -c 13` |
| + | echo "P: "$P |
| + | K=`LC_ALL=C tr -dc a-z_ </dev/urandom | head -c 30` |
| + | echo "K: "$K |
| + | V=`LC_ALL=C tr -dc a-z0-9_ </dev/urandom | head -c 30` |
| + | echo "V: "$V |
| + | |
| + | curl -X 'POST' \ |
| + | "$S/product" \ |
| + | -H 'accept: application/json' \ |
| + | -H "Authorization: Bearer $TOKEN" \ |
| + | -H 'Content-Type: application/json' \ |
| + | -d '{ |
| + | "product": "'$P'", |
| + | "k": "'$K'", |
| + | "v": "'$V'", |
| + | "owner": "", |
| + | "version": 1, |
| + | "editor": "'$U'", |
| + | "last_edit": "2021-10-19T07:57:47.518Z", |
| + | "comment": "Test" |
| + | }' & |
| + | |
| + | echo "" |
| + | done |
| + | |
| + | # wait for the end of all the foreground calls |
| + | wait |
| + | </pre> |
| + | |
| [[Category:Folksonomy Engine]] | | [[Category:Folksonomy Engine]] |