DICOM-Pub/Sub-Benachrichtigungen konfigurieren

Auf dieser Seite wird beschrieben, wie Sie Pub/Sub verwenden, um Benachrichtigungen zu klinischen Ereignissen in einem DICOM-Speicher zu erhalten. Sie können Pub/Sub-Benachrichtigungen erhalten, wenn eine neue DICOM-Instanz in einem DICOM-Speicher gespeichert oder aus Cloud Storage importiert wird.

Sie können Pub/Sub-Benachrichtigungen für verschiedene Zwecke verwenden, z. B. zum Auslösen der nachgelagerten Verarbeitung oder zum Analysieren neuer Daten. Ein Modell für maschinelles Lernen kann beispielsweise Benachrichtigungen erhalten, wenn neue Daten für das Training verfügbar sind, und Erkenntnisse zur Verbesserung der Patientenversorgung generieren.

In der folgenden Abbildung sehen Sie, wie Pub/Sub-Benachrichtigungen generiert und veröffentlicht werden.

DICOM Pub/Sub-Benachrichtigungen.

Abbildung 1. Pub/Sub-Benachrichtigungen über klinische Ereignisse in einem DICOM-Speicher empfangen.

Abbildung 1 zeigt die folgenden Schritte:

  1. Ein Aufrufer stellt eine Anfrage zum Speichern oder Importieren einer DICOM-Instanz.
  2. Der DICOM-Speicher empfängt die Anfrage, erstellt eine Pub/Sub-Nachricht und sendet sie an das Pub/Sub-Thema, das für den DICOM-Speicher konfiguriert ist.
  3. Pub/Sub leitet die Nachricht an die Abos weiter, die dem Thema zugeordnet sind.
  4. Die Abonnenten erhalten die Nachricht über ihr Abo. Jedes Abo kann einen oder mehrere Abonnenten haben, um die Parallelität zu erhöhen.

Hinweise

  1. Thema erstellen
  2. Pull-Abo erstellen

Pub/Sub-Publisher-Berechtigungen hinzufügen

Damit Nachrichten von der Cloud Healthcare API in Pub/Sub veröffentlicht werden können, müssen Sie die Rolle pubsub.publisher zum Dienstkonto Ihres Projekts Cloud Healthcare-Dienst-Agent hinzufügen. Weitere Informationen finden Sie unter Pub/Sub-Berechtigungen für DICOM-, FHIR- und HL7v2-Speicher.

Benachrichtigungsformat und ‑inhalt

Eine Pub/Sub-Benachrichtigung enthält ein Message-Objekt mit Informationen zum klinischen Ereignis. Das Message-Objekt sieht in etwa so aus:

{
  "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"
  }
}

Weitere Informationen zu den Feldern, die in jeder Pub/Sub-Nachricht enthalten sind, finden Sie unter ReceivedMessage und PubsubMessage.

In der folgenden Tabelle werden die einzelnen Felder des attributes-Objekts beschrieben:

Attribut Beschreibung Beispiel
action Die Aktion, die für eine DICOM-Ressource ausgeführt wurde. Zulässige Werte:
  • StoreInstances
  • ImportDicomData
  • SetBlobSettings
  • DeleteInstances
StoreInstances
lastUpdatedTime Ein Zeitstempel der letzten Änderung der DICOM-Ressource. Der Zeitstempel verwendet das RFC 1123-Format. Mon, 01 Jan 2020 00:00:00 UTC
storeName Der vollständige Ressourcenname des DICOM-Speichers, in dem die Aktion ausgeführt wurde. projects/my-project/locations/us/datasets/my-dataset/dicomStores/my-dicom-store
studyInstanceUID Die eindeutige Kennung (Unique Identifier, UID) der DICOM-Studieninstanz. 1.2.3.4.5.6
seriesInstanceUID Die eindeutige Kennung (UID) der DICOM-Serieninstanz. 1.2.3.4.5.6
sopInstanceUID Die eindeutige Kennung (UID) der DICOM-SOP-Instanz. 1.2.3.4.5.6
versionId Die ID der aktuellen Version der DICOM-Ressource, auf die sich die Aktion bezieht. MTY4MzA2MDQzOTI5NjIxMDAwMA
modality Das Modalitätstag der DICOM-Ressource. Mögliche Werte:
  • CT
  • MR
  • MG
CT
storageClass Die Speicherklasse der DICOM-Ressource. Zulässige Werte:
  • STANDARD
  • NEARLINE
  • COLDLINE
  • ARCHIVE
STANDARD
previousStorageClass Die vorherige Speicherklasse der DICOM-Ressource. Zulässige Werte:
  • STANDARD
  • NEARLINE
  • COLDLINE
  • ARCHIVE
NEARLINE

In der folgenden Tabelle werden die verbleibenden Felder im message-Objekt beschrieben:

Feld Beschreibung
data Ein base64-codierter String der folgenden Kennung: projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID
messageId Eine Kennung für die Pub/Sub-Nachricht.
publishTime Der Zeitpunkt, zu dem der Pub/Sub-Server die Nachricht veröffentlicht hat.

Benachrichtigungen konfigurieren und ansehen

In diesem Abschnitt wird beschrieben, wie Sie Pub/Sub-Benachrichtigungen für einen DICOM-Speicher aktivieren, eine DICOM-Instanz speichern oder importieren, um eine Benachrichtigung zu veröffentlichen, und die Benachrichtigung ansehen.

DICOM-Speicher konfigurieren

Die folgenden Beispiele zeigen, wie Sie Pub/Sub-Benachrichtigungen für einen DICOM-Speicher aktivieren, wenn eine neue DICOM-Instanz gespeichert oder aus Cloud Storage importiert wird.

REST

Verwenden Sie die Methode projects.locations.datasets.dicomStores.patch.

Der Wert für NotificationConfig.sendForBulkImport ist true. Daher werden Benachrichtigungen gesendet, wenn Daten aus Cloud Storage importiert werden.

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID: die ID Ihres Google Cloud Projekts
  • LOCATION ist der Standort des Datasets
  • DATASET_ID ist das übergeordnete Dataset des DICOM-Speichers
  • DICOM_STORE_ID: die ID des DICOM-Speichers
  • PUBSUB_TOPIC: ein Pub/Sub-Thema, in dem Nachrichten veröffentlicht werden, wenn ein Ereignis in einem Datenspeicher auftritt

JSON-Text der Anfrage:

{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json. Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:

cat > request.json << 'EOF'
{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}
EOF

Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:

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

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json. Führen Sie folgenden Befehl im Terminal aus, um diese Datei im aktuellen Verzeichnis zu erstellen oder zu überschreiben:

@'
{
  "notificationConfig": {
    "pubsubTopic": "projects/PROJECT_ID/topics/PUBSUB_TOPIC",
    "sendForBulkImport": "true"
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

Führen Sie dann folgenden Befehl aus, um Ihre REST-Anfrage zu senden:

$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

APIs Explorer

Kopieren Sie den Anfragetext und öffnen Sie die Referenzseite für Methoden. Der API Explorer wird rechts auf der Seite geöffnet. Sie können mit diesem Tool interagieren, um Anfragen zu senden. Fügen Sie den Anfragetext in dieses Tool ein, füllen Sie alle Pflichtfelder aus und klicken Sie auf Ausführen.

Sie sollten eine Antwort ähnlich der folgenden erhalten:

Wenn Sie in der Ressource DicomStore Felder konfiguriert haben, werden diese auch in der Antwort angezeigt.

gcloud

Führen Sie den Befehl gcloud healthcare dicom-stores update aus.

Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

  • PROJECT_ID: die ID Ihres Google Cloud Projekts
  • LOCATION ist der Standort des Datasets
  • DATASET_ID ist das übergeordnete Dataset des DICOM-Speichers
  • DICOM_STORE_ID: die ID des DICOM-Speichers
  • PUBSUB_TOPIC: ein Pub/Sub-Thema, in dem Nachrichten veröffentlicht werden, wenn ein Ereignis in einem Datenspeicher auftritt

Führen Sie folgenden Befehl aus:

Linux, macOS oder 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

Sie sollten eine Antwort ähnlich der folgenden erhalten:

Antwort

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

DICOM-Instanz speichern oder importieren und Pub/Sub-Benachrichtigung ansehen

Führen Sie die folgenden Schritte aus, um eine DICOM-Instanz zu speichern oder zu importieren und die generierte Pub/Sub-Nachricht abzurufen:

  1. Speichern oder importieren Sie eine DICOM-Instanz. Durch die Anfrage wird die Cloud Healthcare API veranlasst, eine Nachricht im konfigurierten Pub/Sub-Thema zu veröffentlichen.

  2. Rufen Sie die Nachricht ab. Wenn Sie mehrere DICOM-Instanzen in einer einzelnen Anfrage importieren, wird für jede DICOM-Instanz eine Nachricht generiert.

    Informationen zu den Identity and Access Management-Berechtigungen, die zum Abrufen von Pub/Sub-Nachrichten erforderlich sind, finden Sie unter Zugriffssteuerung für Pub/Sub.

    REST

    Verwenden Sie die Methode projects.subscriptions.pull. Im folgenden Beispiel wird der Abfrageparameter ?maxMessages=10 verwendet, um die maximale Anzahl der Nachrichten anzugeben, die in der Anfrage zurückgegeben werden sollen. Passen Sie diesen Wert an Ihren Anwendungsfall an.

    Ersetzen Sie diese Werte in den folgenden Anfragedaten:

    • PROJECT_ID: die ID Ihres Google Cloud Projekts
    • PUBSUB_SUBSCRIPTION_ID: die ID des Abos, das an das im DICOM-Speicher konfigurierte Pub/Sub-Thema angehängt ist

    Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

    curl

    Führen Sie folgenden Befehl aus:

    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

    Führen Sie folgenden Befehl aus:

    $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

    APIs Explorer

    Öffnen Sie die Methodenreferenzseite. Der API Explorer wird rechts auf der Seite geöffnet. Sie können mit diesem Tool interagieren, um Anfragen zu senden. Füllen Sie die Pflichtfelder aus und klicken Sie auf Ausführen.

    Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

    gcloud

    Führen Sie den Befehl gcloud pubsub subscriptions pull aus.

    Im Beispiel werden die folgenden Google Cloud CLI-Flags verwendet:

    • --limit=10: Gibt maximal 10 Nachrichten zurück. Passen Sie diesen Wert an Ihren Anwendungsfall an.
    • --format=json: Rendert die Ausgabe als JSON.
    • --auto-ack: Jede abgerufene Nachricht wird automatisch bestätigt.

    Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

    • PROJECT_ID: die ID Ihres Google Cloud Projekts
    • PUBSUB_SUBSCRIPTION_ID: die ID des Abos, das an das im DICOM-Speicher konfigurierte Pub/Sub-Thema angehängt ist

    Führen Sie folgenden Befehl aus:

    Linux, macOS oder 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

    Sie sollten eine Antwort ähnlich der folgenden erhalten:

    [
      {
        "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"
        }
      }
    ]
    

Cloud Healthcare API und Pub/Sub-Nachrichtenspeicherrichtlinie

Um sicherzustellen, dass sich die Cloud Healthcare API-Daten und die zugehörigen Daten in Pub/Sub-Nachrichten in derselben Region befinden, müssen Sie eine Pub/Sub-Nachrichtenspeicherrichtlinie festlegen.

Sie müssen die Nachrichtenspeicherrichtlinie für das im Datenspeicher konfigurierte Pub/Sub-Thema explizit festlegen, damit die Daten in derselben Region bleiben. Wenn sich Ihr Cloud Healthcare API-Dataset und Ihr FHIR-Speicher beispielsweise in us-central1 befinden, darf die Nachrichtenspeicherrichtlinie nur die Region us-central1 zulassen.

Informationen zum Konfigurieren einer Richtlinie für den Nachrichtenspeicher finden Sie unter Richtlinien für den Nachrichtenspeicher konfigurieren.

Fehlerbehebung bei fehlenden Pub/Sub-Nachrichten

Wenn eine Benachrichtigung nicht in Pub/Sub veröffentlicht werden kann, wird ein Fehler in Cloud Logging in Logs erfasst. Weitere Informationen finden Sie unter Fehlerlogs in Cloud Logging ansehen.

Wenn die Fehlergenerierungsrate ein Limit überschreitet, werden Fehler, die dieses Limit überschreiten, nicht an Cloud Logging gesendet.

Nächste Schritte