Notifiche Pub/Sub FHIR

Questa pagina spiega come utilizzare Pub/Sub per ricevere notifiche quando si verifica un evento clinico in un archivio FHIR.

Puoi utilizzare le notifiche Pub/Sub per più casi d'uso, tra cui l'attivazione dell'elaborazione o dell'analisi downstream di nuovi dati. Ad esempio, un modello di machine learning può ricevere notifiche quando sono disponibili nuovi dati per l'addestramento e generare approfondimenti o previsioni per migliorare la cura dei pazienti.

Panoramica

Puoi ricevere notifiche Pub/Sub quando una risorsa FHIR viene creata, aggiornata, sottoposta a patch o eliminata in un archivio FHIR. L'API Cloud Healthcare non invia notifiche quando una risorsa FHIR viene importata da Cloud Storage.

Per ricevere le notifiche, devi creare un argomento e un abbonamento Pub/Sub, quindi configurare l'archivio FHIR per inviare le notifiche all'argomento.

Il seguente diagramma mostra come vengono create e distribuite le notifiche Pub/Sub quando viene creata una risorsa FHIR in un archivio FHIR utilizzando il metodo fhir.create. I passaggi sono gli stessi quando una risorsa FHIR viene aggiornata, sottoposta a patch o eliminata.

Notifiche Pub/Sub FHIR.

Figura 1. Utilizzo delle notifiche Pub/Sub per le modifiche in un archivio FHIR.

La figura 1 mostra i seguenti passaggi:

  1. Un chiamante effettua una richiesta fhirStores.fhir.create per creare una risorsa FHIR.
  2. L'archivio FHIR riceve la richiesta, crea un messaggio Pub/Sub e lo invia all'argomento Pub/Sub configurato nell'archivio FHIR.
  3. Pub/Sub inoltra il messaggio alle sottoscrizioni associate all'argomento.
  4. Gli abbonati ricevono una notifica, sotto forma di messaggio Pub/Sub, dal loro abbonamento. Ogni abbonamento può avere uno o più abbonati per un maggiore parallelismo.

Configurazione delle notifiche

Puoi configurare le notifiche Pub/Sub e il loro comportamento in un oggetto FhirNotificationConfig in un archivio FHIR. Ogni datastore FHIR può avere più FhirNotificationConfig configurati.

La tabella seguente descrive i campi dell'oggetto FhirNotificationConfig.

Campo Descrizione Esempio
pubsubTopic L'argomento Pub/Sub da collegare all'archivio FHIR. Le notifiche vengono inviate all'argomento specificato. projects/my-project/topics/my-topic
sendFullResource Indica se includere i contenuti completi di una risorsa FHIR creata, aggiornata o sottoposta a patch in una notifica. Questo campo non ha alcun effetto sulle notifiche inviate quando le risorse FHIR vengono eliminate. Per includere l'intero contenuto di una risorsa eliminata, imposta sendPreviousResourceOnDelete su true. true
sendPreviousResourceOnDelete Indica se includere o meno i contenuti completi di una risorsa FHIR eliminata in una notifica. Questo campo non influisce sulle notifiche inviate quando le risorse FHIR vengono create, aggiornate o corrette. true

Formato e contenuti delle notifiche

Ogni notifica Pub/Sub contiene un oggetto message che contiene informazioni sull'evento clinico. L'oggetto message ha un aspetto simile al seguente:

{
  "message": {
    "attributes": {
      "action": "ACTION",
      "lastUpdatedTime": "RFC_1123_FORMAT_DATETIME",
      "payloadType": "PAYLOAD_TYPE",
      "resourceType": "FHIR_RESOURCE_TYPE",
      "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
      "versionId": "VERSION_ID"
    },
    "data": "BASE_64_ENCODED_DATA",
    "messageId": "MESSAGE_ID",
    "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
  }
}

Per informazioni sui campi aggiuntivi inclusi in ogni messaggio Pub/Sub, vedi ReceivedMessage e PubsubMessage.

La tabella seguente descrive ogni campo dell'oggetto attributes:

Attributo Descrizione Esempio
action L'azione eseguita su una risorsa FHIR. I valori possibili includono:
  • CreateResource
  • PatchResource
  • UpdateResource
  • DeleteResource
CreateResource
resourceType Il tipo di risorsa FHIR modificata. I valori possibili includono qualsiasi tipo di risorsa FHIR supportato nell'API Cloud Healthcare. Patient
payloadType Il tipo di payload del messaggio, uno tra NameOnly o FullResource. FullResource
storeName Il nome completo della risorsa dell'archivio FHIR in cui è stata eseguita l'azione. projects/my-project/locations/us/datasets/my-dataset/fhirStores/my-fhir-store
lastUpdatedTime Un timestamp dell'ultima modifica della risorsa FHIR. Il timestamp utilizza il formato RFC 1123. Mon, 01 Jan 2020 00:00:00 UTC
versionId L'ID della versione più recente della risorsa FHIR su cui è stata eseguita l'azione. Per ulteriori informazioni sugli ID versione, vedi Elenco delle versioni delle risorse FHIR. MTY4MzA2MDQzOTI5NjIxMDAwMA

La tabella seguente descrive i campi rimanenti nell'oggetto message:

Campo Descrizione Esempio
data Una stringa con codifica Base64 del nome della risorsa FHIR o dei contenuti della risorsa FHIR, a seconda dei valori specificati in FhirNotificationConfig.
messageId Un identificatore per il messaggio Pub/Sub.
publishTime L'ora in cui il server Pub/Sub ha pubblicato il messaggio.

Specifica le informazioni da includere nelle notifiche

Le notifiche Pub/Sub, come descritto in Formato e contenuti delle notifiche, includono un insieme standard di campi. Puoi includere l'intera risorsa FHIR o solo il suo nome in ogni notifica. Il nome della risorsa contiene il percorso completo della risorsa e l'ID risorsa nel seguente formato:

projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE_TYPE/RESOURCE_ID

Le informazioni sulle risorse FHIR vengono memorizzate nel campo data come stringa con codifica Base64.

Se includi i contenuti completi di una risorsa FHIR, non devi interrogare separatamente Pub/Sub e l'API Cloud Healthcare per i dettagli della risorsa.

Recuperare il nome della risorsa FHIR

Per includere solo il nome di una risorsa FHIR quando crei, aggiorni o modifichi la risorsa, imposta sendFullResource su false. Per includere solo il nome quando elimini una risorsa FHIR, imposta sendPreviousResourceOnDelete su false.

Quando visualizzi la notifica, l'oggetto message ha un aspetto simile al seguente:

{
  "message": {
    "attributes": {
      "action": "{CreateResource|PatchResource|UpdateResource|DeleteResource}",
      "lastUpdatedTime": "RFC_1123_FORMAT_DATETIME",
      "payloadType": "NameOnly",
      "resourceType": "FHIR_RESOURCE_TYPE",
      "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
      "versionId": "VERSION_ID"
    },
    "data": "BASE64_ENCODED_FHIR_RESOURCE_NAME",
    "messageId": "MESSAGE_ID",
    "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
  }
}

Tieni presente quanto segue nella notifica:

  • Il campo payloadType è impostato su NameOnly per indicare quanto segue in merito alla richiesta:

    • Per le operazioni di creazione, aggiornamento e applicazione di patch, sendFullResource è impostato su false.
    • Per le operazioni di eliminazione, sendPreviousResourceOnDelete è impostato su false.
  • Nel campo data è incluso solo il nome della risorsa FHIR. Il nome è codificato come stringa con codifica base64.

Recupera i contenuti delle risorse FHIR create, aggiornate o sottoposte a patch

Per includere i contenuti completi di una risorsa FHIR quando crei, aggiorni o modifiche la risorsa, imposta sendFullResource su true.

Questo comportamento non si applica se elimini una risorsa FHIR. Se elimini una risorsa FHIR e sendFullResource è impostato su true, ma sendPreviousResourceOnDelete è impostato su false, la notifica è la stessa di quando recuperi solo il nome della risorsa FHIR. Per includere i contenuti della risorsa FHIR quando viene eliminata, consulta Recuperare i contenuti della risorsa FHIR eliminata.

Quando visualizzi la notifica, l'oggetto message ha un aspetto simile al seguente:

{
  "message": {
    "attributes": {
      "action": "{CreateResource|PatchResource|UpdateResource}",
      "lastUpdatedTime": "RFC_1123_FORMAT_DATETIME",
      "payloadType": "FullResource",
      "resourceType": "FHIR_RESOURCE_TYPE",
      "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
      "versionId": "VERSION_ID"
    },
    "data": "BASE64_ENCODED_FHIR_RESOURCE_CONTENTS",
    "messageId": "MESSAGE_ID",
    "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
  }
}

Tieni presente quanto segue nella notifica:

  • payloadType è impostato su FullResource per indicare che sendFullResource è impostato su true. I contenuti completi della risorsa FHIR sono inclusi nel campo data come stringa codificata in base 64.
  • Il campo data contiene i contenuti della risorsa FHIR come stringa codificata in base64.

Recupero dei contenuti di una risorsa FHIR eliminata

Per includere i contenuti completi di una risorsa FHIR quando la elimini, imposta sendPreviousResourceOnDelete su true.

Quando visualizzi la notifica, l'oggetto message ha un aspetto simile al seguente:

{
  "message": {
    "attributes": {
      "action": "DeleteResource",
      "lastUpdatedTime": "RFC_1123_FORMAT_DATETIME",
      "payloadType": "FullResource",
      "resourceType": "FHIR_RESOURCE_TYPE",
      "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
      "versionId": "VERSION_ID"
    },
    "data": "BASE64_ENCODED_FHIR_RESOURCE_CONTENTS",
    "messageId": "MESSAGE_ID",
    "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
  }
}

Prendi nota dei valori nei seguenti campi:

  • payloadType è impostato su FullResource anche se sendFullResource è impostato su false.

    I contenuti completi della risorsa FHIR sono inclusi nel campo data come stringa codificata in base 64.

  • Il campo data contiene i contenuti della risorsa FHIR come stringa codificata in base64 prima dell'eliminazione della risorsa.

Configurare e visualizzare le notifiche FHIR

Gli esempi riportati di seguito mostrano come visualizzare la notifica Pub/Sub generata quando viene creata una risorsa FHIR in un archivio FHIR.

Prima di iniziare

Prima di configurare e utilizzare le notifiche Pub/Sub, completa le sezioni seguenti:

Rivedi la quota Pub/Sub

Acquisisci familiarità con quote e limiti di Pub/Sub. Per informazioni su come visualizzare la quota, richiederne una maggiore e cosa succede se la quota si esaurisce, consulta Utilizzo delle quote.

Abilita l'API Pub/Sub

Nella console Google Cloud , abilita l'API Pub/Sub:

Abilitare l'API

Configurare le autorizzazioni Pub/Sub

Per consentire a Pub/Sub la pubblicazione dei messaggi dall'API Cloud Healthcare, devi aggiungere il ruolo pubsub.publisher all'account di servizio dell'agente di servizio Cloud Healthcare del progetto. Per i passaggi per aggiungere il ruolo richiesto, consulta Autorizzazioni Pub/Sub per archivi DICOM, FHIR e HL7v2.

crea un argomento Pub/Sub

Per creare un argomento, vedi Creare un argomento.

I singoli datastore possono avere i propri argomenti Pub/Sub oppure più datastore possono condividere lo stesso argomento.

Utilizza il formato seguente quando specifichi l'argomento Pub/Sub:

projects/PROJECT_ID/topics/TOPIC_NAME

PROJECT_ID è l'ID progetto Google Cloud e TOPIC_NAME è il nome dell'argomento Pub/Sub.

Crea una sottoscrizione Pub/Sub

Per ricevere messaggi pubblicati in un argomento, devi creare una sottoscrizione Pub/Sub. Ogni argomento Pub/Sub deve avere almeno una sottoscrizione Pub/Sub. La sottoscrizione collega l'argomento a un'applicazione del sottoscrittore che riceve ed elabora i messaggi pubblicati nell'argomento.

Per creare una sottoscrizione e collegarla a un argomento Pub/Sub, consulta Creare sottoscrizioni.

Creare o modificare un archivio FHIR

Crea o modifica un archivio FHIR con un oggetto FhirNotificationConfig configurato.

Gli esempi riportati di seguito mostrano come modificare un archivio FHIR esistente. I campi sendFullResource e sendPreviousResourceOnDelete sono impostati su true, il che significa che le notifiche contengono i contenuti completi della risorsa FHIR quando una risorsa viene creata, aggiornata, sottoposta a patch o eliminata.

REST

Per modificare l'archivio FHIR, utilizza il metodo projects.locations.datasets.fhirStores.patch.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • PROJECT_ID: l'ID del tuo Google Cloud progetto
  • LOCATION: la posizione del set di dati
  • DATASET_ID: il set di dati padre dell'archivio FHIR
  • FHIR_STORE_ID: l'ID datastore FHIR
  • PUBSUB_TOPIC_ID: l'ID argomento Pub/Sub

Corpo JSON della richiesta:

{
  "notificationConfigs": [
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_ID",
      "sendFullResource": true,
      "sendPreviousResourceOnDelete": true
    }
  ]
}

Per inviare la richiesta, scegli una di queste opzioni:

curl

Salva il corpo della richiesta in un file denominato request.json. Esegui questo comando nel terminale per creare o sovrascrivere questo file nella directory corrente:

cat > request.json << 'EOF'
{
  "notificationConfigs": [
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_ID",
      "sendFullResource": true,
      "sendPreviousResourceOnDelete": true
    }
  ]
}
EOF

Quindi, esegui questo comando per inviare la richiesta REST:

curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=notificationConfigs"

PowerShell

Salva il corpo della richiesta in un file denominato request.json. Esegui questo comando nel terminale per creare o sovrascrivere questo file nella directory corrente:

@'
{
  "notificationConfigs": [
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_ID",
      "sendFullResource": true,
      "sendPreviousResourceOnDelete": true
    }
  ]
}
'@  | Out-File -FilePath request.json -Encoding utf8

Quindi, esegui questo comando per inviare la richiesta REST:

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

Invoke-WebRequest `
-Method PATCH `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID?updateMask=notificationConfigs" | Select-Object -Expand Content

Dovresti ricevere una risposta JSON simile alla seguente:

Crea una risorsa FHIR

Crea una risorsa FHIR nell'archivio FHIR. La richiesta fa sì che l'API Cloud Healthcare pubblichi un messaggio nell'argomento Pub/Sub configurato.

Visualizza la notifica Pub/Sub

Visualizza il messaggio pubblicato nell'argomento Pub/Sub. Il seguente messaggio è stato generato quando è stata creata una risorsa Patient in un archivio FHIR.

Nell'output di esempio, i contenuti della risorsa FHIR sono in una stringa codificata in base64 nel campo data. Devi decodificare il valore codificato in base64 per ottenere i contenuti. La maggior parte delle piattaforme e dei sistemi operativi dispone di strumenti per decodificare il testo in base64.

REST

Per visualizzare il messaggio pubblicato nell'argomento Pub/Sub, utilizza il metodo projects.subscriptions.pull. Il seguente esempio utilizza il parametro di query ?maxMessages=10 per specificare il numero massimo di messaggi da restituire nella richiesta. Puoi modificare il valore in base alle tue esigenze.

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • PROJECT_ID: l'ID del tuo Google Cloud progetto
  • PUBSUB_SUBSCRIPTION_ID: l'ID della sottoscrizione collegata all'argomento Pub/Sub configurato nell'archivio FHIR

Per inviare la richiesta, scegli una di queste opzioni:

curl

Esegui questo comando:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID:pull?maxMessages=10"

PowerShell

Esegui questo comando:

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

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-Uri "https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID:pull?maxMessages=10" | Select-Object -Expand Content

Dovresti ricevere una risposta JSON simile alla seguente:

gcloud

Per visualizzare il messaggio pubblicato nell'argomento Pub/Sub, esegui il comando gcloud pubsub subscriptions pull.

L'esempio utilizza i seguenti flag di Google Cloud CLI:

  • --format=json: esegue il rendering dell'output come JSON.
  • --auto-ack: conferma automaticamente la ricezione di ogni messaggio recuperato.

Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

  • PROJECT_ID: l'ID del tuo Google Cloud progetto
  • PUBSUB_SUBSCRIPTION_ID: l'ID della sottoscrizione collegata all'argomento Pub/Sub configurato nell'archivio FHIR

Esegui questo comando:

Linux, macOS o Cloud Shell

gcloud pubsub subscriptions pull \
    projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID \
    --auto-ack \
    --format=json

Windows (PowerShell)

gcloud pubsub subscriptions pull `
    projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID `
    --auto-ack `
    --format=json

Windows (cmd.exe)

gcloud pubsub subscriptions pull ^
    projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID ^
    --auto-ack ^
    --format=json

Dovresti ricevere una risposta simile alla seguente:

[
  {
    "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR",
    "ackStatus": "SUCCESS",
    "message": {
      "attributes": {
        "action": "CreateResource",
        "lastUpdatedTime": "Mon, 01 Jan 2020 00:00:00 UTC",
        "payloadType": "FullResource",
        "resourceType": "Patient",
        "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID",
        "versionId": "MTY4MzA2MDQzOTI5NjIxMDAwMA"
      },
      "data": "wogICJiaXJ0aERhdGUiOiAiMTk3MC0wMS0wMSIsCiAgImdlbmRlciI6ICJmZW1hbGUiLAogICJpZCI6ICIyYmMwODg4Yi00MGRmLTQwYzctOWRhYi0wMzc4YTFiZWE0MGIiLAogICJtZXRhIjogewogICAgImxhc3RVcGRhdGVkIjogIjIwMjMtMDUtMDJUMjA6NDc6MTkuMjk2MjEwKzAwOjAwIiwKICAgICJ2ZXJzaW9uSWQiOiAiTVRZNE16QTJNRFF6T1RJNU5qSXhNREF3TUEiCiAgfSwKICAibmFtZSI6IFsKICAgIHsKICAgICAgImZhbWlseSI6ICJTbWl0aCIsCiAgICAgICJnaXZlbiI6IFsKICAgICAgICAiRGFyY3kiCiAgICAgIF0sCiAgICAgICJ1c2UiOiAib2ZmaWNpYWwiCiAgICB9CiAgXSwKICAicmVzb3VyY2VUeXBlIjogIlBhdGllbnQiCn0=",
      "messageId": "7586159156345265",
      "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ"
    }
  }
]

Comportamento quando una risorsa FHIR è troppo grande o il traffico è elevato

Se le dimensioni di una risorsa FHIR sono troppo grandi o i server dell'API Cloud Healthcare registrano un traffico elevato, il campo attributes potrebbe contenere solo il nome della risorsa anziché l'intero contenuto. Questo comportamento si verifica anche se sendFullResource e sendPreviousResourceOnDelete sono impostati su true.

Per verificare se una notifica Pub/Sub contiene la risorsa FHIR completa, controlla il campo payloadType nella risposta alla visualizzazione della notifica. Se payloadType è impostato su nameOnly, il campo attributes non ha compilato completamente i dati delle risorse FHIR. Devi quindi recuperare manualmente i contenuti della risorsa FHIR dall'archivio FHIR anziché dal messaggio Pub/Sub.

API Cloud Healthcare e criteri di archiviazione dei messaggi Pub/Sub

Per garantire che i dati dell'API Cloud Healthcare e i dati associati nei messaggi Pub/Sub si trovino nella stessa regione, devi impostare un criterio di archiviazione dei messaggi Pub/Sub.

Devi impostare esplicitamente il criterio di archiviazione dei messaggi nell'argomento Pub/Sub configurato nell'datastore per assicurarti che i dati rimangano nella stessa regione. Ad esempio, se il set di dati e l'archivio FHIR dell'API Cloud Healthcare si trovano in us-central1, il criterio di archiviazione dei messaggi deve consentire solo la regione us-central1.

Per configurare una policy di archiviazione dei messaggi, consulta Configurazione delle policy di archiviazione dei messaggi.

Risolvere i problemi relativi ai messaggi Pub/Sub mancanti

Se una notifica non può essere pubblicata su Pub/Sub, viene registrato un errore in Cloud Logging. Per ulteriori informazioni, consulta Visualizzazione dei log degli errori su Cloud Logging.

Se la frequenza di generazione degli errori supera un limite, gli errori in eccesso rispetto al limite non vengono inviati a Cloud Logging.

Visualizzare le notifiche FHIR utilizzando la configurazione NotificationConfig (deprecata)

La risorsa FhirStore contiene un oggetto NotificationConfig in cui puoi specificare un argomento Pub/Sub. Le modifiche alle risorse FHIR contengono sempre il seguente identificatore nel campo data del messaggio Pub/Sub:

projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/fhirStores/FHIR_STORE_ID/fhir/RESOURCE_TYPE/RESOURCE_ID

Il seguente set di coppie chiave:valore viene sempre incluso nel campo attributes del messaggio:

Nome attributo Valori possibili Esempio Descrizione
action
  • CreateResource
  • PatchResource
  • UpdateResource
  • DeleteResource
CreateResource Il tipo di evento che si è verificato.
resourceType Qualsiasi tipo di risorsa FHIR. Patient Il tipo di risorsa modificata.

Passaggi successivi