Berichten in een transactie batcheren
Toepassingen in de wachtrij gebruiken transacties om de juistheid en betrouwbare bezorging van berichten te garanderen. Transacties zijn echter dure bewerkingen en kunnen de doorvoer van berichten aanzienlijk verminderen. Een manier om de doorvoer van berichten te verbeteren, is door een toepassing meerdere berichten binnen één transactie te laten lezen en verwerken. De afweging is tussen prestaties en herstel: naarmate het aantal berichten in een batch toeneemt, wordt de hoeveelheid herstelwerkzaamheden uitgevoerd die nodig zijn als transacties worden teruggedraaid. Het is belangrijk om het verschil te noteren tussen batchberichten in een transactie en sessies. Een sessie is een groepering van gerelateerde berichten die door één toepassing worden verwerkt en als één eenheid worden doorgevoerd. Sessies worden over het algemeen gebruikt wanneer een groep gerelateerde berichten samen moet worden verwerkt. Een voorbeeld hiervan is een website voor online winkelen. Batches worden gebruikt om meerdere, niet-gerelateerde berichten te verwerken op een manier die de doorvoer van berichten verhoogt. Zie Berichten in wachtrij groeperen in een sessie voor meer informatie over sessies. Berichten in een batch worden ook verwerkt door één toepassing en vastgelegd als één eenheid, maar er is mogelijk geen relatie tussen de berichten in de batch. Het batcheren van berichten in een transactie is een optimalisatie die niet verandert hoe de toepassing wordt uitgevoerd.
Batchverwerkingsmodus invoeren
Het TransactedBatchingBehavior gedrag van het eindpunt bepaalt batchverwerking. Als u dit eindpuntgedrag toevoegt aan een service-eindpunt, vertelt Windows Communication Foundation (WCF) aan batchberichten in een transactie. Niet alle berichten vereisen een transactie, dus alleen berichten waarvoor een transactie is vereist, worden in een batch geplaatst en alleen berichten die zijn verzonden vanuit bewerkingen die zijn gemarkeerd met TransactionScopeRequired
= true
en TransactionAutoComplete
= true
worden in aanmerking genomen voor een batch. Als alle bewerkingen in het servicecontract zijn gemarkeerd met TransactionScopeRequired
= false
en TransactionAutoComplete
= false
, wordt de batchmodus nooit ingevoerd.
Een transactie doorvoeren
Een batchtransactie wordt doorgevoerd op basis van het volgende:
MaxBatchSize
. Een eigenschap van het TransactedBatchingBehavior gedrag. Deze eigenschap bepaalt het maximum aantal berichten dat in een batch wordt geplaatst. Wanneer dit nummer is bereikt, wordt de batch doorgevoerd. Dit is geen strikte limiet, het is mogelijk om een batch door te voeren voordat u dit aantal berichten ontvangt.Transaction Timeout
. Nadat 80 procent van de time-out van de transactie is verstreken, wordt de batch doorgevoerd en wordt er een nieuwe batch gemaakt. Dit betekent dat als 20 procent of minder van de tijd die is opgegeven voor het voltooien van een transactie, de batch wordt doorgevoerd.TransactionScopeRequired
. Bij het verwerken van een batch berichten, als WCF er een vindt die dat heeftTransactionScopeRequired
=false
, wordt de batch doorgevoerd en wordt een nieuwe batch opnieuw geopend na ontvangst van het eerste bericht mettrue
=TransactionScopeRequired
en .TransactionAutoComplete
=true
Als er geen berichten meer in de wachtrij staan, wordt de huidige batch doorgevoerd, zelfs als de
MaxBatchSize
transactie niet is bereikt of 80 procent van de time-out van de transactie niet is verstreken.
Batchverwerkingsmodus verlaten
Als een bericht in een batch ervoor zorgt dat de transactie wordt afgebroken, worden de volgende stappen uitgevoerd:
De volledige batch berichten wordt teruggedraaid.
Berichten worden één voor één gelezen totdat het aantal gelezen berichten groter is dan twee keer de maximale batchgrootte.
De Batch-modus wordt opnieuw ingevoerd.
De batchgrootte kiezen
De grootte van een batch is toepassingsafhankelijk. De empirische methode is de beste manier om een optimale batchgrootte voor de toepassing te bereiken. Het is belangrijk om te onthouden wanneer u een batchgrootte kiest om de grootte te kiezen op basis van het daadwerkelijke implementatiemodel van uw toepassing. Wanneer u bijvoorbeeld de toepassing implementeert, als u een SQL-server nodig hebt op een externe computer en een transactie die de wachtrij en de SQL-server omvat, wordt de batchgrootte het beste bepaald door deze exacte configuratie uit te voeren.
Gelijktijdigheid en batchverwerking
Als u de doorvoer wilt verhogen, kunt u ook veel batches gelijktijdig laten uitvoeren. Door in ServiceBehaviorAttribute
te stellenConcurrencyMode.Multiple
, schakelt u gelijktijdige batchverwerking in.
Servicebeperking is een servicegedrag dat wordt gebruikt om aan te geven hoeveel maximum gelijktijdige aanroepen kunnen worden gedaan op de service. Bij gebruik met batchverwerking wordt dit geïnterpreteerd als het aantal gelijktijdige batches dat kan worden uitgevoerd. Als de servicebeperking niet is ingesteld, wordt met WCF standaard het maximum aantal gelijktijdige aanroepen ingesteld op 16. Als er dus standaard batchgedrag is toegevoegd, kunnen maximaal 16 batches tegelijkertijd actief zijn. Het is raadzaam om de servicebeperking en batchverwerking af te stemmen op basis van uw capaciteit. Als de wachtrij bijvoorbeeld 100 berichten heeft en een batch van 20 berichten gewenst is, is het maximum aantal gelijktijdige aanroepen dat is ingesteld op 16 niet nuttig omdat, afhankelijk van doorvoer, 16 transacties actief kunnen zijn, vergelijkbaar met het niet inschakelen van batchverwerking. Bij het afstemmen van prestaties hebt u dus geen gelijktijdige batchverwerking of gelijktijdige batchverwerking met de juiste servicebeperkingsgrootte.
Batchverwerking en meerdere eindpunten
Een eindpunt bestaat uit een adres en een contract. Er kunnen meerdere eindpunten zijn die dezelfde binding delen. Het is mogelijk dat twee eindpunten dezelfde binding delen en dezelfde URI (Uniform Resource Identifier) of wachtrijadres luisteren. Als twee eindpunten uit dezelfde wachtrij worden gelezen en het gedrag van transacted batchverwerking wordt toegevoegd aan beide eindpunten, kan er een conflict ontstaan in de opgegeven batchgrootten. Dit wordt opgelost door batchverwerking te implementeren met behulp van de minimale batchgrootte die is opgegeven tussen de twee getransacteerde batchverwerkingsgedragen. In dit scenario, als een van de eindpunten geen transacted batchverwerking opgeeft, zouden beide eindpunten geen batchverwerking gebruiken.
Opmerking
In het volgende voorbeeld ziet u hoe u het TransactedBatchingBehavior
in een configuratiebestand opgeeft.
<behaviors>
<endpointBehaviors>
<behavior name="TransactedBatchingBehavior"
maxBatchSize="100" />
</endpointBehaviors>
</behaviors>
In het volgende voorbeeld ziet u hoe u de TransactedBatchingBehavior code opgeeft.
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();
}