Partitionerade köer och ämnenPartitioned queues and topics

Azure Service Bus använder flera koordinatorerna att bearbeta meddelanden och flera meddelandearkiv för att lagra meddelanden.Azure Service Bus employs multiple message brokers to process messages and multiple messaging stores to store messages. En konventionell kö eller ämne hanteras av en enda asynkron meddelandekö och lagras i ett meddelandearkiv.A conventional queue or topic is handled by a single message broker and stored in one messaging store. Service Bus partitioner aktivera köer och ämnen, eller meddelandeentiteter, som ska partitioneras över flera koordinatorerna och meddelandearkiv.Service Bus partitions enable queues and topics, or messaging entities, to be partitioned across multiple message brokers and messaging stores. Partitionering innebär att hela dataflödet för en partitionerad entitet begränsas inte längre av prestanda för en enda asynkron meddelandekö eller ett meddelandearkiv.Partitioning means that the overall throughput of a partitioned entity is no longer limited by the performance of a single message broker or messaging store. Dessutom kan återges ett tillfälligt avbrott i ett meddelandearkiv inte en partitionerad kö eller ett ämne inte tillgänglig.In addition, a temporary outage of a messaging store does not render a partitioned queue or topic unavailable. Partitionerade köer och ämnen kan innehålla alla avancerade funktioner för Service Bus, till exempel stöd för transaktioner och sessioner.Partitioned queues and topics can contain all advanced Service Bus features, such as support for transactions and sessions.

Anteckning

Partitionering är tillgängliga när en entitet skapas för alla köer och ämnen i Basic eller Standard-SKU: er.Partitioning is available at entity creation for all queues and topics in Basic or Standard SKUs. Det är inte tillgänglig för Premium SKU-meddelanden, men alla befintliga partitionerade enheter i Premium-namnområden som fortsätter att fungera som förväntat.It is not available for the Premium messaging SKU, but any previously existing partitioned entities in Premium namespaces continue to work as expected.

Det går inte att ändra alternativet partitionering på en befintlig kö eller ämne; Du kan bara ställa in alternativet när du skapar entiteten.It is not possible to change the partitioning option on any existing queue or topic; you can only set the option when you create the entity.

Hur det fungerarHow it works

Varje partitionerad kö eller ämne består av flera partitioner.Each partitioned queue or topic consists of multiple partitions. Varje partition lagras i en annan meddelandearkiv och hanteras av en annan asynkron meddelandekö.Each partition is stored in a different messaging store and handled by a different message broker. När ett meddelande skickas till en partitionerad kö eller ett ämne tilldelar Service Bus meddelandet till någon av partitionerna.When a message is sent to a partitioned queue or topic, Service Bus assigns the message to one of the partitions. Valet görs slumpmässigt av Service Bus eller genom att använda en partitionsnyckel som avsändaren kan ange.The selection is done randomly by Service Bus or by using a partition key that the sender can specify.

När en klient vill få ett meddelande från en partitionerad kö eller från en prenumeration på en partitionerad ämne, Service Bus frågor alla partitioner för meddelanden, returnerar du det första meddelandet som erhålls från någon av meddelandearkiven på mottagaren.When a client wants to receive a message from a partitioned queue, or from a subscription to a partitioned topic, Service Bus queries all partitions for messages, then returns the first message that is obtained from any of the messaging stores to the receiver. Den andra meddelanden och returnerar dem när den får ytterligare Service Bus-cacheminnen ta emot begäranden.Service Bus caches the other messages and returns them when it receives additional receive requests. En mottagande klienten är inte medveten om partitionering; klientinriktade beteendet för en partitionerad kö eller ett ämne (till exempel läsa, Slutför, skjuta upp systemkön, förhämtar,) är identiska i beteendet hos en vanlig entitet.A receiving client is not aware of the partitioning; the client-facing behavior of a partitioned queue or topic (for example, read, complete, defer, deadletter, prefetching) is identical to the behavior of a regular entity.

Det finns ingen extra kostnad när de skickar ett meddelande till eller ta emot ett meddelande från en partitionerad kö eller ett ämne.There is no additional cost when sending a message to, or receiving a message from, a partitioned queue or topic.

Aktivera partioneringEnable partitioning

Använd Azure SDK 2.2 eller senare för att använda partitionerade köer och ämnen med Azure Service Bus, eller ange api-version=2013-10 eller senare i HTTP-förfrågningar.To use partitioned queues and topics with Azure Service Bus, use the Azure SDK version 2.2 or later, or specify api-version=2013-10 or later in your HTTP requests.

StandardStandard

I Standard messaging-nivån kan skapa du Service Bus-köer och ämnen i 1, 2, 3, 4 eller 5 GB storlekar (standardvärdet är 1 GB).In the Standard messaging tier, you can create Service Bus queues and topics in 1, 2, 3, 4, or 5-GB sizes (the default is 1 GB). Med partitionering aktiverat, skapar Service Bus 16 kopior (16 partitioner) av entiteten, var och en av samma storlek som har angetts.With partitioning enabled, Service Bus creates 16 copies (16 partitions) of the entity, each of the same size specified. Därmed, om du skapar en kö som är 5 GB i storlek med 16 partitioner största köstorlek blir (5 * 16) = 80 GB.As such, if you create a queue that's 5 GB in size, with 16 partitions the maximum queue size becomes (5 * 16) = 80 GB. Du kan se den maximala storleken för din partitionerad kö eller ämne genom att titta på posten den Azure-portaleni den översikt bladet för denna entitet.You can see the maximum size of your partitioned queue or topic by looking at its entry on the Azure portal, in the Overview blade for that entity.

PremiumPremium

I ett namnområde för Premium-nivån stöds inte partitionering entiteter.In a Premium tier namespace, partitioning entities are not supported. Du kan dock fortfarande skapa Service Bus-köer och ämnen i 1, 2, 3, 4, 5, 10, 20, 40 eller 80 GB storlekar (standardvärdet är 1 GB).However, you can still create Service Bus queues and topics in 1, 2, 3, 4, 5, 10, 20, 40, or 80-GB sizes (the default is 1 GB). Du kan se storleken på din kö eller ett ämne genom att titta på posten den Azure-portaleni den översikt bladet för denna entitet.You can see the size of your queue or topic by looking at its entry on the Azure portal, in the Overview blade for that entity.

Skapa en partitionerad entitetCreate a partitioned entity

Det finns flera sätt att skapa en partitionerad kö eller ett ämne.There are several ways to create a partitioned queue or topic. När du skapar kön eller ämnet från ditt program kan du aktivera partitionering för kön eller ämnet genom att ange respektive den QueueDescription.EnablePartitioning QueueDescription.EnablePartitioning eller TopicDescription.EnablePartitioning TopicDescription.EnablePartitioning egenskap SANT.When you create the queue or topic from your application, you can enable partitioning for the queue or topic by respectively setting the QueueDescription.EnablePartitioning or TopicDescription.EnablePartitioning property to true. De här egenskaperna måste anges vid tiden kön eller ämnet har skapats och är endast tillgängliga i den äldre WindowsAzure.ServiceBus biblioteket.These properties must be set at the time the queue or topic is created, and are available only in the older WindowsAzure.ServiceBus library. Som tidigare nämnts bör går det inte att ändra de här egenskaperna på en befintlig kö eller ämne.As stated previously, it is not possible to change these properties on an existing queue or topic. Exempel:For example:

// Create partitioned topic
NamespaceManager ns = NamespaceManager.CreateFromConnectionString(myConnectionString);
TopicDescription td = new TopicDescription(TopicName);
td.EnablePartitioning = true;
ns.CreateTopic(td);

Du kan också skapa en partitionerad kö eller ett ämne i den Azure-portalen.Alternatively, you can create a partitioned queue or topic in the Azure portal. När du skapar en kö eller ämne i portalen på aktivera partitionering alternativ i kön eller ämnet skapa dialogrutan är markerad som standard.When you create a queue or topic in the portal, the Enable partitioning option in the queue or topic Create dialog box is checked by default. Du kan bara inaktivera det här alternativet i en Standard-nivån entity; på Premium-nivån partitionering stöds inte, och kryssrutan har ingen effekt.You can only disable this option in a Standard tier entity; in the Premium tier partitioning is not supported, and the checkbox has no effect.

Användning av partitionsnycklarUse of partition keys

När ett meddelande i kön till en partitionerad kö eller ett ämne, kontrollerar Service Bus förekomsten av en partitionsnyckel.When a message is enqueued into a partitioned queue or topic, Service Bus checks for the presence of a partition key. Om den hittar en väljs partitionen baserat på nyckeln.If it finds one, it selects the partition based on that key. Om den inte hittar en partitionsnyckel, väljs den partition som baseras på en intern algoritm.If it does not find a partition key, it selects the partition based on an internal algorithm.

Med hjälp av en partitionsnyckelUsing a partition key

Vissa scenarier, till exempel sessioner eller transaktioner, behöver meddelanden som ska lagras i en specifik partition.Some scenarios, such as sessions or transactions, require messages to be stored in a specific partition. De här scenarierna kräver användning av en partitionsnyckel.All these scenarios require the use of a partition key. Alla meddelanden som använder samma partitionsnyckel tilldelas till samma partition.All messages that use the same partition key are assigned to the same partition. Om partitionen är inte tillgänglig för tillfället, returneras ett fel i Service Bus.If the partition is temporarily unavailable, Service Bus returns an error.

Beroende på scenario används olika meddelandeegenskaper som en partitionsnyckel:Depending on the scenario, different message properties are used as a partition key:

Sessions-ID: Om ett meddelande har den SessionId egenskapsuppsättning och Service Bus använder sedan SessionID som partitionsnyckel.SessionId: If a message has the SessionId property set, then Service Bus uses SessionID as the partition key. På så sätt kan hanteras alla meddelanden som hör till samma session av samma meddelandekö.This way, all messages that belong to the same session are handled by the same message broker. Sessioner gör att Service Bus att garantera meddelandeordningsföljd samt konsekvenskontroll av sessionstillstånd.Sessions enable Service Bus to guarantee message ordering as well as the consistency of session states.

PartitionKey: Om ett meddelande har den PartitionKey egenskapen men inte den SessionId egenskapsuppsättning och Service Bus använder sedan den PartitionKey egenskapsvärdet som partitionsnyckel.PartitionKey: If a message has the PartitionKey property but not the SessionId property set, then Service Bus uses the PartitionKey property value as the partition key. Om meddelandet har både den SessionId och PartitionKey egenskaper definierade båda egenskaperna måste vara identiska.If the message has both the SessionId and the PartitionKey properties set, both properties must be identical. Om den PartitionKey egenskapen till ett annat värde än den SessionId egenskapen, Service Bus returnerar ett ogiltigt åtgärdsundantag.If the PartitionKey property is set to a different value than the SessionId property, Service Bus returns an invalid operation exception. Den PartitionKey egenskapen ska användas om en avsändare skickar-session medveten transaktionella meddelanden.The PartitionKey property should be used if a sender sends non-session aware transactional messages. Partitionsnyckeln säkerställer att alla meddelanden som skickas i en transaktion som hanteras av samma asynkrona meddelandekön.The partition key ensures that all messages that are sent within a transaction are handled by the same messaging broker.

MessageId: Om kön eller ämnet har den RequiresDuplicateDetection egenskapen SANT och SessionId eller PartitionKey egenskaper inte har angetts, kommer MessageId egenskapsvärdet fungerar som partitionsnyckel.MessageId: If the queue or topic has the RequiresDuplicateDetection property set to true and the SessionId or PartitionKey properties are not set, then the MessageId property value serves as the partition key. (Microsoft .NET och AMQP bibliotek automatiskt tilldela en meddelande-ID om det sändande programmet inte.) I det här fallet hanteras alla kopior av samma meddelande av samma meddelandekö.(The Microsoft .NET and AMQP libraries automatically assign a message ID if the sending application does not.) In this case, all copies of the same message are handled by the same message broker. Detta ID kan Service Bus att identifiera och eliminera dubbletter av meddelanden.This ID enables Service Bus to detect and eliminate duplicate messages. Om den RequiresDuplicateDetection egenskapen inte är inställt på SANT, Service Bus beaktar inte den MessageId egenskapen som en partitionsnyckel.If the RequiresDuplicateDetection property is not set to true, Service Bus does not consider the MessageId property as a partition key.

Inte använder en partitionsnyckelNot using a partition key

Om en partitionsnyckel distribuerar Service Bus meddelanden i en resursallokering till alla partitioner i partitionerad kö eller ämne.In the absence of a partition key, Service Bus distributes messages in a round-robin fashion to all the partitions of the partitioned queue or topic. Om den valda partitionen inte är tillgänglig, tilldelar Service Bus meddelandet till en annan partition.If the chosen partition is not available, Service Bus assigns the message to a different partition. På så sätt kan skicka åtgärden lyckas trots meddelandelagring är tillfälligt otillgänglig.This way, the send operation succeeds despite the temporary unavailability of a messaging store. Du kommer dock inte uppnå garanterad sorteringen som tillhandahåller en partitionsnyckel.However, you will not achieve the guaranteed ordering that a partition key provides.

En mer detaljerad beskrivning av förhållandet mellan tillgänglighet (inga partitionsnyckel) och konsekvens (med en partitionsnyckel) finns i i den här artikeln.For a more in-depth discussion of the tradeoff between availability (no partition key) and consistency (using a partition key), see this article. Den här informationen gäller lika partitionerade Service Bus-enheter.This information applies equally to partitioned Service Bus entities.

För att ge Service Bus finns tillräckligt med tid för att sätta meddelandet i en annan partition, den OperationTimeout värdet som angetts för den klient som skickar meddelandet måste vara större än 15 sekunder.To give Service Bus enough time to enqueue the message into a different partition, the OperationTimeout value specified by the client that sends the message must be greater than 15 seconds. Vi rekommenderar att du ställer in den OperationTimeout egenskapen till standardvärdet på 60 sekunder.It is recommended that you set the OperationTimeout property to the default value of 60 seconds.

En partitionsnyckel ”PIN-koder”, ett meddelande till en specifik partition.A partition key "pins" a message to a specific partition. Om meddelandearkivet som innehåller den här partitionen är tillgänglig, returneras ett fel i Service Bus.If the messaging store that holds this partition is unavailable, Service Bus returns an error. Om en partitionsnyckel, Service Bus kan välja en annan partition och åtgärden lyckas.In the absence of a partition key, Service Bus can choose a different partition and the operation succeeds. Vi rekommenderar därför att du inte anger en partitionsnyckel om det inte krävs.Therefore, it is recommended that you do not supply a partition key unless it is required.

Avancerade ämnen: använda transaktioner med partitionerade enheterAdvanced topics: use transactions with partitioned entities

Meddelanden som skickas som del i en transaktion måste ange en partitionsnyckel.Messages that are sent as part of a transaction must specify a partition key. Nyckeln kan vara något av följande egenskaper: Sessions-ID, PartitionKey, eller MessageId.The key can be one of the following properties: SessionId, PartitionKey, or MessageId. Alla meddelanden som skickas som en del av samma transaktion måste ange samma partitionsnyckel.All messages that are sent as part of the same transaction must specify the same partition key. Om du försöker skicka ett meddelande utan någon partitionsnyckel inom en transaktion, returnerar ett ogiltigt åtgärdsundantag i Service Bus.If you attempt to send a message without a partition key within a transaction, Service Bus returns an invalid operation exception. Om du försöker skicka flera meddelanden inom samma transaktion som har olika partitionsnycklar, returnerar ett ogiltigt åtgärdsundantag i Service Bus.If you attempt to send multiple messages within the same transaction that have different partition keys, Service Bus returns an invalid operation exception. Exempel:For example:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    Message msg = new Message("This is a message");
    msg.PartitionKey = "myPartitionKey";
    messageSender.SendAsync(msg); 
    ts.CompleteAsync();
}
committableTransaction.Commit();

Om någon av de egenskaper som fungerar som en partitionsnyckel ställs in, låser Service Bus meddelandet till en specifik partition.If any of the properties that serve as a partition key are set, Service Bus pins the message to a specific partition. Detta beror på om huruvida en transaktion används.This behavior occurs whether or not a transaction is used. Vi rekommenderar att du inte anger en partitionsnyckel om det inte är nödvändigt.It is recommended that you do not specify a partition key if it is not necessary.

Med sessioner med partitionerade enheterUsing sessions with partitioned entities

Om du vill skicka ett transaktionsmeddelande till en session-medvetna ämne eller en kö, meddelandet måste ha den SessionId egenskapsuppsättning.To send a transactional message to a session-aware topic or queue, the message must have the SessionId property set. Om den PartitionKey egenskap har angetts, det måste vara identisk med den SessionId egenskapen.If the PartitionKey property is specified as well, it must be identical to the SessionId property. Om de skiljer sig returnerar ett ogiltigt åtgärdsundantag i Service Bus.If they differ, Service Bus returns an invalid operation exception.

Till skillnad från vanlig (icke-partitionerad) köer eller ämnen går det inte att använda en enda transaktion för att skicka flera meddelanden till olika sessioner.Unlike regular (non-partitioned) queues or topics, it is not possible to use a single transaction to send multiple messages to different sessions. Om du försöker returnerar ett ogiltigt åtgärdsundantag i Service Bus.If attempted, Service Bus returns an invalid operation exception. Exempel:For example:

CommittableTransaction committableTransaction = new CommittableTransaction();
using (TransactionScope ts = new TransactionScope(committableTransaction))
{
    Message msg = new Message("This is a message");
    msg.SessionId = "mySession";
    messageSender.SendAsync(msg); 
    ts.CompleteAsync();
}
committableTransaction.Commit();

Automatisk vidarebefordring med partitionerade enheterAutomatic message forwarding with partitioned entities

Service Bus stöder automatisk meddelande vidarebefordran från, till eller mellan partitionerade enheter.Service Bus supports automatic message forwarding from, to, or between partitioned entities. Om du vill aktivera automatisk vidarebefordring, ange den QueueDescription.ForwardTo QueueDescription.ForwardTo egenskapen källkön eller prenumeration.To enable automatic message forwarding, set the QueueDescription.ForwardTo property on the source queue or subscription. Om meddelandet anger en partitionsnyckel (SessionId, PartitionKey, eller MessageId), som partitionsnyckel används för målentitet.If the message specifies a partition key (SessionId, PartitionKey, or MessageId), that partition key is used for the destination entity.

Överväganden och riktlinjerConsiderations and guidelines

  • Hög konsekvens funktioner: Om en entitet använder funktioner som sessioner, identifiering av dubbletter eller explicit kontroll över Partitioneringsnyckel, sedan dirigeras meddelandeåtgärder alltid till specifik partition.High consistency features: If an entity uses features such as sessions, duplicate detection, or explicit control of partitioning key, then the messaging operations are always routed to specific partition. Om någon av partitionerna har hög belastning eller det underliggande arkivet är i feltillstånd, dessa åtgärder misslyckas och tillgänglighet minskar.If any of the partitions experience high traffic or the underlying store is unhealthy, those operations fail and availability is reduced. Övergripande är konsekvens fortfarande mycket högre än partitionerade enheter. endast en delmängd av trafiken upplever problem, till skillnad från all trafik.Overall, the consistency is still much higher than non-partitioned entities; only a subset of traffic is experiencing issues, as opposed to all the traffic. Mer information finns i den här beskrivning av tillgänglighet och konsekvens.For more information, see this discussion of availability and consistency.
  • Hantering av: Åtgärder som att skapa, uppdatera och ta bort måste utföras på alla partitioner i entiteten.Management: Operations such as Create, Update, and Delete must be performed on all the partitions of the entity. Om en partition är skadad, kan det resultera i fel för dessa åtgärder.If any partition is unhealthy, it could result in failures for these operations. För Get-åtgärden måste information som meddelandet som aggregeras från alla partitioner.For the Get operation, information such as message counts must be aggregated from all partitions. Om en partition är felaktiga, har Tillgänglighetsstatus för entiteten rapporterats som begränsad.If any partition is unhealthy, the entity availability status is reported as limited.
  • Låg volym meddelande scenarier: I sådana scenarier, särskilt när de använder HTTP-protokollet, kan du behöva utföra flera ta emot för att hämta alla meddelanden.Low volume message scenarios: For such scenarios, especially when using the HTTP protocol, you may have to perform multiple receive operations in order to obtain all the messages. Ta emot förfrågningar klientdelen utför mottagning på alla partitioner och cachelagrar alla svar som tagits emot.For receive requests, the front end performs a receive on all the partitions and caches all the responses received. En efterföljande receive-begäran på samma anslutning kan dra nytta av den här cachelagring och ta emot svarstiderna blir lägre.A subsequent receive request on the same connection would benefit from this caching and receive latencies will be lower. Men om du har flera anslutningar eller använda HTTP upprättar som en ny anslutning för varje begäran.However, if you have multiple connections or use HTTP, that establishes a new connection for each request. Det finns därför ingen garanti för att den skulle hamna på samma nod.As such, there is no guarantee that it would land on the same node. Om alla befintliga meddelanden är låst och cachelagras i en annan klientdel, Mottagningsåtgärden returnerar null.If all existing messages are locked and cached in another front end, the receive operation returns null. Meddelanden förfaller så småningom och du kan få dem igen.Messages eventually expire and you can receive them again. HTTP keep-alive rekommenderas.HTTP keep-alive is recommended.
  • Bläddra/Peek meddelanden: Endast tillgänglig i den äldre WindowsAzure.ServiceBus biblioteket.Browse/Peek messages: Available only in the older WindowsAzure.ServiceBus library. PeekBatch inte alltid returnerar antalet meddelanden som anges i den MessageCount egenskapen.PeekBatch does not always return the number of messages specified in the MessageCount property. Det finns två vanliga orsaker till problemet.There are two common reasons for this behavior. En orsak är att mängden meddelanden aggregerade storlek överskrider den maximala storleken på 256 KB.One reason is that the aggregated size of the collection of messages exceeds the maximum size of 256 KB. En annan orsak är att om kön eller ämnet har den EnablePartitioning egenskapen inställd SANT, en partition kanske inte har tillräckligt med meddelanden för att slutföra det begärda antalet meddelanden.Another reason is that if the queue or topic has the EnablePartitioning property set to true, a partition may not have enough messages to complete the requested number of messages. I allmänhet om ett program vill få ett visst antal meddelanden, det bör anropa PeekBatch upprepade gånger tills det blir det antalet meddelanden eller så finns det inga fler meddelanden att granska.In general, if an application wants to receive a specific number of messages, it should call PeekBatch repeatedly until it gets that number of messages, or there are no more messages to peek. Mer information, inklusive exempel, finns det QueueClient.PeekBatch eller SubscriptionClient.PeekBatch API-dokumentationen.For more information, including code samples, see the QueueClient.PeekBatch or SubscriptionClient.PeekBatch API documentation.

Senaste tillagda funktionerLatest added features

Partitionerade enheter begränsningarPartitioned entities limitations

Service Bus tillämpar för närvarande följande begränsningar på partitionerade köer och ämnen:Currently Service Bus imposes the following limitations on partitioned queues and topics:

  • Partitionerade köer och ämnen stöds inte på nivån Premium och meddelanden.Partitioned queues and topics are not supported in the Premium messaging tier. Sessioner stöds på den högsta nivån med hjälp av sessions-ID.Sessions are supported in the premier tier by using SessionId.
  • Partitionerade köer och ämnen stöder inte skicka meddelanden som hör till olika sessioner i en enda transaktion.Partitioned queues and topics do not support sending messages that belong to different sessions in a single transaction.
  • Service Bus tillåter för närvarande upp till 100 partitionerade köer och ämnen per namnområde.Service Bus currently allows up to 100 partitioned queues or topics per namespace. Varje partitionerad kö eller ämne räknas mot kvoten på 10 000 enheter per namnområde (inte gäller för Premium-nivån).Each partitioned queue or topic counts towards the quota of 10,000 entities per namespace (does not apply to Premium tier).

Nästa stegNext steps

Läs mer om grundläggande begrepp för den AMQP 1.0 messaging specifikationen i den AMQP 1.0-protokollguide.Read about the core concepts of the AMQP 1.0 messaging specification in the AMQP 1.0 protocol guide.