Esta página descreve como usar o Pub/Sub para receber notificações sobre eventos clínicos num arquivo DICOM. Pode receber notificações do Pub/Sub quando uma nova instância DICOM é armazenada, importada do Cloud Storage, atualizada ou eliminada num arquivo DICOM.
Pode usar as notificações do Pub/Sub para vários fins, como acionar o tratamento a jusante ou analisar novos dados. Por exemplo, um modelo de aprendizagem automática pode receber notificações quando novos dados estão disponíveis para preparação e gerar estatísticas para melhorar os cuidados aos pacientes.
A figura seguinte mostra como as notificações do Pub/Sub são geradas e publicadas.
Figura 1. Receber notificações do Pub/Sub sobre eventos clínicos num arquivo DICOM.
A Figura 1 mostra os seguintes passos:
- Um autor da chamada faz um pedido para armazenar ou importar uma instância DICOM.
- O arquivo DICOM recebe o pedido, cria uma mensagem do Pub/Sub e envia-a para o tópico do Pub/Sub configurado no arquivo DICOM.
- O Pub/Sub encaminha a mensagem para as subscrições anexadas ao tópico.
- Os subscritores recebem a mensagem da subscrição. Cada subscrição pode ter um ou mais subscritores para aumentar o paralelismo.
Antes de começar
Adicione autorizações de publicador do Pub/Sub
Para publicar mensagens da Cloud Healthcare API no Pub/Sub, tem de adicionar a função pubsub.publisher
à conta de serviço do agente do serviço Cloud Healthcare do seu projeto.
Para mais informações, consulte o artigo Autorizações do Pub/Sub para DICOM, FHIR e HL7v2 store.
Configuração de notificações
Pode configurar as notificações do Pub/Sub e o respetivo comportamento num
DicomNotificationConfig
objeto numa loja DICOM. Cada arquivo DICOM pode ter vários DicomNotificationConfig
objetos configurados.
A tabela seguinte descreve os campos no objeto DicomNotificationConfig
:
Campo | Descrição | Exemplo |
---|---|---|
pubsubTopic |
O tópico Pub/Sub a anexar ao arquivo DICOM. As notificações são enviadas para o tópico especificado. | projects/my-project/topics/my-topic |
Formato e conteúdo da notificação
Uma notificação do Pub/Sub contém um objeto Message
que inclui informações sobre o evento clínico. O objeto Message
é semelhante ao seguinte:
{ "message": { "attributes": { "action": "ACTION", "lastUpdatedTime": "RFC_1123_FORMAT_DATETIME", "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID", "studyInstanceUID": "STUDY_UID", "seriesInstanceUID": "SERIES_UID", "sopInstanceUID": "INSTANCE_UID", "versionId": "VERSION_ID", "modality": "MODALITY", "storageClass": "STORAGE_CLASS", "previousStorageClass": "PREVIOUS_STORAGE_CLASS" }, "data": "BASE_64_ENCODED_DATA", "messageId": "MESSAGE_ID", "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ" } }
Para mais informações sobre os campos incluídos em cada mensagem do Pub/Sub,
consulte ReceivedMessage
e PubsubMessage
.
A tabela seguinte descreve cada campo no objeto attributes
:
Atributo | Descrição | Exemplo |
---|---|---|
action |
A ação que ocorreu num recurso DICOM. Os valores possíveis incluem:
|
StoreInstances |
lastUpdatedTime |
Uma data/hora da hora mais recente em que o recurso DICOM foi modificado. O carimbo de data/hora usa o formato RFC 1123. | Mon, 01 Jan 2020 00:00:00 UTC |
storeName |
O nome completo do recurso da loja DICOM onde ocorreu a ação. | projects/my-project/locations/us/datasets/my-dataset/dicomStores/my-dicom-store |
studyInstanceUID |
O identificador exclusivo universal (UID) da instância do estudo DICOM. | 1.2.3.4.5.6 |
seriesInstanceUID |
O identificador exclusivo (UID) da instância da série DICOM. | 1.2.3.4.5.6 |
sopInstanceUID |
O identificador exclusivo (UID) da instância SOP DICOM. | 1.2.3.4.5.6 |
versionId |
O ID da versão mais recente do recurso DICOM no qual a ação ocorreu. | MTY4MzA2MDQzOTI5NjIxMDAwMA |
modality |
A etiqueta de modalidade do recurso DICOM. Os valores possíveis incluem, entre outros:
|
CT |
storageClass |
A classe de armazenamento do recurso DICOM. Os valores possíveis incluem:
|
STANDARD |
previousStorageClass |
A classe de armazenamento anterior do recurso DICOM. Os valores possíveis incluem:
|
NEARLINE |
A tabela seguinte descreve os campos restantes no objeto message
:
Campo | Descrição |
---|---|
data |
Uma string codificada em base64 do seguinte identificador: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID |
messageId |
Um identificador da mensagem do Pub/Sub. |
publishTime |
A hora em que o servidor Pub/Sub publicou a mensagem. |
Configure e veja notificações
Esta secção descreve como ativar as notificações do Pub/Sub numa loja DICOM, armazenar ou importar uma instância DICOM para publicar uma notificação e ver a notificação.
Configure o arquivo DICOM
Os exemplos seguintes mostram como ativar as notificações do Pub/Sub numa loja DICOM quando uma nova instância DICOM é armazenada ou importada do Cloud Storage.
REST
Use o método projects.locations.datasets.dicomStores.patch
.
Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
PROJECT_ID
: o ID do seu Google Cloud projetoLOCATION
: a localização do conjunto de dadosDATASET_ID
: o conjunto de dados principal do arquivo DICOMDICOM_STORE_ID
: o ID da loja DICOMPUBSUB_TOPIC
: um tópico do Pub/Sub para o qual as mensagens são publicadas quando ocorre um evento num repositório de dados
Corpo JSON do pedido:
{ "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", } ] }
Para enviar o seu pedido, escolha uma destas opções:
curl
Guarde o corpo do pedido num ficheiro denominado request.json
.
Execute o seguinte comando no terminal para criar ou substituir
este ficheiro no diretório atual:
cat > request.json << 'EOF' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", } ] } EOF
Em seguida, execute o seguinte comando para enviar o seu pedido 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=notificationConfigs"
PowerShell
Guarde o corpo do pedido num ficheiro denominado request.json
.
Execute o seguinte comando no terminal para criar ou substituir
este ficheiro no diretório atual:
@' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC", } ] } '@ | Out-File -FilePath request.json -Encoding utf8
Em seguida, execute o seguinte comando para enviar o seu pedido 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=notificationConfigs" | Select-Object -Expand Content
Explorador de APIs
Copie o corpo do pedido e abra a página de referência do método. O painel APIs Explorer é aberto no lado direito da página. Pode interagir com esta ferramenta para enviar pedidos. Cole o corpo do pedido nesta ferramenta, preencha todos os outros campos obrigatórios e clique em Executar.
Deve receber uma resposta semelhante à seguinte.
Se configurou campos no recurso DicomStore
, estes também aparecem na resposta.
gcloud
Execute o comando gcloud healthcare dicom-stores update
.
Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:
PROJECT_ID
: o ID do seu Google Cloud projetoLOCATION
: a localização do conjunto de dadosDATASET_ID
: o conjunto de dados principal do arquivo DICOMDICOM_STORE_ID
: o ID da loja DICOMPUBSUB_TOPIC
: um tópico do Pub/Sub para o qual as mensagens são publicadas quando ocorre um evento num repositório de dados
Execute o seguinte comando:
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
Deve receber uma resposta semelhante à seguinte:
Resposta
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
Armazene ou importe uma instância DICOM e veja a notificação Pub/Sub
Para armazenar ou importar uma instância DICOM e extrair a mensagem Pub/Sub gerada, conclua os seguintes passos:
Armazene ou importe uma instância DICOM. O pedido faz com que a Cloud Healthcare API publique uma mensagem no tópico do Pub/Sub configurado.
Retire a mensagem. Se importar várias instâncias DICOM num único pedido, é gerada uma mensagem para cada instância DICOM.
Para ver as autorizações de gestão de identidades e acessos necessárias para obter mensagens do Pub/Sub, consulte o artigo Controlo de acesso para o Pub/Sub.
REST
Use o método
projects.subscriptions.pull
. O exemplo seguinte usa o parâmetro de consulta?maxMessages=10
para especificar o número máximo de mensagens a devolver no pedido. Ajuste este valor ao seu exemplo de utilização.Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
PROJECT_ID
: o ID do seu Google Cloud projetoPUBSUB_SUBSCRIPTION_ID
: o ID da subscrição anexada ao tópico Pub/Sub configurado no arquivo DICOM
Para enviar o seu pedido, escolha uma destas opções:
curl
Execute o seguinte 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
Execute o seguinte 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 ContentExplorador de APIs
Abra a página de referência do método. O painel APIs Explorer é aberto no lado direito da página. Pode interagir com esta ferramenta para enviar pedidos. Preencha todos os campos obrigatórios e clique em Executar.
Deve receber uma resposta JSON semelhante à seguinte:
gcloud
Execute o comando
gcloud pubsub subscriptions pull
.O exemplo usa as seguintes flags da Google Cloud CLI:
--limit=10
: devolve um máximo de 10 mensagens. Ajuste este valor ao seu exemplo de utilização.--format=json
: renderiza a saída como JSON.--auto-ack
: reconhece automaticamente todas as mensagens extraídas.
Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:
PROJECT_ID
: o ID do seu Google Cloud projetoPUBSUB_SUBSCRIPTION_ID
: o ID da subscrição anexada ao tópico Pub/Sub configurado no arquivo DICOM
Execute o seguinte comando:
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
Deve receber uma resposta semelhante à seguinte:
[ { "ackId": "RFAGFixdRkhRNxkIaFEOT14jPzUgKEUaAggUBXx9cEFLdVhUcGhRDRlyfWB9bQ5GAgpGWixfURsHaE5tdR", "ackStatus": "SUCCESS", "message": { "attributes": { "action": "ImportDicomData", "lastUpdatedTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ", "storeName": "projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID", "studyInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857604", "seriesInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857605", "sopInstanceUID": "1.3.6.1.4.1.1129.5.111396399361969898205364400549799252857606", "versionId": "MTY4MzA2MDQzOTI5NjIxMDAwMA", "modality": "CT", "storageClass": "STANDARD", }, "data": "cHJvamVjdHMvbXlwcm9qZWN0L2xvY2F0aW9ucy91cy1jZW50cmFsMS9kYXRhc2V0cy9teS1kYXRhc2V0L2RpY29tU3RvcmVzL215LWRpY29tLXN0b3JlL2RpY29tV2ViL3N0dWRpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjExMTM5NjM5OTM2MTk2OTg5ODIwNTM2NDQwMDU0OTc5OTI1Mjg1NzYwNC9zZXJpZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE5NTYyODIxMzY5NDMwMDQ5ODk0Njc2MDc2NzQ4MTI5MTI2MzUxMTcyNC9pbnN0YW5jZXMvMS4zLjYuMS40LjEuMTExMjkuNS41LjE1Mzc1MTAwOTgzNTEwNzYxNDY2NjgzNDU2MzI5NDY4NDMzOTc0NjQ4MA==", "messageId": "7586159156345265", "publishTime": "YYYY-MM-DDTHH:MM:SS+ZZ:ZZ" } } ]
Migre de notificationConfig
para notificationConfigs
Para os utilizadores existentes do arquivo DICOM, se estiver a usar o campo notificationConfig
para configurar o tópico do Pub/Sub, deve migrar para o campo notificationConfigs
. Seguem-se as principais diferenças:
O
dicomStore.notificationConfig
só suporta um subscritor, enquanto odicomStore.notificationConfigs
suporta vários subscritores.O
dicomStore.notificationConfig
usaNotificationConfig
, que está a ser descontinuado e substituído porDicomNotificationConfig
.dicomStore.notificationConfigs
suporta o envio automático de notificações para todas as operações DICOM disponíveis, comoImportDicomData
,DeleteInstances
e outras. Consequentemente, o atributoNotificationConfig.sendForBulkImport
já não é suportado.Se quiser escolher as mensagens que recebe ou filtrar mensagens indesejadas para um subscritor específico, pode usar a funcionalidade Filtrar mensagens de uma subscrição. Por exemplo, pode usar
attributes.action != "ImportDicomData"
para filtrar todas as mensagens enviadas a partir da operaçãoImportDicomData
.REST
Use o método
dicomStores.patch
e parta do princípio de que já tem um tópico definido na sua loja através denotificationConfig
.Antes de usar qualquer um dos dados do pedido, faça as seguintes substituições:
PROJECT_ID
: o ID do seu Google Cloud projetoLOCATION
: a localização do conjunto de dadosDATASET_ID
: o conjunto de dados principal do arquivo DICOMDICOM_STORE_ID
: o ID da loja DICOM
Corpo JSON do pedido:
{ "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_1", }, { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_2", } ] }
Para enviar o seu pedido, escolha uma destas opções:
curl
Guarde o corpo do pedido num ficheiro denominado
request.json
. Execute o seguinte comando no terminal para criar ou substituir este ficheiro no diretório atual:cat > request.json << 'EOF' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_1", }, { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_2", } ] } EOF
Em seguida, execute o seguinte comando para enviar o seu pedido 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,notificationConfigs"PowerShell
Guarde o corpo do pedido num ficheiro denominado
request.json
. Execute o seguinte comando no terminal para criar ou substituir este ficheiro no diretório atual:@' { "notificationConfigs": [ { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_1", }, { "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC_SAMPLE_2", } ] } '@ | Out-File -FilePath request.json -Encoding utf8
Em seguida, execute o seguinte comando para enviar o seu pedido 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,notificationConfigs" | Select-Object -Expand ContentExplorador de APIs
Copie o corpo do pedido e abra a página de referência do método. O painel APIs Explorer é aberto no lado direito da página. Pode interagir com esta ferramenta para enviar pedidos. Cole o corpo do pedido nesta ferramenta, preencha todos os outros campos obrigatórios e clique em Executar.
Deve receber uma resposta semelhante à seguinte.
Se configurou campos no recurso
DicomStore
, estes também aparecem na resposta.
Cloud Healthcare API e política de armazenamento de mensagens do Pub/Sub
Para garantir que os seus dados da Cloud Healthcare API e os dados associados nas mensagens do Pub/Sub residem na mesma região, tem de definir uma política de armazenamento de mensagens do Pub/Sub.
Tem de definir explicitamente a política de armazenamento de mensagens no tópico do Pub/Sub configurado no repositório de dados para garantir que os dados permanecem na mesma região. Por exemplo, se o conjunto de dados da Cloud Healthcare API e o FHIR store estiverem em us-central1
, a política de armazenamento de mensagens só pode permitir a região us-central1
.
Para configurar uma política de armazenamento de mensagens, consulte o artigo Configurar políticas de armazenamento de mensagens.
Resolva problemas de mensagens do Pub/Sub em falta
Se não for possível publicar uma notificação no Pub/Sub, é registado um erro no Cloud Logging. Para mais informações, consulte o artigo Ver registos de erros nos Registos na nuvem.
Se a taxa de geração de erros exceder um limite, os erros que excedam o limite não são enviados para o Cloud Logging.
O que se segue?
- Lide com picos transitórios através do controlo de fluxo
- Resolva falhas de mensagens
- Repita e elimine mensagens
- Vista geral da arquitetura do Pub/Sub