Evita los conflictos de recursos de FHIR con ETags

En esta página, se explica cómo usar etiquetas de entidad (ETags) para la administración de simultaneidad con recursos de FHIR en la API de Cloud Healthcare. Los ETag ayudan a prevenir la pérdida de datos y mejorar el rendimiento de la aplicación habilitando control de simultaneidad optimista y el almacenamiento en caché del cliente.

Comprender las ETags

Una ETag funciona como un identificador único para el estado actual de un recurso de FHIR en el servidor, similar a un número de versión. Cada vez que se crea o modifica un recurso de FHIR se genera un valor de ETag nuevo.

Puedes usar ETags para garantizar la integridad de los datos y optimizar el rendimiento en los siguientes situaciones:

  • Para garantizar un control de simultaneidad optimista: cuando incluyes una ETag en una solicitud para modificar un recurso de FHIR, la API de Cloud Healthcare verifica si la ETag coincide con la versión más reciente del el recurso de FHIR en el servidor. Esto ayuda a evitar que un cliente reemplace accidentalmente los cambios que realizó otro cliente, también se denomina conflicto de escritura y escritura. o el "problema de actualización perdida".

  • Envío de solicitudes condicionales: Los ETags permiten que los clientes envíen solicitudes de forma condicional solo cuando se cumplen condiciones específicas. Esto optimiza los datos en la recuperación y reduce el tráfico de red innecesario. Por ejemplo, puedes enviar solicitudes condicionales con los siguientes encabezados HTTP:

    • If-Match: La solicitud solo se realiza correctamente si la ETag proporcionada coincide con la ETag actual del servidor. Así, podrás asegurarte de actualizar del recurso de FHIR.
    • If-None-Match: La solicitud solo se realiza de forma correcta si la ETag proporcionada no se realiza correctamente. coincidir con la ETag actual en el servidor. Esto te permitirá saber Si la versión de un recurso almacenada en caché localmente sigue actualizada lo que reduce la necesidad de recuperar el recurso completo del servidor cada vez. Por lo general, se usa para un almacenamiento en caché eficiente.

Las ETag de FHIR usan validación débil, lo que significa que podrían no ser idénticos en diferentes instancias del servidor, siguen realizando un seguimiento eficaz de los cambios de los recursos.

Cómo obtener una ETag

En los siguientes ejemplos, se muestra cómo obtener la ETag de un recurso de FHIR.

La ETag se incluye en el encabezado de respuesta HTTP completo cuando obtener el contenido de un recurso de FHIR. La ETag coincide con el Meta.versionId en el recurso de FHIR.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • PROJECT_IDEl ID de tu proyecto de Google Cloud.
  • LOCATION: La ubicación del conjunto de datos
  • DATASET_ID es el conjunto de datos superior del almacén de FHIR
  • FHIR_STORE_ID es el ID del almacén de FHIR
  • FHIR_RESOURCE_TYPE: Es el tipo de recurso de FHIR.
  • FHIR_RESOURCE_ID: Es el ID del recurso de FHIR.

curl

Usa el método fhir.read. La marca -verbose muestra Encabezados HTTP en la respuesta, que contienen la ETag

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"

La respuesta contiene lo siguiente:

< etag: W/"ETAG_VALUE"

PowerShell

Usa el método fhir.read. La marca -Headers muestra los encabezados HTTP en la respuesta, que contienen los 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

La respuesta contiene lo siguiente:

ETag                   {W/"ETAG_VALUE"}

Administra la simultaneidad cuando se actualiza un recurso de FHIR

En los siguientes ejemplos, se muestra cómo incluir una ETag cuando se actualiza un recurso de FHIR.

Las muestras usan If-Match, que tiene el siguiente comportamiento:

  • Si la ETag coincide con la actual del recurso FHIR en el servidor, la actualización se realizará correctamente, y el servidor generará una ETag nueva para el recurso actualizado. Esto garantiza que se actualice la versión esperada del recurso de FHIR.

  • Si la ETag no coincide, la actualización falla con una 412 Precondition Failed. indica que otro cliente modificó el recurso desde el Se recuperó la ETag. Esto evita la pérdida de datos debido a reemplazos accidentales.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • ETAG_VALUE: el valor de la ETag del recurso de FHIR
  • PROJECT_IDEl ID de tu proyecto de Google Cloud.
  • LOCATION: La ubicación del conjunto de datos
  • DATASET_ID es el conjunto de datos superior del almacén de FHIR
  • FHIR_STORE_ID es el ID del almacén de FHIR
  • FHIR_RESOURCE_TYPE: Es el tipo de recurso de FHIR.
  • FHIR_RESOURCE_ID: Es el ID del recurso de FHIR.

curl

Usa el método 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"

La respuesta contiene el recurso de FHIR actualizado.

PowerShell

Usa el método 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

La respuesta contiene el recurso de FHIR actualizado.

Implementa el almacenamiento en caché del cliente

Puedes usar ETags para implementar el almacenamiento en caché del cliente, lo que acelera los datos de datos y contribuye a una experiencia del usuario más fluida y responsiva.

Para recuperar un recurso de FHIR previamente almacenado en caché, puedes incluir la ETag almacenada en caché en la If-None-Match encabezado, que tiene el siguiente comportamiento:

  • Si los ETags coinciden, el servidor responde con 304 Not Modified y el cliente usa su copia almacenada en caché. Esto ahorra ancho de banda y reduce la carga del servidor.

  • Si los ETags no coinciden, el servidor envía el recurso FHIR actualizado y su nueva ETag, lo que le permite al cliente actualizar su caché.

En los siguientes ejemplos, se muestra cómo obtener el contenido de un recurso de FHIR usando una ETag que coincida con la del servidor.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • ETAG_VALUE: el valor de la ETag del recurso de FHIR
  • PROJECT_IDEl ID de tu proyecto de Google Cloud.
  • LOCATION: La ubicación del conjunto de datos
  • DATASET_ID es el conjunto de datos superior del almacén de FHIR
  • FHIR_STORE_ID es el ID del almacén de FHIR
  • FHIR_RESOURCE_TYPE: Es el tipo de recurso de FHIR.
  • FHIR_RESOURCE_ID: Es el ID del recurso de FHIR.

curl

Usa el método fhir.read. La marca -verbose muestra encabezados HTTP en la respuesta; de lo contrario, no se muestra ninguna respuesta.

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"

La respuesta contiene un código de estado 304 Not Modified.

PowerShell

Usa el método fhir.read. La marca -Headers muestra los encabezados HTTP en la respuesta; de lo contrario, no recibe respuesta. el resultado.

$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

La respuesta contiene un código de estado 304 Not Modified.