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ı ve bir mesajlaşma deposu tarafından işlenir. 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. Ayrıca, bir mesajlaşma deposundaki geçici bir kesinti, bölümlenmiş bir kuyruğu veya konuyu kullanılamaz hale getirmez. 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ına önceden geçirilen bölümlenmiş varlıklar beklendiği gibi çalışmaya devam eder.
  • Temel veya Standart SKU'larda bölümlemeyi etkinleştirdiğinizde, her zaman 16 bölüm oluşturursunuz.
  • Premium SKU'da bölümleyi etkinleştirdiğinizde, ad alanı oluşturma sırasında bölüm sayısını belirtirsiniz.

Mevcut ad alanı, kuyruk veya konu başlığında bölümleme seçeneğini değiştiremezsiniz. Seçeneği 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önderdiğinizde, Service Bus iletiyi bölümlerden birine atar. Service Bus bölümü rastgele seçer veya gönderenin belirttiği bir bölüm anahtarı kullanır.

bir istemci 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. Herhangi bir mesajlaşma deposundan alıcıya aldığı 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ışı (okuma, tamamlama, erteleme, kilitlenme, önceden oluşturma gibi) 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ş bir varlıkta her zaman en eski iletiyi döndürmeyebilir. 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 sıra numarası bölüme göredir. Daha fazla bilgi için bkz . İleti sıralama ve zaman damgaları.

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

Bir iletiyi bölümlenmiş kuyruğa veya konuya sıraladığınızda, Service Bus bir bölüm anahtarının varlığı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. Service Bus, aynı bölüm anahtarını kullanan tüm iletileri aynı bölüme atar. 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 özellik kümesi varsa, Service Bus bunu bölüm anahtarı olarak kullanır. Bu şekilde, aynı ileti aracısı aynı oturuma ait tüm iletileri işler. Service Bus, oturumları kullanarak ileti sıralamayı ve oturum durumlarının tutarlılığını garanti eder.

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. Oturumdan habersiz işlem iletileri gönderen bir gönderici varsa, bölüm anahtarı özelliğini kullanın. Bölüm anahtarı, aynı mesajlaşma aracısının bir işlem içinde gönderilen tüm iletileri işlemesini sağlar.

MessageId: Kuyruğu veya konuyu yinelenen algılama özelliğiyle oluşturur ve oturum kimliğini veya bölüm anahtarı özelliklerini ayarlamazsanız, 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ı ileti aracısı aynı iletinin tüm kopyalarını işler. 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ı belirtmezseniz, Service Bus iletileri bölümlü kuyruk veya konunun tüm bölümlerine dönüşümlü sırayla 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ıralamaya ulaşamazsınız.

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ıkça bölüm anahtarı sağlamayın.

Gelişmiş konular

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

Bir işlemin parçası olarak gönderdiğiniz iletilerin bölüm anahtarı 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önderdiğiniz 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 birini ayarlarsanız, Service Bus iletiyi belirli bir bölüme sabitler. Bu davranış, bir işlem kullansanız da kullanmasanız da oluşur. Gerekli değilse bölüm anahtarı belirtmeyin.

Bölümlere ayrılmış varlıklarla oturumlarda işlemleri kullanın

Oturum kullanan bir konuya veya kuyruğa işlem iletisi göndermek için iletideki oturum kimliği özelliğini ayarlayın. Bölüm anahtarı özelliğini belirtirseniz, oturum kimliği özelliğiyle aynı olmalıdır. Farklıysa, Service Bus geçersiz işlem istisnası 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 kullanamazsınız. Bu işlemi denerseniz, Service Bus geçersiz bir işlem hatası 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, varlıklara veya varlıklar arasında 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, hedef varlık için bu bölüm anahtarı 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 aşırı trafikle karşılaşırsa veya alttaki depolama sistemi sağlıklı değilse, o işlemler başarısız olur ve kullanılabilirlik azalır. Genel olarak tutarlılık yine de bölümlenmemiş varlıklara göre çok daha yüksektir. Tüm trafiğin aksine yalnızca bir trafik alt kümesi sorunlarla karşılaşır. 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 istemleri için ön uç, tüm bölümlerde isteği gerçekleştirir ve aldığı tüm yanıtları ön bellek içine alır. Önbelleğe alma işlemi, aynı bağlantı üzerindeki müteakip alma istekleri için fayda sağlar ve alma gecikme süreleri daha düşüktür. 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 inmesi garanti değildir. Mevcut tüm iletiler kilitliyse ve başka bir ön uçta önbelleğe alındıysa, 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 kullanmayın. 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/Peek: Göz atma işlemi her zaman talep edilen ileti sayısını döndürmeyebilir. Bu davranışı açıklayan iki yaygın neden 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 veya taramak istiyorsa, bu sayıda ileti elde edilinceye veya göz atacak başka ileti kalmayıncaya kadar göz atma işlemini tekrar tekrar çağırmalıdır. Kod örnekleri de dahil olmak üzere daha fazla bilgi için Mesaj göz atma sayfasına bakın.

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

Service Bus şu anda bölümlenmiş kuyruklar ve konular için aşağıdaki sınırlamaları uygular:

  • Bölümlenmiş kuyruklar ve konular, tek bir işlemde farklı oturumlara ait iletilerin gönderilmesini desteklemez.
  • Service Bus şu anda Temel ve Standart katmanlar 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).

Gelişmiş Message Queuing Protokolü (AMQP) 1.0 mesajlaşma belirtiminin temel kavramları hakkında bilgi edinmek için AMQP 1.0 protokol kılavuzuna bakın.