Batchbearbetning av meddelanden i en transaktion
I köade program används transaktioner för att säkerställa korrekthet och tillförlitlig leverans av meddelanden. Transaktioner är dock dyra åtgärder och kan avsevärt minska dataflödet för meddelanden. Ett sätt att förbättra dataflödet för meddelanden är att låta ett program läsa och bearbeta flera meddelanden i en enda transaktion. Kompromissen är mellan prestanda och återställning: när antalet meddelanden i en batch ökar, ökar också mängden återställningsarbete som krävs om transaktionerna återställs. Det är viktigt att notera skillnaden mellan batchmeddelanden i en transaktion och sessioner. En session är en gruppering av relaterade meddelanden som bearbetas av ett enda program och bekräftas som en enda enhet. Sessioner används vanligtvis när en grupp med relaterade meddelanden måste bearbetas tillsammans. Ett exempel på detta är en webbplats för onlineshopping. Batchar används för att bearbeta flera orelaterade meddelanden på ett sätt som ökar meddelandeflödet. Mer information om sessioner finns i Gruppera köade meddelanden i en session. Meddelanden i en batch bearbetas också av ett enda program och bekräftas som en enda enhet, men det kanske inte finns någon relation mellan meddelandena i batchen. Batchbearbetning av meddelanden i en transaktion är en optimering som inte ändrar hur programmet körs.
Ange batchläge
Slutpunktsbeteendet TransactedBatchingBehavior styr batchbearbetningen. Om du lägger till det här slutpunktsbeteendet i en tjänstslutpunkt uppmanas Windows Communication Foundation (WCF) att batcha meddelanden i en transaktion. Alla meddelanden kräver inte en transaktion, så endast meddelanden som kräver en transaktion placeras i en batch och endast meddelanden som skickas från åtgärder som har markerats med TransactionScopeRequired
= true
och TransactionAutoComplete
= true
beaktas för en batch. Om alla åtgärder i tjänstkontraktet har markerats med TransactionScopeRequired
= false
och TransactionAutoComplete
= false
, anges aldrig batchningsläget.
Checka in en transaktion
En batchbaserad transaktion bekräftas baserat på följande:
MaxBatchSize
. En egenskap för beteendet TransactedBatchingBehavior . Den här egenskapen avgör det maximala antalet meddelanden som placeras i en batch. När det här talet har nåtts checkas batchen in. Det här är ett värde som inte är en strikt gräns. Det är möjligt att checka in en batch innan du tar emot det här antalet meddelanden.Transaction Timeout
. När 80 procent av transaktionens tidsgräns har gått ut checkas batchen in och en ny batch skapas. Det innebär att om 20 procent eller mindre av den tid som ges för att en transaktion ska slutföras kvarstår, checkas batchen in.TransactionScopeRequired
. När du bearbetar en batch med meddelanden, om WCF hittar en som harTransactionScopeRequired
=false
, checkar den in batchen och öppnar en ny batch igen vid mottagandet av det första meddelandet medtrue
=TransactionScopeRequired
och .TransactionAutoComplete
=true
Om det inte finns fler meddelanden i kön checkas den aktuella batchen
MaxBatchSize
in, även om inte har nåtts eller om 80 procent av transaktionens tidsgräns inte har förflutit.
Lämnar batchläge
Om ett meddelande i en batch gör att transaktionen avbryts sker följande steg:
Hela batchen med meddelanden återställs.
Meddelanden läss en i taget tills antalet lästa meddelanden överskrider dubbelt så stor batchstorlek.
Batch-läget har angetts på nytt.
Välja batchstorlek
Storleken på en batch är programberoende. Den empiriska metoden är det bästa sättet att komma fram till en optimal batchstorlek för programmet. Det är viktigt att komma ihåg när du väljer en batchstorlek för att välja storlek enligt programmets faktiska distributionsmodell. När du till exempel distribuerar programmet, om du behöver en SQL-server på en fjärrdator och en transaktion som sträcker sig över kön och SQL-servern, bestäms batchstorleken bäst genom att köra den här exakta konfigurationen.
Samtidighet och batchbearbetning
Om du vill öka dataflödet kan du också låta många batchar köras samtidigt. Genom att ange ConcurrencyMode.Multiple
i ServiceBehaviorAttribute
aktiverar du samtidig batchbearbetning.
Tjänstbegränsning är ett tjänstbeteende som används för att ange hur många maximala samtidiga anrop som kan göras på tjänsten. När det används med batchbearbetning tolkas detta som hur många samtidiga batchar som kan köras. Om tjänstbegränsningen inte har angetts, är WCF standardvärdet för de maximala samtidiga anropen till 16. Om batchbearbetningsbeteendet har lagts till som standard kan högst 16 batchar vara aktiva samtidigt. Det är bäst att justera tjänstbegränsningen och batchbearbetningen baserat på din kapacitet. Om kön till exempel har 100 meddelanden och en batch på 20 önskas är det inte användbart att ha maximalt antal samtidiga anrop inställda på 16 eftersom 16 transaktioner kan vara aktiva beroende på dataflöde, ungefär som att inte ha batchbearbetning aktiverat. När du finjusterar prestandan har du därför antingen inte samtidig batchbearbetning eller har samtidig batchbearbetning med rätt storlek på tjänstbegränsningen.
Batchbearbetning och flera slutpunkter
En slutpunkt består av en adress och ett kontrakt. Det kan finnas flera slutpunkter som delar samma bindning. Det är möjligt för två slutpunkter att dela samma bindning och lyssna på URI (Uniform Resource Identifier) eller köadress. Om två slutpunkter läser från samma kö och transacted batching-beteende läggs till i båda slutpunkterna kan det uppstå en konflikt i de angivna batchstorlekarna. Detta löses genom att implementera batchbearbetning med den minimala batchstorlek som anges mellan de två transacted batching-beteendena. Om en av slutpunkterna i det här scenariot inte anger transacted batching använder båda slutpunkterna inte batchbearbetning.
Exempel
I följande exempel visas hur du anger TransactedBatchingBehavior
i en konfigurationsfil.
<behaviors>
<endpointBehaviors>
<behavior name="TransactedBatchingBehavior"
maxBatchSize="100" />
</endpointBehaviors>
</behaviors>
I följande exempel visas hur du anger TransactedBatchingBehavior in-koden.
using (ServiceHost serviceHost = new ServiceHost(typeof(OrderProcessorService)))
{
ServiceEndpoint sep = ServiceHost.AddServiceEndpoint(typeof(IOrderProcessor), new NetMsmqBinding(), "net.msmq://localhost/private/ServiceModelSamplesTransacted");
sep.Behaviors.Add(new TransactedBatchingBehavior(100));
// Open the ServiceHost to create listeners and start listening for messages.
serviceHost.Open();
// The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostB to shut down the service.
serviceHost.Close();
}