Alle beteiligten Akteure (Server wie Clients) tragen eine (Teil-)Verantwortung für die Sicherstellung einer performanten REST-API. Zweck einer performanten REST-API ist, dass die typischen Arbeitsabläufe der jeweiligen Nutzer (z. B. Arzt, Pflege, Verwaltung) ohne wahrnehmbare Verzögerung durchgeführt werden können. Insbesondere dürfen für klinisch kritische Funktionen keine Wartezeiten entstehen, die eine zeitgerechte Patientenversorgung beeinträchtigen.
Zur Sicherstellung dieser Performance-Bedarfe können in einem ersten Schritt die Antwortzeiten der REST-Endpunkte (Server) als Baseline geprüft werden - d. h. im Best-Case und unabhängig von Last-Anforderungen. Weitere Performance-Aspekte für Server zu Antwortzeiten unter Last, Lasten und Durchsatz sollten diesen Baseline Anforderungen folgen.
Da zur Gewährleistung der Performance während der Entwicklung sowohl Client- als auch Server-Hersteller beitragen müssen, werden unten weitere Hinweise zur Client-Implementierung formuliert. Die folgenden Festlegungen gelten dagegen für Server.
Die Performance-Kategorien und entsprechende Anforderungen beziehen sich zum jetzigen Zeitpunkt alle auf den Aspekt Antwortzeit als Baseline.
Die Antwortzeit bezeichnet dabei einen Request/Reply-Zyklus zwischen einem Client und einem Server, der die Zeitspanne von der Absendung einer Anfrage durch den Client bis zum vollständigen Empfang der Antwort durch den Client in der Test-Umgebung umfasst und deckt sich damit weitgehend mit dem Konzept der Bearbeitungszeit wie hier definiert. Dabei wird hier zusätzlich eine Antwortzeit ohne signifikante Lasteinwirkung angenommen.
Messmetriken für Antwortzeit
Für die Überprüfung der Performance-Anforderungen im Zertifizierungsverfahren gelten folgende Metriken:
Als kritisch (PK1 bis PK4) gelten REST-Abfragen, die von klinischen Nutzern in unmittelbar behandlungsrelevanten, zeitkritischen Situationen genutzt werden und deren Bereitstellung für den anfragenden Client nahezu zur Laufzeit stattfinden sollten. Daher sind hierfür sehr kurze Antwortzeiten ohne wahrnehmbare Verzögerung anzustreben.
Für diese Performance-Kategorien gilt:
GET baseURL/Patient/89186842GET baseURL/Observation/67890GET baseURL/DocumentReference/54321
baseURL/DocumentReference?_id=54321baseURL/Patient?identifier=12345baseURL/Patient?birthdate=1982-01-13baseURL/MedicationRequest?patient=Patient/89186842Patient.id bekannt.
baseURL/Condition?code=http://fhir.de/CodeSystem/bfarm/icd-10-gm|R10.0&patient=89186842baseURL/Condition?patient=Patient/89186842baseURL/Observation?category=http://terminology.hl7.org/CodeSystem/observation-category|vital-signs&patient=Patient/89186842.identifier unbekannt und dass ein sehr großer Ergebnisraum der Suchanfrage möglich ist.
baseURL/Patient?name=MüllerGET baseURL/Encounter?location=Location/loc-hospital&status=in-progress&_include=Encounter:subjectAls vorwiegend unkritisch gelten Abfragen (PK5 bis PK6), die z. B.
Für diese Performance-Kategorien sind längere Antwortzeiten grundsätzlich tolerierbar; bei zu erwartenden längeren Laufzeiten sind asynchrone Verfahren möglich.
Für diese Performance-Kategorien gilt:
baseURL/Procedure?encounter.location=Location/ward123baseURL/Location?type=http://terminology.hl7.org/CodeSystem/location-physical-type|wabaseURL/Observation?code=http://loinc.org|2160-0&combo-code-value-quantity=gt1.0|mg/dLbaseURL/MedicationRequestbaseURL/$bookFür diese Performance-Kategorien werden im Test-System des Zertifizierungsverfahrens die entsprechenden Performance-Anforderungen (z.B. Antwortzeiten - ggf. unter Berücksichtigung der Perzentile -; aber vorerst keine Lasten, Durchsatz etc.)implementiert.
too-costly)Bei patientenunabhängigen oder breit gefächerten Suchanfragen können potenziell sehr große Ergebnismengen entstehen, die Server erheblich belasten. Pagination SOLL als primäres Mittel eingesetzt werden, bevor ein Server eine Anfrage ablehnt. Reicht Pagination nicht aus, DARF ein Server eine too-costly-Antwort zurückgeben – jedoch nur im Rahmen der nachfolgend definierten Regeln.
Ressourcen-Volumenklassen
Ressourcentypen werden nach erwartetem Datenaufkommen klassifiziert. Daraus ergibt sich der garantiert zu beantwortende Suchumfang (Floor): Innerhalb dieses Suchumfangs MUSS ein Server ohne too-costly antworten.
| Klasse | Ressourcen | Mindest-Suchumfang (Floor) |
|---|---|---|
| Hochvolumig | Observation, DeviceMetric, MedicationAdministration |
_lastUpdated/Datums-Fenster ≤ 7 Tage ODER Pflicht-Begleitparameter (patient, encounter oder category mit Fenster) |
| Mittelvolumig | AllergyIntolerance, Appointment, Composition, Condition, DiagnosticReport, DocumentReference, Encounter, List, MedicationRequest, MedicationStatement, Procedure, QuestionnaireResponse, RiskAssessment, Schedule, Slot |
Fenster ≤ 3 Monate ODER Pflicht-Begleitparameter (patient oder encounter) |
| Niedrigvolumig / Stammdaten | Account, Binary, Device, HealthcareService, Location, Medication, Organization, Patient, Practitioner, PractitionerRole, Questionnaire, RelatedPerson |
kein Fenster nötig (begrenzter Bestand; breite Patient-/Encounter-Suchen sind gemäß PK4 in ≤ 5 s zu beantworten) |
| Infrastruktur | Bundle, CapabilityStatement, CodeSystem, OperationDefinition, Parameters, SearchParameter, ValueSet |
nicht betroffen, too-costly nicht anwendbar |
Zusätzlich gilt unabhängig von Volumenklasse und Zeitfenster ein mengenbasiertes Fallback: Ein Server DARF too-costly zurückgeben, wenn eine Anfrage eine Ergebnismenge von mehr als 10.000 Ressourcen erzeugen würde. Umgekehrt MUSS ein Server Anfragen bis einschließlich 10.000 Ressourcen beantworten und DARF unterhalb dieser Schwelle kein too-costly zurückgeben.
Zwei-Stufen-Modell (Floor/Ceiling)
too-costly antworten.too-costly ist nur für Anfragen außerhalb des vom Server deklarierten Suchumfangs zulässig.Auslösekriterien
Ein Server DARF too-costly zurückgeben, wenn eine Anfrage den unterstützten Suchumfang überschreitet, insbesondere:
_lastUpdated oder Datumsparameter ohne Patient-/Encounter-Bezug und mit einem Fenster oberhalb des Klassen-Floors (z. B. baseURL/Observation?_lastUpdated=ge2020)Patient?address-country, Patient?gender, Patient?status ohne identifizierenden Begleitparameter (identifier, birthdate, name)HTTP-Antwortformat
Rückgabe eines HTTP 400 Bad Request mit einem OperationOutcome:
issue.severity = errorissue.code = too-costlyissue.diagnostics SOLL einen menschenlesbaren Hinweis auf den überschrittenen Suchumfang enthalten (z. B. „Zeitfenster auf ≤ 7 Tage einschränken oder patient angeben”).CapabilityStatement-Deklaration
Server MÜSSEN für jeden Suchparameter, für den too-costly möglich ist, dies im CapabilityStatement dokumentieren. Server SOLLEN dabei den unterstützten Suchumfang angeben (CapabilityStatement.rest.resource.searchParam.documentation).
Client-Verhalten
Clients SOLLEN bei Empfang von too-costly die Anfrage mit engeren Filtern wiederholen, z. B. durch ein engeres Zeitfenster, einen zusätzlichen patient- oder encounter-Parameter oder den Einsatz von Pagination.
Auch Client-Hersteller tragen eine eigene Verantwortung bei der Gewährleistung der Performance für den Betrieb der definierten API-Schnittstelle. Dazu gehören insbesondere eine effiziente Abfragestrategie (z. B. Paging statt großer Ergebnismengen), fachlich sinnvolle Suchfilter (z. B. Zeiträume und Organisationseinheiten), die Vermeidung unnötiger Wiederholungsabfragen sowie die Nutzung geeigneter Caching- und Aktualisierungsmechanismen (z. B. ETag/If-None-Match). Ziel ist, nur die für den eigenen Anwendungsfall benötigten Daten in angemessener Zeit zu laden.
Beispiel für eine Vitalparameter-App (ein Patient) unter dem Szenario: Beim Öffnen der Patientenakte soll die App die zuletzt dokumentierten Vitalparameter (Puls, Blutdruck, Temperatur) schnell anzeigen und anschließend bei Bedarf den Zeitraum erweitern.
Konkrete Umsetzung der Performance-Aspekte:
_lastUpdated Suchparameter, um nur neue oder aktualisierte Daten seit der letzten Abfrage zu erhalten.