En esta página, se describe cómo usar Pub/Sub para recibir notificaciones sobre eventos clínicos en un almacén de DICOM. Puedes recibir notificaciones de Pub/Sub cuando se almacena una instancia de DICOM nueva en un almacén de DICOM o se importa desde Cloud Storage.
Puedes usar las notificaciones de Pub/Sub para varios fines, como activar el procesamiento descendente o analizar datos nuevos. Por ejemplo, un modelo de aprendizaje automático puede recibir notificaciones cuando hay datos nuevos disponibles para el entrenamiento y generar estadísticas para mejorar la atención de los pacientes.
En la siguiente figura, se muestra cómo se generan y publican las notificaciones de Pub/Sub.
Figura 1. Recibir notificaciones de Pub/Sub sobre eventos clínicos en un almacén de DICOM
En la Figura 1, se muestran los siguientes pasos:
- Un llamador realiza una solicitud para almacenar o importar una instancia de DICOM.
- El almacén de DICOM recibe la solicitud, crea un mensaje de Pub/Sub y lo envía al tema de Pub/Sub configurado en el almacén de DICOM.
- Pub/Sub reenvía el mensaje a las suscripciones adjuntas al tema.
- Los suscriptores reciben el mensaje de su suscripción. Cada suscripción puede tener uno o más suscriptores para aumentar el paralelismo.
Antes de comenzar
Agrega permisos de publicador de Pub/Sub
Para publicar mensajes de la API de Cloud Healthcare en Pub/Sub, debes agregar el rol pubsub.publisher
a la cuenta de servicio del agente de servicios de Cloud Healthcare de tu proyecto.
Para obtener más información, consulta Permisos de Pub/Sub de DICOM, FHIR y HL7v2.
Formato y contenido de las notificaciones
Una notificación de Pub/Sub contiene un objeto Message
que incluye información sobre el evento clínico. Las notificaciones de Pub/Sub de DICOM no incluyen un campo attributes
. El objeto Message
se ve similar al siguiente:
{ "message": { "data": "BASE_64_ENCODED_DATA ", "messageId": "MESSAGE_ID ", "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ " } }
El valor del campo data
es el siguiente identificador como una cadena codificada en base 64: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID
Para obtener más información sobre los campos incluidos en cada mensaje de Pub/Sub, consulta ReceivedMessage
y PubsubMessage
.
Configura y visualiza las notificaciones
En esta sección, se describe cómo habilitar las notificaciones de Pub/Sub en un almacén de DICOM, almacenar o importar una instancia de DICOM para publicar una notificación y verla.
Configura el almacén de DICOM
Permisos necesarios para esta tarea
Para realizar esta tarea, debes tener los siguientes permisos o las siguientes funciones de Administración de identidades y accesos (IAM):
Permisos
healthcare.dicomStores.update
Funciones
Puedes pedirle a tu administrador que te otorgue estos roles de administración de identidades y accesos. Si quieres obtener instrucciones para otorgar roles, consulta Administra el acceso o Controla el acceso a los recursos de la API de Cloud Healthcare. También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
En los siguientes ejemplos, se muestra cómo habilitar las notificaciones de Pub/Sub en un almacén de DICOM cuando se almacena o importa una instancia de DICOM nueva desde Cloud Storage.
Usa el método projects.locations.datasets.dicomStores.patch
.
El valor de NotificationConfig.sendForBulkImport
es true
, por lo que se envían notificaciones cuando se importan datos desde Cloud Storage.
Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
: Es el ID de tu Google Cloud proyecto.PROJECT_ID
: La ubicación del conjunto de datosLOCATION
: El conjunto de datos superior del almacén de DICOMDATASET_ID
: El ID del almacén de DICOMDICOM_STORE_ID
: Un tema de Pub/Sub en el que se publican los mensajes cuando se produce un evento en un almacén de datosPUBSUB_TOPIC
Cuerpo JSON de la solicitud:
{ "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID /topics/PUBSUB_TOPIC ", "sendForBulkImport": "true" } }
Para enviar tu solicitud, elige una de estas opciones:
Guarda el cuerpo de la solicitud en un archivo llamado request.json
.
Ejecuta el comando siguiente en la terminal para crear o reemplazar este archivo en el directorio actual:
cat > request.json << 'EOF' { "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID /topics/PUBSUB_TOPIC ", "sendForBulkImport": "true" } } EOF
Luego, ejecuta el siguiente comando para enviar tu solicitud de 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"
Guarda el cuerpo de la solicitud en un archivo llamado request.json
.
Ejecuta el comando siguiente en la terminal para crear o reemplazar este archivo en el directorio actual:
@' { "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID /topics/PUBSUB_TOPIC ", "sendForBulkImport": "true" } } '@ | Out-File -FilePath request.json -Encoding utf8
Luego, ejecuta el siguiente comando para enviar tu solicitud de 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
Copia el cuerpo de la solicitud y abre la página de referencia del método. El panel del Explorador de API se abre en la parte derecha de la página. Puedes interactuar con esta herramienta para enviar solicitudes. Pega el cuerpo de la solicitud en esta herramienta, completa cualquier otro campo obligatorio y haz clic en Ejecutar.
Deberías recibir una respuesta similar a la que figura a continuación.
Si configuraste algún campo en el recurso DicomStore
, también aparecerá en la respuesta.
Respuesta
{ "name": "projects/PROJECT_ID /locations/LOCATION /datasets/DATASET_ID /dicomStores/DICOM_STORE_ID ", "notificationConfig": { "pubsubTopic": "projects/PROJECT_ID /topics/PUBSUB_TOPIC ", "sendForBulkImport": "true" }, }
Ejecuta el comando gcloud healthcare dicom-stores update
.
Antes de usar cualquiera de los datos de comando a continuación, realiza los siguientes reemplazos:
: Es el ID de tu Google Cloud proyecto.PROJECT_ID
: La ubicación del conjunto de datosLOCATION
: El conjunto de datos superior del almacén de DICOMDATASET_ID
: El ID del almacén de DICOMDICOM_STORE_ID
: Un tema de Pub/Sub en el que se publican los mensajes cuando se produce un evento en un almacén de datosPUBSUB_TOPIC
Ejecuta el siguiente comando:
Linux, macOS o 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
Deberías recibir una respuesta similar a la que figura a continuación:
Respuesta
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
Almacena o importa una instancia de DICOM y visualiza la notificación de Pub/Sub
Permisos necesarios para esta tarea
Para realizar esta tarea, debes tener los siguientes permisos o las siguientes funciones de Administración de identidades y accesos (IAM):
Permisos
healthcare.dicomStores.dicomWebWrite
para almacenar instancias de DICOM en el almacén de DICOM solicitado.healthcare.dicomStores.import
para importar instancias de DICOM al almacén de DICOM solicitado.
Funciones
Puedes pedirle a tu administrador que te otorgue estos roles de administración de identidades y accesos. Si quieres obtener instrucciones para otorgar roles, consulta Administra el acceso o Controla el acceso a los recursos de la API de Cloud Healthcare. También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Para almacenar o importar una instancia de DICOM y extraer el mensaje de Pub/Sub generado, completa los siguientes pasos:
Almacena o importa una instancia de DICOM. La solicitud hace que la API de Cloud Healthcare publique un mensaje en el tema de Pub/Sub configurado.
Extrae el mensaje. Si importas varias instancias de DICOM en una sola solicitud, se genera un mensaje para cada instancia de DICOM.
Para ver los permisos de Identity and Access Management necesarios para extraer mensajes de Pub/Sub, consulta Control de acceso de Pub/Sub.
Usa el método
projects.subscriptions.pull
. En el siguiente ejemplo, se usa el parámetro de consulta?maxMessages=10
para especificar la cantidad máxima de mensajes que se mostrarán en la solicitud. Ajusta este valor a tu caso de uso.Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:
: Es el ID de tu Google Cloud proyecto.PROJECT_ID
: El ID de la suscripción adjunta al tema de Pub/Sub configurado en el almacén de DICOMPUBSUB_SUBSCRIPTION_ID
Para enviar tu solicitud, elige una de estas opciones:
Ejecuta el siguiente 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"Ejecuta el siguiente 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 ContentAbre la página de referencia del método. El panel del Explorador de API se abre en la parte derecha de la página. Puedes interactuar con esta herramienta para enviar solicitudes. Completa los campos obligatorios y haz clic en Ejecutar.
Deberías recibir una respuesta JSON similar a la que se muestra a continuación:
Respuesta
{ "receivedMessages": [ { "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR", "ackStatus": "SUCCESS", "message": { "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==", "messageId": "7586159156345265", "publishTime": "
YYYY-MM-DDTHH:MM:SS+ZZ:ZZ " } } ] }Ejecuta el comando
gcloud pubsub subscriptions pull
:En la muestra, se usan las siguientes marcas de Google Cloud CLI:
--limit=10
: Muestra un máximo de 10 mensajes. Ajusta este valor a tu caso de uso.--format=json
: Renderiza el resultado como JSON.--auto-ack
: Confirma automáticamente todos los mensajes extraídos.
Antes de usar cualquiera de los datos de comando a continuación, realiza los siguientes reemplazos:
: Es el ID de tu Google Cloud proyecto.PROJECT_ID
: El ID de la suscripción adjunta al tema de Pub/Sub configurado en el almacén de DICOMPUBSUB_SUBSCRIPTION_ID
Ejecuta el siguiente comando:
Linux, macOS o 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=jsonDeberías recibir una respuesta similar a la que figura a continuación:
[ { "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR", "ackStatus": "SUCCESS", "message": { "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==", "messageId": "7586159156345265", "publishTime": "
YYYY-MM-DDTHH:MM:SS+ZZ:ZZ " } } ]
Política de almacenamiento de mensajes de Pub/Sub y API de Cloud Healthcare
Para asegurarte de que tus datos de la API de Cloud Healthcare y los datos asociados en los mensajes de Pub/Sub residan en la misma región, debes establecer una política de almacenamiento de mensajes de Pub/Sub.
Debes establecer de manera explícita la política de almacenamiento de mensajes en el tema de Pub/Sub configurado en el almacén de datos para asegurarte de que los datos permanezcan en la misma región. Por ejemplo, si el conjunto de datos de la API de Cloud Healthcare y el almacén de FHIR están en us-central1
, la política de almacenamiento de mensajes solo debe permitir la región us-central1
.
Para configurar una política de almacenamiento de mensajes, consulta Configura políticas de almacenamiento de mensajes.
Soluciona problemas de mensajes de Pub/Sub perdidos
Si no se puede publicar una notificación en Pub/Sub, se registra un error en Cloud Logging. Para obtener más información, consulta Visualiza los registros de errores en Cloud Logging.
Si la tasa de generación de errores supera un límite, los errores por los que se excedió el límite no se envían a Cloud Logging.
¿Qué sigue?
- Controla los aumentos transitorios con el control de flujo
- Controla los errores en los mensajes
- Vuelve a reproducir y borra definitivamente mensajes
- Descripción general de la arquitectura de Pub/Sub