Bölümlenmiş kuyruklar ve konular

Azure Service Bus, iletileri işlemek için birden çok ileti aracısı ve iletileri depolamak için birden çok mesajlaşma deposu kullanır. Geleneksel bir kuyruk veya konu başlığı tek bir ileti aracısı tarafından işlenir ve tek bir mesajlaşma deposunda depolanır. Service Bus bölümleri , kuyrukların ve konuların veya mesajlaşma varlıklarının birden çok ileti aracısı ve mesajlaşma deposu arasında bölümlenebilmesini sağlar. Bölümleme, bölümlenmiş bir varlığın genel aktarım hızının artık tek bir ileti aracısı veya mesajlaşma deposunun performansıyla sınırlı olmadığı anlamına gelir. Buna ek olarak, bir mesajlaşma deposundaki geçici bir kesinti bölümlenmiş bir kuyruğu veya konuyu kullanılamaz duruma getirmiyor. Bölümlenmiş kuyruklar ve konular, işlemler ve oturumlar için destek gibi tüm gelişmiş Service Bus özelliklerini içerebilir.

Not

Bölümleme söz konusu olduğunda Temel / Standart ve Premium SKU arasında bazı farklılıklar vardır.

  • Bölümleme, Temel veya Standart SKU'lardaki tüm kuyruklar ve konular için varlık oluşturma sırasında kullanılabilir. Bir ad alanı hem bölümlenmiş hem de bölümlenmemiş varlıklara sahip olabilir.
  • Bölümleme, Premium mesajlaşma SKU'su için ad alanı oluşturma sırasında kullanılabilir ve bu ad alanında yer alan tüm kuyruklar ve konular bölümlenir. Premium ad alanları içinde daha önce geçirilen bölümlenmiş varlıklar beklendiği gibi çalışmaya devam eder.
  • Temel veya Standart SKU'larda bölümleme etkinleştirildiğinde her zaman 16 bölüm oluşturacağız.
  • Premium SKU'da bölümleme etkinleştirildiğinde, bölüm miktarı ad alanı oluşturma sırasında belirtilir.

Mevcut ad alanı, kuyruk veya konu başlığında bölümleme seçeneğini değiştirmek mümkün değildir; seçeneğini yalnızca varlığı oluşturduğunuzda ayarlayabilirsiniz.

Nasıl çalışır?

Bölümlenmiş her kuyruk veya konu birden çok bölümden oluşur. Her bölüm farklı bir mesajlaşma deposunda depolanır ve farklı bir ileti aracısı tarafından işlenir. Bölümlenmiş bir kuyruğa veya konuya ileti gönderildiğinde, Service Bus iletiyi bölümlerden birine atar. Seçim, Service Bus tarafından veya gönderenin belirtebileceği bir bölüm anahtarı kullanılarak rastgele yapılır.

İstemci bölümlenmiş bir kuyruktan veya bir abonelikten bölümlenmiş bir konuya ileti almak istediğinde, Service Bus iletilerin tüm bölümlerini sorgular, ardından ileti depolarından herhangi birinden alıcıya alınan ilk iletiyi döndürür. Service Bus diğer iletileri önbelleğe alır ve daha fazla alma isteği aldığında bunları döndürür. Alıcı istemci bölümlemenin farkında değildir; bölümlenmiş bir kuyruğun veya konunun istemciye yönelik davranışı (örneğin, okuma, tamamlama, erteleme, geri alma, ön işlem) normal bir varlığın davranışıyla aynıdır.

Bölümlenmemiş bir varlıkta göz atma işlemi her zaman en eski iletiyi döndürür, ancak bölümlenmiş varlıkta döndürmez. Bunun yerine, ileti aracısı ilk olarak yanıt veren bölümlerden birinde en eski iletiyi döndürür. Döndürülen iletinin tüm bölümlerde en eski ileti olması garanti edilemez.

Bölümlenmiş bir kuyruğa veya konuya ileti gönderirken veya bu kuyruktan ileti alırken ek ücret alınmaz.

Not

Göz atma işlemi, bölümdeki en eski iletiyi sıra numarasına göre döndürür. Bölümlenmiş varlıklar için, bölüme göre sıra numarası verilir. Daha fazla bilgi için bkz . İleti sıralama ve zaman damgaları.

Bölüm anahtarlarının kullanımı

Bir ileti bölümlenmiş bir kuyruğa veya konuya sıralandığında, Service Bus bir bölüm anahtarının olup olmadığını denetler. Bir tane bulursa, bu anahtara göre bölümü seçer. Bir bölüm anahtarı bulamazsa, bir iç algoritmaya göre bölümü seçer.

Bölüm anahtarı kullanma

Oturumlar veya işlemler gibi bazı senaryolar, iletilerin belirli bir bölümde depolanmasını gerektirir. Tüm bu senaryolar için bölüm anahtarı kullanılması gerekir. Aynı bölüm anahtarını kullanan tüm iletiler aynı bölüme atanır. Bölüm geçici olarak kullanılamıyorsa Service Bus bir hata döndürür.

Senaryoya bağlı olarak, bölüm anahtarı olarak farklı ileti özellikleri kullanılır:

SessionId: bir iletide oturum kimliği özelliği ayarlanmışsa Service Bus bunu bölüm anahtarı olarak kullanır. Bu şekilde, aynı oturuma ait tüm iletiler aynı ileti aracısı tarafından işlenir. Oturumlar, Service Bus'ın ileti sıralamasını ve oturum durumlarının tutarlılığını garanti etmelerini sağlar.

PartitionKey: bir ileti bölüm anahtarı özelliğine sahipse ancak oturum kimliği özellik kümesine sahip değilse, Service Bus bölüm anahtarı özellik değerini bölüm anahtarı olarak kullanır. İletide hem oturum kimliği hem de bölüm anahtarı özellikleri ayarlanmışsa, her iki özellik de aynı olmalıdır. Bölüm anahtarı özelliği oturum kimliği özelliğinden farklı bir değere ayarlanırsa, Service Bus geçersiz bir işlem özel durumu döndürür. Bölüm anahtarı özelliği, gönderenin ayrıcalık tanımayan işlem iletileri göndermesi durumunda kullanılmalıdır. Bölüm anahtarı, bir işlem içinde gönderilen tüm iletilerin aynı mesajlaşma aracısı tarafından işlenmesini sağlar.

MessageId: Kuyruk veya konu yinelenen algılama özelliğiyle oluşturulduysa ve oturum kimliği veya bölüm anahtarı özellikleri ayarlanmamışsa, ileti kimliği özellik değeri bölüm anahtarı görevi görür. (Microsoft istemci kitaplıkları, gönderen uygulama atamazsa otomatik olarak bir ileti kimliği atar.) Bu durumda, aynı iletinin tüm kopyaları aynı ileti aracısı tarafından işlenir. Bu kimlik, Service Bus'ın yinelenen iletileri algılamasını ve ortadan kaldırmasını sağlar. Yinelenen algılama özelliği etkinleştirilmemişse, Service Bus ileti kimliği özelliğini bölüm anahtarı olarak değerlendirmez.

Bölüm anahtarı kullanmama

Bölüm anahtarı olmadığında, Service Bus iletileri bölümlenmiş kuyruğun veya konunun tüm bölümlerine hepsini bir kez deneme şeklinde dağıtır. Seçilen bölüm kullanılamıyorsa, Service Bus iletiyi farklı bir bölüme atar. Bu şekilde, bir mesajlaşma deposunun geçici olarak kullanılamamalarına rağmen gönderme işlemi başarılı olur. Ancak, bölüm anahtarının sağladığı garantili sıralamayı elde etmezsiniz.

Kullanılabilirlik (bölüm anahtarı yok) ile tutarlılık (bölüm anahtarı kullanarak) arasındaki denge hakkında daha ayrıntılı bir tartışma için bkz . Event Hubs'ta kullanılabilirlik ve tutarlılık. Bölüm kimliğinin kullanıcılara sunulmaması dışında, bu bilgiler bölümlenmiş Service Bus varlıklarına eşit olarak uygulanır.

Service Bus'a iletiyi farklı bir bölüme sıralamak için yeterli süre vermek için, iletiyi gönderen istemci tarafından belirtilen zaman aşımı değeri 15 saniyeden uzun olmalıdır. Varsayılan değer olan 60 saniye önerilir.

Bölüm anahtarı, iletiyi belirli bir bölüme "sabitler". Bu bölümü barındıran mesajlaşma deposu kullanılamıyorsa Service Bus bir hata döndürür. Bölüm anahtarı olmadığında Service Bus farklı bir bölüm seçebilir ve işlem başarılı olur. Bu nedenle, gerekli olmadığı sürece bölüm anahtarı sağlamamanızı öneririz.

Gelişmiş konular

Bölümlenmiş varlıklarla işlem kullanma

Bir işlem kapsamında gönderilen iletilerin bölüm anahtarını belirtmesi gerekir. Anahtar şu özelliklerden biri olabilir: oturum kimliği, bölüm anahtarı veya ileti kimliği. Aynı işlemin parçası olarak gönderilen tüm iletiler aynı bölüm anahtarını belirtmelidir. bir işlem içinde bölüm anahtarı olmayan bir ileti göndermeye çalışırsanız, Service Bus geçersiz bir işlem özel durumu döndürür. Aynı işlem içinde farklı bölüm anahtarları olan birden çok ileti göndermeye çalışırsanız, Service Bus geçersiz bir işlem özel durumu döndürür. Örneğin:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    ServiceBusMessage msg = new ServiceBusMessage("This is a message");
    msg.PartitionKey = "myPartitionKey";
    await sender.SendMessageAsync(msg); 
    ts.Complete();
}
committableTransaction.Commit();

Bölüm anahtarı görevi görecek özelliklerden herhangi biri ayarlanırsa, Service Bus iletiyi belirli bir bölüme sabitler. Bu davranış, bir işlemin kullanılıp kullanılmadığını gösterir. Gerekli değilse bölüm anahtarı belirtmemen önerilir.

Bölümlenmiş varlıklarla oturumlarda işlemleri kullanma

Oturum kullanan bir konuya veya kuyruğa işlem iletisi göndermek için iletinin oturum kimliği özelliği ayarlanmış olmalıdır. Bölüm anahtarı özelliği de belirtilirse, oturum kimliği özelliğiyle aynı olmalıdır. Farklıysa, Service Bus geçersiz bir işlem özel durumu döndürür.

Normal (bölümlenmemiş) kuyruklardan veya konu başlıklarından farklı olarak, farklı oturumlara birden çok ileti göndermek için tek bir işlem kullanmak mümkün değildir. Denenirse, Service Bus geçersiz bir işlem özel durumu döndürür. Örneğin:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    ServiceBusMessage msg = new ServiceBusMessage("This is a message");
    msg.SessionId = "mySession";
    await sender.SendMessageAsync(msg); 
    ts.Complete();
}
committableTransaction.Commit();

Bölümlenmiş varlıklarla otomatik ileti iletme

Service Bus, bölümlenmiş varlıklardan otomatik ileti iletmeyi destekler. Kuyrukları ve abonelikleri oluştururken veya güncelleştirirken bu özelliği etkinleştirebilirsiniz. Daha fazla bilgi için bkz . İleti iletmeyi etkinleştirme. İleti bir bölüm anahtarı (oturum kimliği, bölüm anahtarı veya ileti kimliği) belirtiyorsa, bu bölüm anahtarı hedef varlık için kullanılır.

Dikkat edilmesi gerekenler ve yönergeler

  • Yüksek tutarlılık özellikleri: Bir varlık oturumlar, yinelenen algılama veya bölümleme anahtarı üzerinde açık denetim gibi özellikler kullanıyorsa mesajlaşma işlemleri her zaman belirli bir bölüme yönlendirilir. Bölümlerden herhangi biri yüksek trafikle karşılaşırsa veya temel alınan depo iyi durumda değilse, bu işlemler başarısız olur ve kullanılabilirlik azalır. Genel olarak tutarlılık hala bölümlenmemiş varlıklardan çok daha yüksektir; tüm trafiğin aksine yalnızca bir trafik alt kümesinde sorun yaşanıyor. Daha fazla bilgi için bu kullanılabilirlik ve tutarlılık tartışması konusuna bakın.
  • Yönetim: Varlığın tüm bölümlerinde Oluşturma, Güncelleştirme ve Silme gibi işlemler gerçekleştirilmelidir. Herhangi bir bölüm iyi durumda değilse, bu işlemler için hatalara neden olabilir. Get işlemi için, ileti sayıları gibi bilgilerin tüm bölümlerden toplanması gerekir. Herhangi bir bölüm iyi durumda değilse, varlık kullanılabilirlik durumu sınırlı olarak bildirilir.
  • Düşük hacimli ileti senaryoları: Bu tür senaryolarda, özellikle HTTP protokolünü kullanırken, tüm iletileri almak için birden çok alma işlemi gerçekleştirmeniz gerekebilir. Alma istekleri için, ön uç tüm bölümlerde bir alma gerçekleştirir ve alınan tüm yanıtları önbelleğe alır. Aynı bağlantıda sonraki bir alma isteği bu önbelleğe almadan yararlanabilir ve alma gecikme süreleri daha düşük olur. Ancak, birden çok bağlantınız varsa veya HTTP kullanıyorsanız, her istek için yeni bir bağlantı kurulur. Bu nedenle, aynı düğüme ineceğinin garantisi yoktur. Tüm mevcut iletiler kilitlenir ve başka bir ön uçta önbelleğe alınırsa alma işlemi null döndürür. İletilerin süresi sonunda dolar ve bunları yeniden alabilirsiniz. HTTP canlı tutma önerilir. Düşük hacimli senaryolarda bölümleme kullanılırken alma işlemleri beklenenden uzun sürebilir. Bu nedenle, bu senaryolarda bölümleme kullanmamanızı öneririz. Mevcut bölümlenmiş varlıkları silin ve performansı artırmak için bölümleme devre dışı bırakılarak yeniden oluşturun.
  • İletilere göz atma/göz atma: Göz atma işlemi her zaman istenen ileti sayısını döndürmez. Bu davranışın iki yaygın nedeni vardır. Bunun bir nedeni, ileti koleksiyonunun toplam boyutunun maksimum boyutu aşmasıdır. Başka bir neden, bölümlenmiş kuyruklarda veya konu başlıklarında, bir bölümün istenen sayıda ileti döndürmek için yeterli iletiye sahip olmamasıdır. Genel olarak, bir uygulama belirli sayıda iletiye göz atmak/göz atmak istiyorsa, bu sayıda ileti alıncaya veya göz atacak başka ileti kalmayıncaya kadar tekrar tekrar göz atma işlemini çağırmalıdır. Kod örnekleri de dahil olmak üzere daha fazla bilgi için bkz . İletiye göz atma.

Bölümlenmiş varlık sınırlamaları

Şu anda Service Bus, bölümlenmiş kuyruklara ve konulara aşağıdaki sınırlamaları uygular:

  • Bölümlenmiş premium ad alanları için, iletiler tek tek gönderildiğinde ileti boyutu 1 MB ile sınırlıdır ve iletiler toplu olarak gönderildiğinde toplu iş boyutu 1 MB ile sınırlıdır.
  • Bölümlenmiş kuyruklar ve konular, tek bir işlemde farklı oturumlara ait iletilerin gönderilmesini desteklemez.
  • Service Bus şu anda Temel ve Standart SKU için ad alanı başına en fazla 100 bölümlenmiş kuyruk veya konuya izin verir. Bölümlenmiş her kuyruk veya konu başlığı, ad alanı başına 10.000 varlık kotasına göre sayılır.

Sonraki adımlar

Azure portalı, PowerShell, CLI, Resource Manager şablonu, .NET, Java, Python ve JavaScript'i kullanarak bölümleme özelliğini etkinleştirebilirsiniz. Daha fazla bilgi için bkz . Bölümleyi etkinleştirme (Temel / Standart).

AMQP 1.0 protokol kılavuzunda Gelişmiş İleti Kuyruğa Alma Protokolü (AMQP) 1.0 mesajlaşma belirtiminin temel kavramları hakkında bilgi edinin.