FHIR-Ressourcenkonflikte mithilfe von ETags vermeiden

Auf dieser Seite wird erläutert, wie Sie Entitäts-Tags (ETags) zur Parallelitätsverwaltung mit FHIR-Ressourcen in der Cloud Healthcare API verwenden. ETags verhindern Datenverluste und verbessern die Anwendungsleistung, indem sie optimistische Nebenläufigkeitserkennung und clientseitiges Caching.

ETags verstehen

Ein ETag dient als eindeutige Kennung für den aktuellen Status einer FHIR-Ressource auf dem Server, ähnlich einem Versionsnummer. Jedes Mal, wenn eine FHIR-Ressource erstellt oder geändert wird, wird ein neuer ETag-Wert generiert.

Sie können ETags verwenden, um die Datenintegrität sicherzustellen und die Leistung in folgenden Bereichen zu optimieren: Situationen:

  • Um optimistische Nebenläufigkeitserkennung zu gewährleisten: Wenn Sie einen ETag in eine Anfrage zur Änderung einer FHIR-Ressource aufnehmen, überprüft die Cloud Healthcare API, ob das ETag mit der neuesten Version von der FHIR-Ressource auf dem Server. So verhindern Sie, dass ein Kunde versehentlich Änderungen eines anderen Clients überschreibt. Dies bezeichnet man als Schreib-Schreib-Konflikt. oder das Problem mit einem verlorenen Update.

  • Bedingte Anfragen senden: ETags ermöglichen es Clients, unter bestimmten Bedingungen wenn bestimmte Bedingungen erfüllt sind. Dadurch wird die Datenabfrage optimiert und unnötiger Netzwerkverkehr reduziert. Sie können beispielsweise bedingten Anfragen mit den folgenden HTTP-Headern:

    • If-Match: Die Anfrage ist nur erfolgreich, wenn das bereitgestellte ETag mit dem aktuellen ETag auf dem Server. Dadurch wird sichergestellt, dass Sie Version der FHIR-Ressource.
    • If-None-Match: Die Anfrage ist nur erfolgreich, wenn das angegebene ETag nicht mit dem aktuellen ETag auf dem Server übereinstimmen. So sehen Sie, wenn die lokal im Cache gespeicherte Version einer Ressource noch aktuell ist, Dadurch muss nicht jedes Mal die vollständige Ressource vom Server abgerufen werden. Dies wird häufig für effizientes Caching verwendet.

FHIR-ETags nutzen eine schwache Validierung, Das heißt, sie sind möglicherweise nicht auf verschiedenen Serverinstanzen identisch, dennoch können sie Ressourcenänderungen effektiv nachverfolgen.

ETag abrufen

Die folgenden Beispiele zeigen, wie Sie den ETag einer FHIR-Ressource abrufen.

Das ETag ist im vollständigen HTTP-Antwortheader enthalten, wenn Sie Inhalt abrufen einer FHIR-Ressource. Das ETag stimmt mit dem Meta.versionId überein. in der FHIR-Ressource.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID ist die ID Ihres Google Cloud-Projekts
  • LOCATION ist der Standort des Datasets
  • DATASET_ID: das übergeordnete Dataset des FHIR-Speichers
  • FHIR_STORE_ID: die FHIR-Speicher-ID
  • FHIR_RESOURCE_TYPE ist der FHIR-Ressourcentyp
  • FHIR_RESOURCE_ID: die FHIR-Ressourcen-ID

curl

Verwenden Sie die Methode fhir.read. Das Flag -verbose gibt den Fehlerwert HTTP-Header in der Antwort, die das ETag enthalten.

curl -X GET \
    -verbose \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID"

Die Antwort enthält Folgendes:

< etag: W/"ETAG_VALUE"

PowerShell

Verwenden Sie die Methode fhir.read. Das Flag -Headers gibt die HTTP-Header in der Antwort zurück, die den ETag.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID" | Select-Object -Expand Headers

Die Antwort enthält Folgendes:

ETag                   {W/"ETAG_VALUE"}

Nebenläufigkeit beim Aktualisieren einer FHIR-Ressource verwalten

In den folgenden Beispielen wird gezeigt, wie Sie beim Aktualisieren einer FHIR-Ressource ein ETag angeben.

In den Beispielen wird If-Match verwendet. Dabei gilt Folgendes:

  • Wenn der ETag mit dem aktuellen ETag der FHIR-Ressource auf dem Server übereinstimmt, ist die Aktualisierung erfolgreich und der Server generiert ein neues ETag für die aktualisierte Ressource. Dadurch wird sichergestellt, dass Sie die erwartete Version der FHIR-Ressource aktualisieren.

  • Stimmt der ETag nicht überein, schlägt die Aktualisierung mit der Meldung 412 Precondition Failed fehl. Fehler, der darauf hinweist, dass ein anderer Client die Ressource seit dem ursprünglichen ETag wurde abgerufen. So werden Datenverluste durch versehentliches Überschreiben verhindert.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • ETAG_VALUE: der ETag-Wert der FHIR-Ressource
  • PROJECT_ID ist die ID Ihres Google Cloud-Projekts
  • LOCATION ist der Standort des Datasets
  • DATASET_ID: das übergeordnete Dataset des FHIR-Speichers
  • FHIR_STORE_ID: die FHIR-Speicher-ID
  • FHIR_RESOURCE_TYPE ist der FHIR-Ressourcentyp
  • FHIR_RESOURCE_ID: die FHIR-Ressourcen-ID

curl

Verwenden Sie die Methode fhir.update.

curl -X PUT \
    -H "If-Match: W/\"ETAG_VALUE\"" \
    -H "Content-Type: application/json; charset=utf-8" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -d @request.json \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID"

Die Antwort enthält die aktualisierte FHIR-Ressource.

PowerShell

Verwenden Sie die Methode fhir.update.

$cred = gcloud auth print-access-token
$etag = W/\"ETAG_VALUE\""
$headers = @{
  "Authorization" = "Bearer $cred"
  "If-Match"      = "$etag"}

Invoke-WebRequest `
    -Method PUT `
    -Headers $headers `
    -InFile request.json `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID" | Select-Object -Expand Content

Die Antwort enthält die aktualisierte FHIR-Ressource.

Clientseitiges Caching implementieren

Sie können ETags verwenden, um clientseitiges Caching zu implementieren, was die Datenverarbeitung beschleunigt. und trägt zu einer reibungsloseren, reaktionsschnelleren Nutzererfahrung bei.

Wenn Sie eine zuvor im Cache gespeicherte FHIR-Ressource abrufen möchten, können Sie das im Cache gespeicherte ETag in den Header If-None-Match einfügen. Dabei gilt Folgendes:

  • Wenn die ETags übereinstimmen, antwortet der Server mit 304 Not Modified und der verwendet seine Cache-Kopie. Das spart Bandbreite und die Serverlast wird reduziert.

  • Wenn die ETags nicht übereinstimmen, sendet der Server die aktualisierte FHIR-Ressource und neuen ETag, sodass der Client seinen Cache aktualisieren kann.

Die folgenden Beispiele zeigen, wie der Inhalt einer FHIR-Ressource mit einem ETag abgerufen wird, das mit dem ETag auf dem Server übereinstimmt.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • ETAG_VALUE: der ETag-Wert der FHIR-Ressource
  • PROJECT_ID ist die ID Ihres Google Cloud-Projekts
  • LOCATION ist der Standort des Datasets
  • DATASET_ID: das übergeordnete Dataset des FHIR-Speichers
  • FHIR_STORE_ID: die FHIR-Speicher-ID
  • FHIR_RESOURCE_TYPE ist der FHIR-Ressourcentyp
  • FHIR_RESOURCE_ID: die FHIR-Ressourcen-ID

curl

Verwenden Sie die Methode fhir.read. Das Flag -verbose gibt den Fehlerwert HTTP-Header in der Antwort, andernfalls wird keine Antwort zurückgegeben.

curl -X GET \
    -H "If-None-Match: W/\"ETAG_VALUE\"" \
    -v \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID"

Die Antwort enthält den Statuscode 304 Not Modified.

PowerShell

Verwenden Sie die Methode fhir.read. Das Flag -Headers gibt die HTTP-Header in der Antwort zurück. Andernfalls wird keine Antwort zurückgegeben. zurückgegeben.

$cred = gcloud auth print-access-token
$etag = W/\"ETAG_VALUE\""
$headers = @{
"Authorization" = "Bearer $cred"
  "If-None-Match"      = "$etag"}

Invoke-WebRequest `
    -Method GET `
    -Headers $headers `
    -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/FHIR_RESOURCE_TYPE/FHIR_RESOURCE_ID" | Select-Object -Expand Headers

Die Antwort enthält den Statuscode 304 Not Modified.