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
Autorisations requises pour cette tâche
Pour effectuer cette tâche, vous devez disposer des autorisations suivantes ou des rôles Identity and Access Management (IAM) suivants:
Autorisations
healthcare.dicomStores.update
Rôles
Vous pouvez demander à votre administrateur de vous accorder ces rôles Identity and Access Management. Pour obtenir des instructions sur l'attribution de rôles, consultez Gérer les accès ou Contrôler l'accès aux ressources de l'API Cloud Healthcare. Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.
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.
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 :
: ID de votre Google Cloud projetPROJECT_ID
: emplacement de l'ensemble de donnéesLOCATION
: ensemble de données parent du magasin DICOMDATASET_ID
: ID du magasin DICOMDICOM_STORE_ID
: sujet Pub/Sub dans lequel les messages sont publiés lorsqu'un événement se produit dans un entrepôt de donnéesPUBSUB_TOPIC
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 :
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"
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
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.
Réponse
{ "name": "projects/PROJECT_ID /locations/LOCATION /datasets/DATASET_ID /dicomStores/DICOM_STORE_ID ", "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID /topics/PUBSUB_TOPIC ", "sendForBulkImport": "true" }, }
Exécutez la commande gcloud healthcare dicom-stores update
.
Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :
: ID de votre Google Cloud projetPROJECT_ID
: emplacement de l'ensemble de donnéesLOCATION
: ensemble de données parent du magasin DICOMDATASET_ID
: ID du magasin DICOMDICOM_STORE_ID
: sujet Pub/Sub dans lequel les messages sont publiés lorsqu'un événement se produit dans un entrepôt de donnéesPUBSUB_TOPIC
Exécutez la commande suivante :
Linux, macOS ou Cloud Shell
gcloud healthcare dicom-stores updateDICOM_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 updateDICOM_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 updateDICOM_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 et afficher la notification Pub/Sub
Autorisations requises pour cette tâche
Pour effectuer cette tâche, vous devez disposer des autorisations suivantes ou des rôles Identity and Access Management (IAM) suivants:
Autorisations
healthcare.dicomStores.dicomWebWrite
pour stocker des instances DICOM dans le datastore DICOM demandé.healthcare.dicomStores.import
pour importer des instances DICOM dans le magasin DICOM demandé.
Rôles
Vous pouvez demander à votre administrateur de vous accorder ces rôles Identity and Access Management. Pour obtenir des instructions sur l'attribution de rôles, consultez Gérer les accès ou Contrôler l'accès aux ressources de l'API Cloud Healthcare. Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.
Pour stocker ou importer une instance DICOM et extraire le message Pub/Sub généré, procédez comme suit:
Stockez ou importez une instance DICOM. La requête déclenche la publication d'un message dans le sujet Pub/Sub configuré par l'API Cloud Healthcare.
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.
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 :
: ID de votre Google Cloud projetPROJECT_ID
: ID de l'abonnement associé au sujet Pub/Sub configuré sur le store DICOMPUBSUB_SUBSCRIPTION_ID
Pour envoyer votre requête, choisissez l'une des options suivantes :
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"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 ContentOuvrez 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 :
Réponse
{ "receivedMessages": [ { "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR", "ackStatus": "SUCCESS", "message": { "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==", "messageId": "7586159156345265", "publishTime": "
YYYY-MM-DDTHH:MM:SS+ZZ:ZZ " } } ] }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 :
: ID de votre Google Cloud projetPROJECT_ID
: ID de l'abonnement associé au sujet Pub/Sub configuré sur le store DICOMPUBSUB_SUBSCRIPTION_ID
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=jsonWindows (PowerShell)
gcloud pubsub subscriptions pull ` projects/
PROJECT_ID /subscriptions/PUBSUB_SUBSCRIPTION_ID ` --limit=10 ` --auto-ack ` --format=jsonWindows (cmd.exe)
gcloud pubsub subscriptions pull ^ projects/
PROJECT_ID /subscriptions/PUBSUB_SUBSCRIPTION_ID ^ --limit=10 ^ --auto-ack ^ --format=jsonVous 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 magasin de données 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