Cette page explique comment utiliser Pub/Sub pour recevoir des notifications sur les événements cliniques dans un magasin DICOM. Vous pouvez recevoir des notifications Pub/Sub lorsqu'une nouvelle instance DICOM est stockée dans un magasin DICOM ou importée depuis Cloud Storage.
Vous pouvez utiliser les notifications Pub/Sub à plusieurs fins, par exemple pour déclencher le traitement en aval ou analyser de nouvelles données. Par exemple, un modèle de machine learning peut recevoir des notifications lorsque de nouvelles données sont disponibles pour l'entraînement et générer des insights pour améliorer les soins aux patients.
La figure suivante montre comment les notifications Pub/Sub sont générées et publiées.
Figure 1 : Recevoir des notifications Pub/Sub sur les événements cliniques dans un magasin DICOM
La figure 1 illustre les étapes suivantes:
- Un appelant envoie une requête pour stocker ou importer une instance DICOM.
- Le magasin DICOM reçoit la requête, crée un message Pub/Sub et l'envoie au sujet Pub/Sub configuré sur le magasin DICOM.
- Pub/Sub transfère le message aux abonnements associés au sujet.
- Les abonnés reçoivent le message de leur abonnement. Chaque abonnement peut avoir un ou plusieurs abonnés pour accroître le parallélisme.
Avant de commencer
Ajouter des autorisations d'éditeur Pub/Sub
Pour publier des messages de l'API Cloud Healthcare vers Pub/Sub, vous devez ajouter le rôle pubsub.publisher
au compte de service Agent de service Cloud Healthcare de votre projet.
Pour en savoir plus, consultez la section Autorisations Pub/Sub pour les datastores DICOM, FHIR et HL7v2.
Format et contenu des notifications
Une notification Pub/Sub contient un objet Message
qui inclut des informations sur l'événement clinique. Les notifications Pub/Sub DICOM n'incluent pas de champ attributes
. L'objet Message
ressemble à ceci:
{ "message": { "data": "BASE_64_ENCODED_DATA", "messageId": "MESSAGE_ID", "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ" } }
La valeur du champ data
est l'identifiant suivant sous forme de chaîne encodée en base64: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID
Pour en savoir plus sur les champs inclus dans chaque message Pub/Sub, consultez ReceivedMessage
et PubsubMessage
.
Configurer et afficher les notifications
Cette section explique comment activer les notifications Pub/Sub sur un magasin DICOM, stocker ou importer une instance DICOM pour publier une notification et l'afficher.
Configurer le magasin DICOM
Les exemples suivants montrent comment activer les notifications Pub/Sub sur un magasin DICOM lorsqu'une nouvelle instance DICOM est stockée ou importée depuis Cloud Storage.
REST
Utilisez la méthode projects.locations.datasets.dicomStores.patch
.
La valeur NotificationConfig.sendForBulkImport
est true
. Par conséquent, des notifications sont envoyées lors de l'importation de données à partir de Cloud Storage.
Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
PROJECT_ID
: ID de votre projet Google CloudLOCATION
: emplacement de l'ensemble de donnéesDATASET_ID
: ensemble de données parent du magasin DICOMDICOM_STORE_ID
: ID du magasin DICOMPUBSUB_TOPIC
: sujet Pub/Sub dans lequel les messages sont publiés lorsqu'un événement se produit dans un data store
Corps JSON de la requête :
{ "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", "sendForBulkImport": "true" } }
Pour envoyer votre requête, choisissez l'une des options suivantes :
curl
Enregistrez le corps de la requête dans un fichier nommé request.json
.
Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :
cat > request.json << 'EOF' { "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", "sendForBulkImport": "true" } } EOF
Exécutez ensuite la commande suivante pour envoyer votre requête 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/dicomStores/DICOM_STORE_ID?updateMask=notificationConfig"
PowerShell
Enregistrez le corps de la requête dans un fichier nommé request.json
.
Exécutez la commande suivante dans le terminal pour créer ou écraser ce fichier dans le répertoire actuel :
@' { "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", "sendForBulkImport": "true" } } '@ | Out-File -FilePath request.json -Encoding utf8
Exécutez ensuite la commande suivante pour envoyer votre requête 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/dicomStores/DICOM_STORE_ID?updateMask=notificationConfig" | Select-Object -Expand Content
API Explorer
Copiez le corps de la requête et ouvrez la page de référence de la méthode. Le panneau APIs Explorer s'ouvre dans la partie droite de la page. Vous pouvez interagir avec cet outil pour envoyer des requêtes. Collez le corps de la requête dans cet outil, renseignez tous les champs obligatoires, puis cliquez sur Execute (Exécuter).
Vous devriez obtenir un résultat semblable au suivant.
Si vous avez configuré des champs dans la ressource DicomStore
, ils apparaissent également dans la réponse.
gcloud
Exécutez la commande gcloud healthcare dicom-stores update
.
Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :
PROJECT_ID
: ID de votre projet Google CloudLOCATION
: emplacement de l'ensemble de donnéesDATASET_ID
: ensemble de données parent du magasin DICOMDICOM_STORE_ID
: ID du magasin DICOMPUBSUB_TOPIC
: sujet Pub/Sub dans lequel les messages sont publiés lorsqu'un événement se produit dans un data store
Exécutez la commande suivante :
Linux, macOS ou Cloud Shell
gcloud healthcare dicom-stores update DICOM_STORE_ID \ --dataset=DATASET_ID \ --location=LOCATION \ --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC \ --send-for-bulk-import
Windows (PowerShell)
gcloud healthcare dicom-stores update DICOM_STORE_ID ` --dataset=DATASET_ID ` --location=LOCATION ` --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC ` --send-for-bulk-import
Windows (cmd.exe)
gcloud healthcare dicom-stores update DICOM_STORE_ID ^ --dataset=DATASET_ID ^ --location=LOCATION ^ --pubsub-topic=projects/PROJECT_ID/topics/PUBSUB_TOPIC ^ --send-for-bulk-import
Vous devriez obtenir un résultat semblable à celui-ci :
Réponse
Updated dicomStore [DICOM_STORE_ID]. ... name: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID notificationConfig: pubsubTopic: projects/PROJECT_ID/topics/PUBSUB_TOPIC sendForBulkImport: true
Stocker ou importer une instance DICOM, puis afficher la notification Pub/Sub
Pour stocker ou importer une instance DICOM et extraire le message Pub/Sub généré, procédez comme suit:
Stockez ou import une instance DICOM. La requête déclenche la publication d'un message par l'API Cloud Healthcare dans le sujet Pub/Sub configuré.
Extrayez le message. Si vous importez plusieurs instances DICOM dans une seule requête, un message est généré pour chaque instance DICOM.
Pour afficher les autorisations Identity and Access Management requises pour extraire des messages Pub/Sub, consultez la section Contrôle des accès pour Pub/Sub.
REST
Utilisez la méthode
projects.subscriptions.pull
. L'exemple suivant utilise le paramètre de requête?maxMessages=10
pour spécifier le nombre maximal de messages à renvoyer dans la requête. Ajustez cette valeur en fonction de votre cas d'utilisation.Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :
PROJECT_ID
: ID de votre projet Google CloudPUBSUB_SUBSCRIPTION_ID
: ID de l'abonnement associé au sujet Pub/Sub configuré sur le store DICOM
Pour envoyer votre requête, choisissez l'une des options suivantes :
curl
Exécutez la commande suivante :
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
Exécutez la commande suivante :
$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 ContentAPI Explorer
Ouvrez la page de référence de la méthode. Le panneau APIs Explorer s'ouvre dans la partie droite de la page. Vous pouvez interagir avec cet outil pour envoyer des requêtes. Renseignez tous les champs obligatoires, puis cliquez sur Exécuter.
Vous devriez recevoir une réponse JSON de ce type :
gcloud
Exécutez la commande
gcloud pubsub subscriptions pull
.L'exemple utilise les options Google Cloud CLI suivantes:
--limit=10
: renvoie un maximum de 10 messages. Ajustez cette valeur en fonction de votre cas d'utilisation.--format=json
: affiche la sortie au format JSON.--auto-ack
: accuse réception automatiquement de chaque message extrait.
Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :
PROJECT_ID
: ID de votre projet Google CloudPUBSUB_SUBSCRIPTION_ID
: ID de l'abonnement associé au sujet Pub/Sub configuré sur le store DICOM
Exécutez la commande suivante :
Linux, macOS ou Cloud Shell
gcloud pubsub subscriptions pull \ projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID \ --limit=10 \ --auto-ack \ --format=json
Windows (PowerShell)
gcloud pubsub subscriptions pull ` projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID ` --limit=10 ` --auto-ack ` --format=json
Windows (cmd.exe)
gcloud pubsub subscriptions pull ^ projects/PROJECT_ID/subscriptions/PUBSUB_SUBSCRIPTION_ID ^ --limit=10 ^ --auto-ack ^ --format=json
Vous devriez obtenir un résultat semblable à celui-ci :
[ { "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR", "ackStatus": "SUCCESS", "message": { "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==", "messageId": "7586159156345265", "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ" } } ]
Règles de stockage des messages de l'API Cloud Healthcare et Pub/Sub
Pour vous assurer que les données de l'API Cloud Healthcare et les données associées dans les messages Pub/Sub se trouvent dans la même région, vous devez définir une règle de stockage des messages Pub/Sub.
Vous devez définir explicitement la règle de stockage des messages sur le sujet Pub/Sub configuré sur le data store pour vous assurer que les données restent dans la même région. Par exemple, si l'ensemble de données et le magasin FHIR de l'API Cloud Healthcare sont dans la région us-central1
, la règle de stockage des messages doit autoriser uniquement la région us-central1
.
Pour configurer une règle de stockage des messages, consultez la page Configurer des règles de stockage des messages.
Résoudre les problèmes de messages Pub/Sub manqués
Si une notification ne peut pas être publiée dans Pub/Sub, une erreur est consignée dans Cloud Logging. Pour en savoir plus, consultez la section Afficher les journaux d'erreurs dans Cloud Logging.
Si le taux de génération d'erreurs dépasse une limite, les erreurs dépassant cette limite ne sont pas envoyées à Cloud Logging.
Étape suivante
- Gérer les pics temporaires avec le contrôle de flux
- Gérer les échecs de messages
- Rouvrir et supprimer définitivement des messages
- Présentation de l'architecture de Pub/Sub