ansforge / IG-fhir-repertoire-offre-ressources-sante

Définition des spécifications de l'API FHIR pour utiliser le Répertoire national de l’Offre et des Ressources en santé et accompagnement médico-social (ROR).
https://interop.esante.gouv.fr/ig/fhir/ror/
MIT License
2 stars 1 forks source link

Pagination (stateless) des APIs FHIR et Load Balancing #385

Open loic-brtd opened 4 weeks ago

loic-brtd commented 4 weeks ago

Description du problème

L'implémentation actuelle des liens de paginations des API FHIR du ROR national est la suivante :

Requête initiale :
    "link": [
        {
            "relation": "self",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/HealthcareService?_count=10&name=Consultation"
        },
        {
            "relation": "next",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir?_getpages=582c79fa-4561-4a9f-a386-150c0cad7bb0&_getpagesoffset=10&_count=10&_bundletype=searchset"
        }
    ],

Page suivante :
    "link": [
        {
            "relation": "self",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir?_count=10&_getpages=582c79fa-4561-4a9f-a386-150c0cad7bb0&_getpagesoffset=10&_bundletype=searchset"
        },
        {
            "relation": "next",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir?_getpages=582c79fa-4561-4a9f-a386-150c0cad7bb0&_getpagesoffset=20&_count=10&_bundletype=searchset"
        },
        {
            "relation": "previous",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir?_getpages=582c79fa-4561-4a9f-a386-150c0cad7bb0&_getpagesoffset=0&_count=10&_bundletype=searchset"
        }
    ],

Un id de requête (ici 156db772-1cec-40e9-a444-e4de54318d97) est stocké en mémoire lors de la requête initiale, et utilisé pour accéder aux pages suivantes.

Cela pose problème lors de la mise en place de réplicas avec load balancing sur ces API (pour permettre une haute disponibilité/une non interruption du service en cas de crash d'une instance de l'API) car cet id n'est stocké dans la mémoire d'une seule instance à la fois.

Solution proposée

Une solution relativement simple serait de rendre l'API stateless, en introduisant un paramètre _offset (qui ne fait pas partie de la spec FHIR standard mais supporté par HAPI FHIR) :

Requête initiale :
    "link": [
        {
            "relation": "self",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/HealthcareService?_count=10&name=Consultation"
        },
        {
            "relation": "next",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/HealthcareService?_count=10&_offset=10&name=Consultation"
        }
    ],

Page suivante : 
    "link": [
        {
            "relation": "self",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/HealthcareService?_count=10&_offset=10&name=Consultation"
        },
        {
            "relation": "next",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/HealthcareService?_count=10&_offset=20&name=Consultation"
        },
        {
            "relation": "previous",
            "url": "https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/HealthcareService?_count=10&_offset=0&name=Consultation"
        }
    ],

Les critères de recherche sont répétés dans les liens de pages, évitant de les stocker en mémoire.

Nous avons la même problématique pour les demande d'export ($export) :

GET https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/$export?_outputFormat=application/fhir+json&_type=HealthcareService&includeAssociatedData=_myCompleteExtract

Header de réponse :
Content-Location: https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/$export-poll-status?_jobId=1815523f-fe13-4a5b-be36-6562e7049f9e

Qui pourrait être transformé ainsi :

GET https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/$export?_outputFormat=application/fhir+json&_type=HealthcareService&includeAssociatedData=_myCompleteExtract

Header de réponse :
Content-Location: https://api.rordev.esante.gouv.fr/ws-diffusion-fhir/$export-poll-status?_outputFormat=application/fhir+json&_type=HealthcareService&includeAssociatedData=_myCompleteExtract

Questions

Si vous avez d'autres retours, n'hésitez pas. C'est un sujet que j'évoquerai aussi sûrement avec notre architecte.

J'ai aussi trouvé ce document PDF qui évoque cette problématique, et les différentes manières dont les API FHIR implémentent la pagination.

Loïc BERTRAND loic.bertrand@atos.net Ingénieur d’études et développement Atos France - Département Est - Metz

nriss commented 2 weeks ago

Hello, petite remarque pour l'export, j'avais bien insisté à @mathieu-decarvalho que pour être conforme au bulk il faut supporter le ndjson, je vois json dans votre extrait image https://build.fhir.org/ig/HL7/bulk-data/export.html

Est-ce que l'information vous a bien été transmise ?

nriss commented 2 weeks ago

Merci pour votre question très détaillée et pertinente! Je comprends bien la problématique. Avez-vous cherché dans le chat zulip ? J'imagine que vous n'êtes pas les seuls à vous poser cette question

nriss commented 2 weeks ago

En discutant avec @sdemeyANS, on s'est rendu compte d'une nouvelle problématique sur l'utilisation de _count et _offset : si les données exposées sont mises à jour (ex : ajout ou suppression de ressources), les résultats renvoyés par une même requête risque de changer en fonction du moment où la requête est envoyée