Udostępnij za pośrednictwem


Tworzenie partii komunikatów w ramach transakcji

Aplikacje w kolejce używają transakcji, aby zapewnić poprawność i niezawodne dostarczanie komunikatów. Jednak transakcje są kosztownymi operacjami i mogą znacznie zmniejszyć przepływność komunikatów. Jednym ze sposobów zwiększenia przepływności komunikatów jest odczytywanie i przetwarzanie wielu komunikatów w ramach jednej transakcji. Kompromis między wydajnością a odzyskiwaniem: wraz ze wzrostem liczby komunikatów w partii, więc ilość pracy odzyskiwania, która jest wymagana, jeśli transakcje zostaną wycofane. Należy pamiętać o różnicy między wsadowaniem komunikatów w transakcji i sesjach. Sesja to grupowanie powiązanych komunikatów, które są przetwarzane przez jedną aplikację i zatwierdzone jako pojedyncza jednostka. Sesje są zwykle używane, gdy grupa powiązanych komunikatów musi być przetwarzana razem. Przykładem jest witryna internetowa zakupów online. Partie są używane do przetwarzania wielu niepowiązanych komunikatów w sposób, który zwiększa przepływność komunikatów. Aby uzyskać więcej informacji na temat sesji, zobacz Grupowanie komunikatów w kolejce w sesji. Komunikaty w partii są również przetwarzane przez jedną aplikację i zatwierdzane jako pojedyncza jednostka, ale może nie istnieć relacja między komunikatami w partii. Przetwarzanie wsadowe komunikatów w transakcji to optymalizacja, która nie zmienia sposobu działania aplikacji.

Wprowadzanie trybu wsadowego

Zachowanie punktu końcowego steruje dzieleniem TransactedBatchingBehavior na partie. Dodanie tego zachowania punktu końcowego do punktu końcowego usługi informuje program Windows Communication Foundation (WCF) o komunikatach wsadowych w transakcji. Nie wszystkie komunikaty wymagają transakcji, więc tylko komunikaty, które wymagają transakcji, są umieszczane w partii i tylko komunikaty wysyłane z operacji oznaczonych jako TransactionScopeRequired = true i TransactionAutoComplete = true są uznawane za wsadowe. Jeśli wszystkie operacje w kontrakcie usługi są oznaczone znakiem TransactionScopeRequired = false i TransactionAutoComplete = false, tryb dzielenia na partie nigdy nie zostanie wprowadzony.

Zatwierdzanie transakcji

Transakcja wsadowa jest zatwierdzana w oparciu o następujące elementy:

  • MaxBatchSize. Właściwość TransactedBatchingBehavior zachowania. Ta właściwość określa maksymalną liczbę komunikatów umieszczonych w partii. Po osiągnięciu tej liczby partia zostanie zatwierdzona. Ta wartość nie jest ścisłym limitem. Przed odebraniem tej liczby komunikatów można zatwierdzić partię.

  • Transaction Timeout. Po upływie 80 procent limitu czasu transakcji partia zostanie zatwierdzona i zostanie utworzona nowa partia. Oznacza to, że jeśli 20 procent lub mniej czasu na ukończenie transakcji pozostanie, partia zostanie zatwierdzona.

  • TransactionScopeRequired. Podczas przetwarzania partii komunikatów, jeśli program WCF znajdzie taki, który zawiera TransactionScopeRequired = false, zatwierdza partię i ponownie otwiera nową partię po otrzymaniu pierwszego komunikatu za pomocątrue = TransactionScopeRequired polecenia i .TransactionAutoComplete = true

  • Jeśli w kolejce nie ma więcej komunikatów, bieżąca partia zostanie zatwierdzona, nawet jeśli MaxBatchSize nie osiągnięto lub 80 procent limitu czasu transakcji nie upłynął.

Opuszczanie trybu przetwarzania wsadowego

Jeśli komunikat w partii powoduje przerwanie transakcji, wystąpią następujące kroki:

  1. Cała partia komunikatów jest cofana.

  2. Komunikaty są odczytywane pojedynczo, dopóki liczba odczytanych komunikatów przekroczy dwa razy maksymalny rozmiar partii.

  3. Tryb wsadowy zostanie ponownie wprowadzony.

Wybieranie rozmiaru partii

Rozmiar partii jest zależny od aplikacji. Metoda empiryczna to najlepszy sposób uzyskania optymalnego rozmiaru partii dla aplikacji. Podczas wybierania rozmiaru partii należy pamiętać, aby wybrać rozmiar zgodnie z rzeczywistym modelem wdrażania aplikacji. Na przykład podczas wdrażania aplikacji, jeśli potrzebujesz serwera SQL na maszynie zdalnej i transakcji obejmującej kolejkę i serwer SQL, rozmiar partii najlepiej określa się, uruchamiając tę dokładną konfigurację.

Współbieżność i przetwarzanie wsadowe

Aby zwiększyć przepływność, można również uruchamiać wiele partii jednocześnie. Ustawiając wartość w elemecie ConcurrencyMode.MultipleServiceBehaviorAttribute, włączasz współbieżne partie.

Ograniczanie usługi to zachowanie usługi, które służy do wskazywania maksymalnej liczby współbieżnych wywołań w usłudze. W przypadku użycia z przetwarzaniem wsadowym jest to interpretowane jako liczba współbieżnych partii, które można uruchomić. Jeśli ograniczanie przepustowości usługi nie jest ustawione, program WCF domyślnie ustawia maksymalną liczbę współbieżnych wywołań na 16. W związku z tym, jeśli zachowanie dzielenia na partie zostało dodane domyślnie, maksymalnie 16 partii może być aktywny w tym samym czasie. Najlepiej dostroić ograniczanie i dzielenie na partie usługi na podstawie pojemności. Jeśli na przykład kolejka ma 100 komunikatów, a partia 20 jest wymagana, maksymalna liczba współbieżnych wywołań ustawiona na 16 nie jest przydatna, ponieważ w zależności od przepływności 16 transakcji może być aktywnych, podobnie jak w przypadku włączenia dzielenia na partie. W związku z tym w przypadku dostrajania pod kątem wydajności nie mają współbieżnego dzielenia na partie lub mają współbieżne przetwarzanie wsadowe z prawidłowym rozmiarem ograniczania przepustowości usługi.

Przetwarzanie wsadowe i wiele punktów końcowych

Punkt końcowy składa się z adresu i kontraktu. Może istnieć wiele punktów końcowych, które współużytkujące to samo powiązanie. Istnieje możliwość, aby dwa punkty końcowe współużytkować to samo powiązanie i nasłuchiwać identyfikatora URI (Uniform Resource Identifier) lub adresu kolejki. Jeśli dwa punkty końcowe odczytują z tej samej kolejki, a zachowanie przetwarzania wsadowego jest dodawane do obu punktów końcowych, może wystąpić konflikt w określonych rozmiarach partii. Jest to rozwiązane przez zaimplementowanie przetwarzania wsadowego przy użyciu minimalnego rozmiaru partii określonego między dwoma przejściowymi zachowaniami dzielenia na partie. W tym scenariuszu, jeśli jeden z punktów końcowych nie określi transaktoryzowania wsadowego, oba punkty końcowe nie będą używać dzielenia na partie.

Przykład

W poniższym przykładzie pokazano, jak określić element TransactedBatchingBehavior w pliku konfiguracji.

<behaviors>
  <endpointBehaviors>
    <behavior name="TransactedBatchingBehavior"
              maxBatchSize="100" />
  </endpointBehaviors>
</behaviors>

W poniższym przykładzie pokazano, jak określić TransactedBatchingBehavior element w kodzie.

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();
}  

Zobacz też