sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server Service Broker

Samtalegrupper er lokale Kun koncept, udelukkende brugt til låsning:korrelerede samtaler hører hjemme i en gruppe, så mens du behandler en besked på en samtale, kan en anden tråd ikke behandle en korreleret besked. Der er ingen information om samtalegrupper udvekslet af de to endepunkter, så i dit eksempel ender alle initiativtagerendepunkter med at tilhøre én samtalegruppe, men målendepunkterne er hver en særskilt samtalegruppe (hver gruppe har kun én samtale). Grunden til, at systemet opfører sig sådan, er, at samtalegrupper er designet til at løse et problem som f.eks. en rejsebestillingstjeneste:når den modtager en besked om at "bestille en rejse", skal den reservere et fly, et hotel og en bil leje. Den skal sende tre beskeder, en til hver af disse tjenester ('fly', 'hoteller', 'biler'), og så vil svarene komme tilbage, asynkront. Når de vender tilbage, skal behandlingen sikre, at de ikke behandles samtidigt af separate tråde, som hver især ville forsøge at opdatere 'rejse'-poststatus. I meddelelser er dette problem kendt som 'meddelelseskorrelationsproblem'.

Men ofte er samtalegrupper udrullet i SSB udelukkende af præstationsmæssige årsager:de tillader større RECEIVE-resultater. Målendepunkter kan flyttes sammen til en gruppe ved at bruge FLYT SAMTALE men i praksis er der et meget enklere trick:vende samtalens retning. Få din destination start samtalerne (grupperet), og kilden sender sine 'opdateringer' på den eller de samtaler, der er startet af destinationen.

Nogle bemærkninger:

  • Brug ikke brand-og-glem-mønsteret BEGIN/SEND/END. Du gør det umuligt at diagnosticere ethvert problem i fremtiden, se Fire and Forget:Godt for militæret, men ikke for Service Broker-samtaler .
  • Brug aldrig MED CLEANUP i produktionskoden. Det er beregnet til administrativ sidste udvej som f.eks. katastrofeoprettelse. Hvis du misbruger det, nægter du SSB enhver chance for at spore beskeden korrekt for korrekt levering igen (hvis beskeden hopper på målet, uanset årsag, vil den gå tabt for altid).
  • SSB garanterer ikke rækkefølge på tværs af samtaler, kun inden for én samtale. At starte en ny samtale for hver INSERT-hændelse garanterer ikke, at rækkefølgen af ​​indsætningsoperationer bevares på målet.



  1. 10 tidsbesparende genveje i Microsoft Access

  2. Grænse for tilstanden WHERE col IN (...).

  3. Sådan begrænser du resultater i Oracle

  4. Spring Batch ORA-08177:kan ikke serialisere adgang til denne transaktion, når der køres enkeltjob, SERIELISERET isolationsniveau