Service Bus: Queues, Topics und Zugriff¶
Die Integration Platform bietet Azure Service Bus als gemeinsamen Messaging-Service. Du legst keinen eigenen Namespace an. Du beschreibst die queues, topics und subscriptions, die dein workload braucht, in JSON-Dateien, öffnest einen pull request, und die Plattform legt sie an, ebenso die Entra-ID-Gruppen, die steuern, wer senden und empfangen darf. Diese Seite richtet sich an Workload-Teams. Für Operatoren: siehe Service-Bus-Automatisierung (Plattformseite).
Optionales Angebot, pro Plattform festgelegt
Ob der Shared Service Service Bus verfügbar ist, in welchen Umgebungen und mit welchen Optionen, hängt von deiner Plattform ab. Namen, Standardwerte und Gruppenmuster auf dieser Seite sind die üblichen Werte des Referenzdesigns. Frag dein Plattform-Team.
So funktioniert es¶
Drei Schichten arbeiten zusammen (ADR-012):
| Schicht | Was sie tut | Wer sie betreibt |
|---|---|---|
| Shared Service | Der Service-Bus-Namespace (Premium) und sein Netzwerk. Keine Entitäten. | Plattform-Team |
| Spoke extension | Gibt deinem spoke die Rechte, die er auf dem Namespace braucht, wenn der spoke deployt wird (Spoke extensions) | Plattform-Team, mit dem spoke-Deployment |
| Service-Bus-Automatisierung | Legt deine queues, topics und subscriptions aus JSON-Dateien an, und die Zugriffsgruppen pro Entität | Integration platform engineers, aus deinen pull requests |
flowchart LR
json["queues.json, topics.json,<br/>workload.json<br/>(your pull request)"] --> auto["Service Bus automation"]
auto -->|"creates"| ent["Queues, topics,<br/>subscriptions"]
auto -->|"creates"| grp["Entra ID groups<br/>per entity and role"]
grp -->|"role assignment"| ent
you["Your team"] -->|"adds managed identities<br/>to the groups"| grp
app["Logic App, Function App,<br/>Container App"] -->|"Entra ID, private endpoint"| ent
Der Namespace ist nur über einen private endpoint erreichbar. Verbinde dich mit Entra ID, nicht mit Connection Strings oder Keys.
Queues definieren¶
Lege irgendwo unter deinem Konfigurationsordner eine Datei an, die genau queues.json heißt. Eine Datei enthält ein queue-Objekt oder eine
Liste von queue-Objekten. Behalte den Dateinamen: Die Automatisierung sammelt jede queues.json (und topics.json) im
Ordner und allen Unterordnern, du kannst Ordner also pro workload, Domäne oder Umgebung organisieren. Doppelte Definitionen derselben
queue in verschiedenen Ordnern sind zu vermeiden.
{
"workload": "orders",
"name": "intake",
"max_delivery_count": 10
}
| Feld | Pflicht | Standard | Bedeutung |
|---|---|---|---|
workload |
ja | Der workload, dem die queue gehört. Muss zu einer Workload-Definition passen (siehe unten). | |
name |
ja | Name der queue. Die queue in Azure heißt sbq-<workload>-<name>. |
|
max_delivery_count |
nein | 10 | Zustellversuche, bevor eine Nachricht in die Dead-Letter-Queue geht |
lock_duration |
nein | PT1M |
Sperrzeit, während ein Receiver eine Nachricht verarbeitet (ISO-8601-Dauer) |
max_size_in_megabytes |
nein | 1024 | Größe der queue |
requires_session |
nein | false | Session-fähige queue |
requires_duplicate_detection |
nein | false | Duplicate Detection, mit duplicate_detection_history_time_window (Standard PT10M) |
dead_lettering_on_message_expiration |
nein | false | Abgelaufene Nachrichten in die Dead-Letter-Queue verschieben |
forward_dead_lettered_messages_to |
nein | keiner | Dead-Letter-Nachrichten an eine andere Entität weiterleiten |
default_message_ttl, auto_delete_on_idle, max_message_size_in_kilobytes, partitioning_enabled, express_enabled, batched_operations_enabled, status |
nein | siehe Modul | Weitere Service-Bus-Eigenschaften, durchgereicht |
Topics, subscriptions und rules definieren¶
Ein topic gehört dem workload, der veröffentlicht. Jede subscription nennt den workload, der konsumiert.
{
"workload": "orders",
"name": "order-created",
"subscriptions": [
{
"workload": "billing",
"name": "billing",
"rules": [
{
"name": "only-eu",
"filter_type": "SqlFilter",
"sql_filter": "region = 'EU'"
}
]
}
]
}
| Feld | Hinweise |
|---|---|
| Topic-Felder | workload, name, support_ordering (Standard false), requires_duplicate_detection, max_size_in_megabytes (Standard 1024) und dieselben durchgereichten Eigenschaften wie bei queues |
| Subscription-Felder | workload, name, max_delivery_count (Standard 10), dead_lettering_on_filter_evaluation_error (Standard true), lock_duration (Standard PT1M), requires_session und mehr |
| Rules | name und filter_type. SqlFilter nimmt sql_filter. CorrelationFilter nimmt ein correlation_filter-Objekt (correlation_id, label, message_id, to, reply_to, session_id, content_type, properties). Eine optionale action. |
Namen in Azure: topic sbt-<workload>-<name>, subscription sbts-<subscription workload>-<subscription name>.
Eine queue pro subscription (Standard)¶
Für jede subscription legt die Automatisierung außerdem eine queue mit dem Namen sbq-<subscription workload>-<topic name>-<subscription name> an
und leitet die subscription dorthin weiter. Du hörst auf diese queue, nicht auf die subscription. Das ist
ADR-008. Es gibt dir:
- Dead-Lettering auf einer queue, die nur deinem workload gehört;
- einen Retry einer fehlgeschlagenen Nachricht, ohne sie erneut an das topic zu senden, sodass andere Subscriber sie nicht doppelt erhalten;
- ein einfacheres Modell: Du musst nur wissen, wie man aus einer queue liest.
Die queue erbt ihre Größen- und Duplicate-Detection-Einstellungen vom topic. Das Verhalten ist ein Schalter der Automatisierung
(auto_generate_queue_for_topic_subscription, Standard true). Hat das Plattform-Team ihn ausgeschaltet, lesen Receiver stattdessen aus der
subscription.
Den workload definieren¶
Jeder workload, der in einer Datei auftaucht, braucht eine Workload-Definition (workload.json) mit dem Namen und den Identitäten seines spokes, damit die
Automatisierung weiß, wessen Service Principal und Gruppen sie verwenden soll. Frag dein Plattform-Team, wer diese Datei pflegt und wo sie liegt. Die Felder, die die Automatisierung liest, sind name, service_principal_object_id, owner_group_id,
contributor_group_id und reader_group_id. Wird ein workload in einer queue oder einem topic verwendet, hat aber keine Definition, schlägt der plan fehl.
Wer was darf: Gruppen¶
Für jede Entität legt die Automatisierung Entra-ID-Gruppen in der Administrative Unit der Plattform an. Dein Team ist Owner der Gruppen (über den Service Principal deines spokes) und verwaltet die Mitgliedschaft.
| Gruppe | Angelegt für | Rolle, die sie bekommt | Mitglieder bei der Erstellung |
|---|---|---|---|
| Sender-Gruppe | Jede queue und jedes topic | Azure Service Bus Data Sender auf dieser Entität |
Leer. Du fügst managed identities und Service Principals hinzu. |
| Receiver-Gruppe | Jede queue und jede subscription, die nicht an eine queue weitergeleitet wird | Azure Service Bus Data Receiver auf dieser Entität |
Leer. Du fügst Identitäten hinzu. |
| Operators-Gruppe | Einmal pro workload | Sender- und Receiver-Rechte auf jeder Entität des workloads, für Support-Aktionen wie das manuelle erneute Senden einer fehlgeschlagenen Nachricht | Die Owners- und Contributors-Gruppen deines Workload-spokes |
Die Namen folgen einem Muster, das das Plattform-Team festlegt, mit {workload} und {entity} als Platzhaltern. Das Referenz-
muster ist integration-workload-{workload}-{entity}-sender und ...-receiver, wobei die Entität der Azure-Name der
queue oder des topics ist, zum Beispiel sbq-orders-intake. Frag dein Plattform-Team nach dem Muster deiner Plattform.
Die Readers-Gruppe deines spokes wird außerdem der schreibgeschützten Gruppe der Plattform für den Namespace hinzugefügt, damit Reader den Namespace im Portal sehen können.
Einer Anwendung Zugriff geben¶
- Finde die Gruppe für Entität und Rolle (zum Beispiel die Sender-Gruppe von
sbq-orders-intake). Dein Plattform-Team kann dir die Objekt-IDs geben (die Automatisierung gibt sie pro workload aus). - Füge die managed identity deiner Logic App, Function App oder Container App in Microsoft Entra ID zur Gruppe hinzu.
- Warte ein paar Minuten. Eine Gruppenänderung braucht kurz, bis sie am Namespace wirkt.
- Verbinde dich mit dem Hostnamen des Namespaces (
<namespace>.servicebus.windows.net) und Entra-ID-Authentifizierung.
Dafür brauchst du keinen pull request. Das ist der Sinn des Gruppenmodells (ADR-005). Du brauchst aber eine Firewallregel, wenn der Sender außerhalb deines spokes liegt oder der Traffic nicht bereits erlaubt ist (Firewallregeln und IP groups).
Füge Identitäten nicht im Portal zu den Entitätsrollen hinzu
Gib Zugriff über die Gruppen. Eine Rollenzuweisung, die jemand direkt auf einer queue hinzufügt, ist nicht Teil des Codes, und das nächste Deployment kann sie entfernen oder einen Zustand hinterlassen, den niemand prüfen kann.
Entitäten ändern oder entfernen¶
Ändere das JSON und öffne einen pull request. Lies den plan des pull requests, um zu sehen, was passiert.
- Die meisten Eigenschaften ändern sich direkt.
- Das Entfernen einer queue, eines topics oder einer subscription entfernt auch ihre Gruppen und löscht die Nachrichten darin.
- Eine Namensänderung legt eine neue Entität an und entfernt die alte.
- Partitionierung eines laufenden Namespaces ist eine Änderung mit Auswirkung auf Daten. Frag zuerst das Plattform-Team.
Wie aus dem pull request eine Änderung wird: Anfragen und Änderungen.
Betriebshinweise für Workload-Teams¶
| Thema | Was du wissen solltest |
|---|---|
| Verfügbarkeit | Der Premium-Namespace ist standardmäßig zonenredundant. Geo-Disaster-Recovery ist eine optionale Maßnahme der Plattform (Verfügbarkeit). |
| Durchsatz | Messaging Units skaliert das Plattform-Team manuell. Das Skalieren kann Verbindungen kurz zurücksetzen, also implementiere einen Retry in deinem Client. |
| Dead Letters | Beobachte das Wachstum der Dead Letters auf deinen queues. Alerting auf dem Namespace liegt bei der Plattform. Alerts zu deiner Anwendung liegen bei dir. |
| Gemeinsame Nutzung | Mehrere workloads teilen sich einen Namespace. Gruppen auf Entitätsebene halten sie getrennt: Deine Gruppe gibt keinen Zugriff auf die queue eines anderen workloads. |