wiki-Documentación
Documentación
SYNCHRONIZER
todas las fechas en formato UTC: YYYY-MM-DDTHH:MM:SSZ
Objeto request
- request_date:
"2023-09-20T00:00:06Z"README.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests fecha de la request. importante porque se usa para el orden en que se ejecutan - request_id:
"cd45aea9-c4c7-4bb2-8442-e5e49c075157" - request_method:
"POST"README.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests uno de 'POST', 'PATCH', 'GET', 'PUT', 'DELETE' - request_endpoint:
"/api/layers/scale/last_view" - request_args:
"param1=asd¶m2=qwe"README.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests tambien se puede poner en request_endpoint. no enviar ambos - request_body:
"{}" - request_headers:
{}README.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests objeto con los headers TAL CUAL LOS TIENE QUE ENVIAR EL SYNCHRONIZER - last_response_status:
nullREADME.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests int, es el status http de la ultima respuesta. esto lo setea el servidor despues de un intento - last_response_content:
nullREADME.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests str, es el content de la ultima respuesta. esto lo setea el servidor despues de un intento - last_attempt_timestamp:
nullREADME.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests str, es la fecha de ultimo intento - sync_status:
"pending"README.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests str, estado de la request:'pending' | 'ready' | 'retry' | 'error' | 'skipped'
Objeto queues
- queue_name:
"sarasa4", - queue_id:
"f22488b4-fd7d-4a47-ae35-3091d536a778", - queue_metadata:
{}, - sync_requests:
[<OBJETO_REQUEST>, ...], - received_at:
"2023-09-20T12:19:49Z", - last_attempt_timestamp:
"2023-09-20T12:22:18Z", README.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests lo pone el servidor - status:
"ready"README.md celery-health.sh core docker docker-compose.yml docs migrations requirements.dev.txt requirements.txt run_api.py run_celery.sh src tests str, estado de la queue. Es calculado a partir del estado de sus requests:'pending' | 'queued' | 'ready' | 'error'
Sincronización
La sincronización se realiza de manera async por un worker. Se toman todas las queues pendientes de un usuario y se ejecutan en serie en el orden que las recibió el servidor. Esto significa que si una request falla, todas las requests y queues que le siguen quedarán encoladas.
Ciclo de status
Cuando se crea una queue, se crea en status pending. Significa que está en "standby".
Todas las requests asociadas son creadas con status pending.
Enseguida luedo de ser creada, se dispara la tarea de sincronización y se la pasa a queued.
Al ejecutarse cada request:
- Si el servidor responde con 20X, pasa a
ready. - Si el servidor responde con un status distinto de 20X, la request pasa a
error. - Podría darse el caso en que no se obtenga respuesta del servidor (por ejemplo timeout), en ese caso pasa a
retry.
Si una request pasa a retry o error, la sincronización se detiene,
por lo que el resto de requests se mantiene en pending.
Cuando todas las requests son sincronizadas o la sincronización se detiene, se recalcula el status de la queue.
- Si todas las requests están en
ready, la queue pasa aready - Si alguna está en
retryoerror, la queue pasa aerrory las siguientes queues (de haber) pasan apending.
Se pueden eliminar requests.
Esto es, pasarla a status skipped que implica ignorarla en el cálculo del status de la queue.
Luego de eliminar una request, se recalcula el status de la queue.
Un flujo típico sería:
- Se crea la queue y se envía la tarea de sincronización.
- Se ejecutan las requests hasta que una falla.
- Se elimina la request que falló.
- Se dispara la tarea de sincronización nuevamente.
- Las requests restantes se ejecutan con éxito.
APIs
API_URL = http://api.testing.auravant.com
obtener el estado de sync.
GET /sync/status
Respuesta
{
"info": "ok",
"data": {
"status": "error"
}
}
subir una queue.
POST /sync/queues
Body:
{
"queue_name": "sarasa4",
"queue_id": "f22488b4-fd7d-4a47-ae35-3091d536a788",
"queue_metadata": {},
"sync_requests": [
{
"request_date": "2023-09-20T00:00:05Z",
"request_id": "d03f4194-0df3-4338-8e05-de679d89588e",
"request_method": "POST",
"request_endpoint": "/api/layers/scale/last_view",
"request_args": "param1=asd¶m2=qwe",
"request_body": "{}",
"request_headers": {"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcmMiOiJ3IiwidWlkIjo3Mzg4LCJleHAiOjE2OTc3OTI4MTYsImlhdCI6MTY5NTIwMDgxNiwibG9jYWxlIjoiZW5fVVMiLCJ1dCI6MiwiZGV2IjoxLCJhaWQiOjcxODB9.FZMWpyRmXOmpKEsd4OZMUpQNAjPA8Ke5Ila1F9Z5RNw", "X-Version": "2.2.2"}
},
{
"request_date": "2023-09-20T00:00:06Z",
"request_id": "cd45aea9-c4c7-4bb2-8442-e5e49c075157",
"request_method": "POST",
"request_endpoint": "/api/layers/scale/last_view",
"request_args": "param1=asd¶m2=qwe",
"request_body": "{}",
"request_headers": {"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcmMiOiJ3IiwidWlkIjo3Mzg4LCJleHAiOjE2OTc3OTI4MTYsImlhdCI6MTY5NTIwMDgxNiwibG9jYWxlIjoiZW5fVVMiLCJ1dCI6MiwiZGV2IjoxLCJhaWQiOjcxODB9.FZMWpyRmXOmpKEsd4OZMUpQNAjPA8Ke5Ila1F9Z5RNw", "X-Version": "2.2.2"}
}
]
}
- Por ahora, si envias con el mismo uuid, se pisa
obtener queues pendientes.
GET /sync/queues
Respuesta:
{
"info": "ok",
"data": {
"queues": [
{
"queue_name": "sarasa4",
"queue_id": "f22488b4-fd7d-4a47-ae35-3091d536a778",
"queue_metadata": {},
"received_at": "2023-09-20T12:19:49Z",
"last_attempt_timestamp": "2023-09-20T12:22:18Z",
"pending": true,
"sync_requests": [
{
"request_date": "2023-09-20T00:00:06Z",
"request_id": "1af9cf0d-db0a-47f3-8fe5-f60d6a5f69d3",
"request_method": "POST",
"request_endpoint": "/api/layers/scale/last_view",
"request_args": "param1=asd¶m2=qwe",
"request_body": "{}",
"request_headers": {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcmMiOiJ3IiwidWlkIjo3Mzg4LCJleHAiOjE2OTc3OTI4MTYsImlhdCI6MTY5NTIwMDgxNiwibG9jYWxlIjoiZW5fVVMiLCJ1dCI6MiwiZGV2IjoxLCJhaWQiOjcxODB9.FZMWpyRmXOmpKEsd4OZMUpQNAjPA8Ke5Ila1F9Z5RNw",
"X-Version": "2.2.2"
},
"last_response_status": 400,
"last_response_content": "{\"info\": \"Parameters error\", \"res\": \"error\", \"code\": -5, \"msg\": \"'layer_name' is a required property\"}",
"last_attempt_timestamp": "2023-09-20T17:07:10Z",
"sync_status": "error"
},
{
"request_date": "2023-09-20T00:00:06Z",
"request_id": "cd45aea9-c4c7-4bb2-8442-e5e49c075157",
"request_method": "POST",
"request_endpoint": "/api/layers/scale/last_view",
"request_args": "param1=asd¶m2=qwe",
"request_body": "{}",
"request_headers": {
"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzcmMiOiJ3IiwidWlkIjo3Mzg4LCJleHAiOjE2OTc3OTI4MTYsImlhdCI6MTY5NTIwMDgxNiwibG9jYWxlIjoiZW5fVVMiLCJ1dCI6MiwiZGV2IjoxLCJhaWQiOjcxODB9.FZMWpyRmXOmpKEsd4OZMUpQNAjPA8Ke5Ila1F9Z5RNw",
"X-Version": "2.2.2"
},
"last_response_status": null,
"last_response_content": null,
"last_attempt_timestamp": null,
"sync_status": "pending"
}
]
}
]
}
}
forzar sync.
POST /sync/status
POST /sync/status ? user_id=123456
si se agrega el parametro user_id, se simula una api de sudo.
borrar una request.
DELETE /sync/requests ? request_id=cd45aea9-c4c7-4bb2-8442-e5e49c075157
Base de datos
Por ahora la base de datos es un archivo de texto en /home/ubuntu/synchronizer/database.json.
Si se modifica ese archivo, se puede "arreglar" la sincronización.