Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Managed Instance
Service Broker maakt gebruik van een brokerspecifiek protocol om te communiceren met externe brokers. De broker beheert verbindingen afzonderlijk van de normale groep clientverbindingen. Als u wilt dat twee SQL Server-exemplaren Service Broker-berichten uitwisselen, moet elk exemplaar TCP/IP-verkeer kunnen verzenden naar de poort die het andere exemplaar gebruikt voor Service Broker-communicatie. Service Broker maakt vaak gebruik van poort 4022 voor broker-to-broker-communicatie. De exacte poort wordt echter opgegeven wanneer het eindpunt wordt gemaakt.
Protocollagen
Service Broker heeft een gelaagde benadering van communicatie. Elke laag bouwt voort op de onderliggende laag om betrouwbare levering te garanderen. Met deze aanpak kan een toepassing werken zonder kennis van de locatie van de externe service of het fysieke transport dat de broker gebruikt om te communiceren. In de meeste gevallen zijn deze protocollen transparant voor een toepassing. Het begrijpen van de rol die elke protocollaag speelt, kan echter helpen bij het oplossen van problemen met een toepassing.
Het protocol op het hoogste niveau dat door de broker wordt gebruikt, is het dialoogvensterprotocol. De protocollaag van het dialoogvenster verwerkt betrouwbare, gesequentieerde berichtoverdracht. De protocollaag van het dialoogvenster genereert volgnummers voor berichten, genereert bevestigingsberichten, levert berichten aan de juiste wachtrijen en fragmenten en herassembleert berichten. Het dialoogvensterprotocol verwerkt verificatie en versleuteling voor een dialoogvenster.
Het dialoogvensterprotocol maakt gebruik van het aangrenzende brokerprotocol om berichtfragmenten te verzenden. Het aangrenzende brokerprotocol verwerkt de netwerkoverdrachten die worden uitgewisseld tussen twee brokerexemplaren.
Het aangrenzende brokerprotocol maakt gebruik van een transportprotocol, zoals TCP/IP, om berichten van broker naar broker te verplaatsen.
Dialoogvensterprotocol
Het dialoogvensterprotocol beheert het EOIO-bezorgingspatroon (Exactly-Once-In-Order) voor berichten in een gesprek. Dit protocol beschrijft niet de indeling die Service Broker-berichten in het netwerk gebruiken. In plaats daarvan geeft het protocol de logische stappen op die vereist zijn voor een betrouwbaar gesprek. Het dialoogvensterprotocol verwerkt de taken die vereist zijn voor betrouwbare bezorging, inclusief het genereren en verwerken van bevestigingsberichten.
Elke kant van een gesprek is een eindpunt in de dialoogvensterprotocollaag De catalogusweergave sys.conversation_endpoints toont informatie over eindpunten van dialoogvensterprotocollen. Er bestaat een gesprekseindpunt voor de levensduur van het gesprek.
Aangrenzend brokerprotocol
De aangrenzende brokerprotocollaag verwerkt de communicatiemechanismen tussen twee SQL Server-exemplaren. Deze laag codeert elk berichtfragment in een standaardindeling die geschikt is voor verzending via het netwerk. In tegenstelling tot de protocollaag van het dialoogvenster is de aangrenzende protocollaag op de hoogte van het gebruikte netwerktransport en worden de berichtfragmenten op de juiste manier opgemaakt. In feite biedt de aangrenzende brokerprotocollaag een abstractielaag tussen de dialoogprotocollaag en de transportprotocollaag.
Elke Service Broker-netwerkverbinding is een eindpunt in de aangrenzende protocollaag. In de dynamische beheerweergave sys.dm_broker_connections ziet u informatie over Service Broker-netwerkverbindingen. Service Broker onderhoudt de netwerkverbinding terwijl berichten actief worden uitgewisseld. Service Broker sluit de netwerkverbinding wanneer er gedurende korte tijd geen berichten via de netwerkverbinding zijn verzonden of ontvangen.
Transportprotocol
De transportprotocollaag verwerkt de werkelijke netwerktransmissie. Deze laag valt buiten Service Broker. Berichten naar een broker die wordt uitgevoerd in een ander exemplaar van SQL Server, gebruiken bijvoorbeeld TCP/IP als transportprotocollaag.
Service Broker-eindpunten stellen opties in voor het transportprotocol. SQL Server bevat standaard geen Service Broker-eindpunten. Zie Service Broker-netwerken activeren voor meer informatie over het maken van een Service Broker-eindpunt.
Service Broker-berichtverwerking
Service Broker maakt gebruik van twee verschillende categorieën berichten. Een gesequentieerd bericht is een bericht dat precies eenmaal in een toepassing moet worden bezorgd, in volgorde. Een bericht dat niet wordt weergegeven, is een bericht dat onmiddellijk kan worden verwerkt, ongeacht de volgorde waarin het bericht binnenkomt.
Service Broker maakt gebruik van gesequentieerde berichten voor alle door de gebruiker gedefinieerde berichttypen, einddialoogvensters en foutberichten die zijn gemaakt door een toepassing. Elk gesequentieerd bericht heeft een volgnummer. Het exemplaar dat het bericht afkomstig is, maakt het nummer van de berichtenreeks en wijst het volgnummer toe aan het bericht. De ontvangende broker gebruikt het volgnummer van het bericht om de berichten te orden die aan een toepassing worden verstrekt. Voor een bepaald dialoogvenster ontvangt de toepassing altijd het bericht met het laagste volgnummer eerst. Service Broker gebruikt ook het volgnummer van het bericht om dubbele berichten te detecteren. Wanneer de protocollaag van het dialoogvenster twee berichten ontvangt in hetzelfde dialoogvenster met hetzelfde volgnummer, wordt in de protocollaag van het dialoogvenster rekening gebracht met de berichten als duplicaten en wordt er een verwijderd.
Service Broker maakt gebruik van niet-opeenvolgende berichten voor toegewezen bevestigingsberichten en foutberichten die zijn gemaakt door Service Broker. Service Broker neemt geen speciale voorzorgsmaatregelen om een ondoorzichtig bericht te bezorgen. Service Broker maakt echter niet-volgordelijke berichten als reactie op binnenkomende berichten. Als het bericht dat niet wordt weergegeven, verloren gaat, probeert de afzender het oorspronkelijke bericht opnieuw; de geadresseerde genereert vervolgens een ander niet-verzonden bericht.
Berichtfragmentatie
Service Broker splitst uitgaande berichten in fragmenten en combineert binnenkomende fragmenten in het oorspronkelijke bericht. Voor kleine berichten bevindt het hele bericht zich in één fragment. Voor grote berichten maakt Service Broker veel fragmenten.
Het fragmenteren van berichten heeft verschillende voordelen. Het verzenden van een groot bericht in kleine fragmenten verbetert de algehele snelheid en betrouwbaarheid bij het communiceren via relatief trage en onbetrouwbare netwerken zoals Wide-Area Networks (WAN's). Als een fragment van het bericht verloren gaat, wordt er slechts één fragment door het protocol verzonden in plaats van het volledige bericht. Het fragmenteren van grote berichten kan ook de tijd verkorten die een klein bericht nodig heeft om de bestemming te bereiken. Service Broker kan een fragment verzenden dat een volledig klein bericht bevat tussen fragmenten van een groot bericht. Dit vertraagt het grote bericht enigszins om de tijd te verkorten waarop het kleine bericht moet worden verzonden.
Terwijl een bericht opnieuw wordtassembleerd, wordt het gedeeltelijke bericht opgeslagen in de doelwachtrij. Als de doelwachtrij niet beschikbaar is, wordt deze opgeslagen in de overdrachtswachtrij. Een gedeeltelijk bericht kan niet worden ontvangen door een toepassing. De status kolom voor een gedeeltelijk bericht is ingesteld op 2 (Uitgeschakeld). Deze waarde wordt ook gebruikt voor berichten die niet op volgorde zijn ontvangen.
Berichtbevestiging
Service Broker bevestigt elk ontvangen bericht. Een bevestiging kan een of meer berichtfragmenten bevestigen. Indien mogelijk wordt een bevestiging opgenomen in de koptekst van een bericht dat wordt geretourneerd in hetzelfde gesprek. Als er geen andere berichten kunnen worden verzonden, retourneert Service Broker een speciaal bevestigingsbericht. Berichtbevestiging wordt volledig verwerkt door Service Broker; een toepassing die gebruikmaakt van Service Broker, ontvangt deze berichten niet.
Een afzender bewaart berichtfragmenten die de ontvanger niet heeft bevestigd. Als er geen bevestiging wordt ontvangen binnen een door het systeem gedefinieerde wachttijd, verzendt de afzender het berichtfragment opnieuw. Als er tijdens de wachttijd geen bevestiging wordt ontvangen, verhoogt Service Broker exponentieel de hoeveelheid tijd vóór de volgende nieuwe poging, tot een maximale wachttijd. De eerste wachttijd voor een nieuwe poging is een paar seconden. De maximale wachttijd is ongeveer één minuut. De wachttijd is niet bedoeld om precies te zijn; afhankelijk van het netwerkverkeer en de andere activiteit in het SQL Server-exemplaar, wordt een berichtfragment mogelijk enkele seconden niet opnieuw geprobeerd nadat de wachttijd is verlopen.
Als een bevestiging verloren of vertraagd is, ontvangt de geadresseerde mogelijk dubbele berichten. In dit geval bevestigt de geadresseerde de ontvangst van het dubbele bericht, maar levert het dubbele bericht niet aan de wachtrij.
Service Broker gebruikt berichtbevestiging om betrouwbare berichten te bieden zonder gedistribueerde transacties. Een geadresseerde verzendt pas een bevestiging nadat het bericht of berichtfragment is toegevoegd aan de wachtrij. De afzender bevat het bericht in de verzendwachtrij totdat de bevestiging voor dat bericht binnenkomt. Hoewel de afzender en de ontvanger nooit een transactie delen, garandeert het protocol dat de afzender het bericht pas uit de verzendwachtrij verwijdert nadat de ontvanger het bericht heeft ontvangen.
Controle van berichtintegriteit
De indeling die Service Broker gebruikt om berichten te verzenden, bevat een integriteitscontrole voor berichten om te bepalen of een bepaald bericht is gewijzigd of beschadigd tijdens het transport.
De integriteitscontrole van het bericht is een MD5-handtekening voor de inhoud van het bericht. SQL Server versleutelt de handtekening met de sessiesleutel voor het bericht en bevat de handtekening in de berichtkoppen.
De bestemming voor het bericht ontsleutelt het bericht en vergelijkt vervolgens de handtekening in het bericht met een nieuwe handtekening die wordt berekend op basis van de ontvangen inhoud. Als de handtekeningen niet overeenkomen, is het bericht beschadigd of gemanipuleerd tijdens de verzending. Het bericht mislukt de integriteitscontrole van het bericht. SQL Server negeert het bericht en bevestigt het bericht niet aan de afzender. De gebeurtenisklasse Broker:Corrupted Message rapporteert informatie wanneer een bericht de integriteitscontrole van het bericht mislukt.
Service Broker-overdrachtsobjecten
Een Service Broker-overdrachtsobject is een in-memory object dat de status van berichtoverdrachten voor een dialoogvenster beheert en registreert. Elk gesprekseindpunt heeft één overdrachtsobject.
Een dialoogvenster vraagt een overdrachtsobject aan wanneer dit het volgende doet:
Hiermee wordt een bericht verzonden via de overdrachtswachtrij. Dit omvat het volgende:
Alle berichten die naar een extern exemplaar van de database-engine worden verzonden
Berichten naar verzonden wachtrijen in het lokale exemplaar als het bericht niet rechtstreeks kan worden ingevoegd in de doelwachtrij
Ontvangt een extern bericht of een bericht dat afkomstig is van een lokale transmissiewachtrij.
Er wordt een overdrachtsobject gemaakt wanneer er voor het eerst een dialoogvenster wordt aangevraagd. Service Broker gebruikt hetzelfde overdrachtsobject voor volgende aanvragen vanuit dat dialoogvenster. Verzendingsobjecten worden telkens gewijzigd wanneer Service Broker een wijziging moet vastleggen in de status van verzendingen voor het dialoogvenster. Transmissieobjecten zijn ongeveer 1 kB.
Om geheugen vrij te maken, slaat Service Broker periodiek batches van inactieve overdrachtsobjecten op in tempdb werktabellen. Wanneer een transmissieobject voor het eerst wordt gewijzigd in het geheugen, wordt het gemarkeerd als vuil. Het transmissieobject blijft gemarkeerd als vuil totdat het wordt leeggemaakt aan een werktafel.
Verzendingsobjecten worden niet gebruikt voor het verzenden of ontvangen van lokale berichten die rechtstreeks in de doelwachtrij kunnen worden ingevoegd.
Netwerkcommunicatiestroom
In de volgende afbeelding ziet u een weergave op hoog niveau van Service Broker-netwerkcommunicatie tussen twee SQL Server-exemplaren.
Het gesprek is een permanente, logische verbinding. Het gesprek kan gedurende een bepaalde periode plaatsvinden en gedurende die periode kan het gesprek een willekeurig aantal netwerkverbindingen gebruiken.
Netwerkverbindingen vinden plaats tussen twee Service Broker-eindpunten. Deze verbindingen maken gebruik van TCP/IP. Als de verbinding korte tijd inactief is, sluit SQL Server de netwerkverbinding.
Als u een bericht wilt bezorgen, bevat Service Broker het bericht in de overdrachtswachtrij voor de database die het bericht heeft verzonden. De geadresseerde levert het bericht rechtstreeks aan de wachtrij voor de doelservice. Als deze wachtrij is OFF, wordt het bericht tijdelijk in de transmissiewachtrij voor de ontvangende database bewaard. De wachtrij voor de verzendende service is niet betrokken bij de bewerking. De overdrachtswachtrij voor de database die als host fungeert voor de ontvangende service, is alleen betrokken als de doelwachtrij zich bevindt OFF.