Aracılığıyla paylaş


Bir İşlemde Toplu İleti İşleme

Kuyruğa alınan uygulamalar, iletilerin doğru ve güvenilir bir şekilde teslim edilmesini sağlamak için işlemleri kullanır. Ancak işlemler pahalı işlemlerdir ve ileti aktarım hızını önemli ölçüde azaltabilir. İleti aktarım hızını geliştirmenin bir yolu, bir uygulamanın tek bir işlem içinde birden çok iletiyi okuması ve işlemesidir. İşlemler geri alınırsa gereken kurtarma işi miktarı da arttıkça, bu işlem performans ve kurtarma arasında olur. bir işlemdeki iletileri toplu işleme ile oturumlar arasındaki farkı not etmek önemlidir. Oturum, tek bir uygulama tarafından işlenen ve tek bir birim olarak işlenen ilgili iletilerin bir gruplanmasıdır. Oturumlar genellikle bir grup ilgili iletinin birlikte işlenmesi gerektiğinde kullanılır. Bunun bir örneği, çevrimiçi alışveriş Web sitesidir. Toplu işlemler , birden çok, ilişkisiz iletiyi ileti aktarım hızını artıracak şekilde işlemek için kullanılır. Oturumlar hakkında daha fazla bilgi için bkz . Oturumda Kuyruğa Alınan İletileri Gruplandırma. Bir toplu işteki iletiler de tek bir uygulama tarafından işlenir ve tek bir birim olarak işlenir, ancak toplu işteki iletiler arasında ilişki olmayabilir. bir işlemdeki iletileri toplu işleme, uygulamanın çalışma biçimini değiştirmeyen bir iyileştirmedir.

Toplu İşlem Moduna Girme

TransactedBatchingBehavior nokta davranışı toplu işlemi denetler. Bu uç nokta davranışını bir hizmet uç noktasına eklemek, Windows Communication Foundation'a (WCF) bir işlemdeki toplu iletileri göndermesini bildirir. Tüm iletiler işlem gerektirmez, bu nedenle yalnızca işlem gerektiren iletiler toplu işleme yerleştirilir ve yalnızca ile TransactionScopeRequired = true işaretlenen ve TransactionAutoComplete = true toplu işlemlerden gönderilen iletiler toplu işlem için kabul edilir. Hizmet sözleşmesinde tüm işlemler vefalseTransactionAutoComplete = ile TransactionScopeRequired = false işaretlenirse toplu işlem moduna hiçbir zaman girilir.

İşlem İşleme

Toplu işlem aşağıdakilere göre işlenir:

  • MaxBatchSize. Davranışın TransactedBatchingBehavior özelliği. Bu özellik, toplu işleme yerleştirilen en fazla ileti sayısını belirler. Bu sayıya ulaşıldığında toplu iş işlenir. Bu değer katı bir sınır değildir, bu sayıda iletiyi almadan önce toplu işlem yapmak mümkündür.

  • Transaction Timeout. İşlemin zaman aşımının yüzde 80'i geçtikten sonra toplu iş işlenir ve yeni bir toplu iş oluşturulur. Bu, işlemin tamamlanması için verilen sürenin yüzde 20'si veya daha azı kalırsa toplu işlemin işlendiği anlamına gelir.

  • TransactionScopeRequired. Bir ileti toplu işlemini işlerken, WCF içeren TransactionScopeRequired = falsebir ileti bulursa, toplu işlemi işler ve vetrue = TransactionAutoComplete ile TransactionScopeRequired = true ilk iletinin alınması üzerine yeni bir toplu işlemi yeniden açar.

  • Kuyrukta daha fazla ileti yoksa, işlemine ulaşılmasa veya işlemin zaman aşımının yüzde 80'i tamamlanmamış olsa MaxBatchSize bile geçerli toplu işlem işlenir.

Toplu İşlem Modundan Çıkma

Toplu işlemdeki bir ileti işlemin durdurulmasına neden olursa aşağıdaki adımlar gerçekleşir:

  1. İletilerin tamamı geri alınır.

  2. okunan ileti sayısı en büyük toplu iş boyutunun iki katını aşana kadar iletiler birer birer okunur.

  3. Toplu iş moduna yeniden girilir.

Toplu İş Boyutunu Seçme

Toplu iş boyutu uygulamaya bağlıdır. Ampirik yöntem, uygulama için en uygun toplu iş boyutuna ulaşmanın en iyi yoludur. Uygulamanızın gerçek dağıtım modeline göre boyutu seçmek için bir toplu iş boyutu seçerken anımsamanız önemlidir. Örneğin, uygulamayı dağıtırken uzak makinede bir SQL sunucusuna ve kuyruğa ve SQL sunucusuna yayılan bir işleme ihtiyacınız varsa, toplu iş boyutu en iyi şekilde bu yapılandırma çalıştırılarak belirlenir.

Eşzamanlılık ve Toplu İşlem

Aktarım hızını artırmak için birçok toplu işlemi eşzamanlı olarak çalıştırabilirsiniz. içinde ServiceBehaviorAttributeayarlayarak ConcurrencyMode.Multiple eşzamanlı toplu işlemi etkinleştirirsiniz.

Hizmet azaltma , hizmette en fazla kaç eşzamanlı çağrı yapılabileceğini belirtmek için kullanılan bir hizmet davranışıdır. Toplu işlemle kullanıldığında, bu, kaç eşzamanlı toplu iş çalıştırılabilir olarak yorumlanır. Hizmet azaltma ayarlanmadıysa, WCF varsayılan olarak en fazla eşzamanlı çağrıyı 16 olarak ayarlar. Bu nedenle, toplu işlem davranışı varsayılan olarak eklendiyse, aynı anda en fazla 16 toplu işlem etkin olabilir. Kapasitenize göre hizmet azaltmayı ve toplu işlemi ayarlamak en iyisidir. Örneğin, kuyrukta 100 ileti varsa ve 20 toplu iş isteniyorsa, en fazla eşzamanlı çağrının 16 olarak ayarlanması yararlı değildir çünkü aktarım hızına bağlı olarak 16 işlem etkin olabilir ve toplu işlem açılmamış gibi görünür. Bu nedenle, performans için ince ayar yapıldığında, eş zamanlı toplu işlem yoktur veya doğru hizmet kısıtlama boyutuyla eşzamanlı toplu işlem gerçekleştiremezsiniz.

Toplu İşlem ve Birden Çok Uç Nokta

Uç nokta bir adres ve sözleşmeden oluşur. Aynı bağlamayı paylaşan birden çok uç nokta olabilir. İki uç noktanın aynı bağlamayı paylaşması ve Tekdüzen Kaynak Tanımlayıcısı (URI) veya kuyruk adresini dinlemesi mümkündür. İki uç nokta aynı kuyruktan okuyorsa ve işlem yapılan toplu işlem davranışı her iki uç noktaya da eklenirse, belirtilen toplu iş boyutlarında çakışma oluşabilir. Bu, işlem yapılan iki toplu işlem davranışı arasında belirtilen en düşük toplu iş boyutu kullanılarak toplu işlem uygulanarak çözülür. Bu senaryoda, uç noktalardan biri işlem yapılan toplu işlemi belirtmezse, her iki uç nokta da toplu işlem kullanmaz.

Örnek

Aşağıdaki örnek, bir yapılandırma dosyasında öğesinin TransactedBatchingBehavior nasıl belirtileceğini gösterir.

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

Aşağıdaki örnekte kodun nasıl belirtileceğini gösterilmektedir TransactedBatchingBehavior .

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

Ayrıca bkz.