Filas e tópicos particionadosPartitioned queues and topics

O Azure Service Bus emprega vários mediadores de mensagens para processar mensagens e vários arquivos de mensagens para armazenar as mensagens.Azure Service Bus employs multiple message brokers to process messages and multiple messaging stores to store messages. Uma fila convencional ou um tópico é manipulado por um mediador de mensagem única e armazenado num arquivo de mensagens.A conventional queue or topic is handled by a single message broker and stored in one messaging store. Do Service Bus partições ativar as filas e tópicos, ou entidades de mensagens, para ser particionado em vários mediadores de mensagens e arquivos de mensagens.Service Bus partitions enable queues and topics, or messaging entities, to be partitioned across multiple message brokers and messaging stores. Criação de partições, significa que o débito total de uma entidade com partições já não está limitado pelo desempenho de um mediador de mensagem única ou arquivo de mensagens.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. Além disso, uma indisponibilidade temporária de um arquivo de mensagens não processa uma particionada fila ou tópico indisponível.In addition, a temporary outage of a messaging store does not render a partitioned queue or topic unavailable. Filas e tópicos particionados podem conter avançadas todas as funcionalidades do Service Bus, como o suporte para transações e sessões.Partitioned queues and topics can contain all advanced Service Bus features, such as support for transactions and sessions.

Nota

Criação de partições está disponível durante a criação de entidade para todas as filas e tópicos no Basic ou SKUs padrão.Partitioning is available at entity creation for all queues and topics in Basic or Standard SKUs. Não está disponível para o SKU de mensagens de Premium, mas qualquer entidades particionadas já existentes em espaços de nomes Premium continuam a funcionar conforme esperado.It is not available for the Premium messaging SKU, but any previously existing partitioned entities in Premium namespaces continue to work as expected.

Não é possível alterar a opção de criação de partições em qualquer fila existente ou um tópico; apenas pode definir a opção ao criar a entidade.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.

Como funcionaHow it works

Cada particionada fila ou tópico consiste em várias partições.Each partitioned queue or topic consists of multiple partitions. Cada partição é armazenada num arquivo de mensagens diferente e manipulada por um mediador de mensagem diferente.Each partition is stored in a different messaging store and handled by a different message broker. Quando uma mensagem é enviada para uma fila particionada ou um tópico, o Service Bus atribui a mensagem a uma das partições.When a message is sent to a partitioned queue or topic, Service Bus assigns the message to one of the partitions. A seleção é feita aleatoriamente ao Service Bus ou ao utilizar uma chave de partição que o remetente pode especificar.The selection is done randomly by Service Bus or by using a partition key that the sender can specify.

Quando um cliente pretende receber uma mensagem de uma fila particionada, ou a partir de uma subscrição para um tópico particionado, consultas do Service Bus todas as partições para mensagens, em seguida, devolve a primeira mensagem que é obtida a partir de qualquer um dos arquivos de mensagens para o recetor.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. Pedidos de receção de caches do Service Bus, as outras mensagens e devolve-os ao receber adicionais.Service Bus caches the other messages and returns them when it receives additional receive requests. Um cliente de receção não está ciente do particionamento; o comportamento com clientes de uma fila particionada ou um tópico (por exemplo, ler, concluir, diferir, mensagens não entregues, pré-busca) é idêntico ao comportamento de uma entidade regular.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.

Não existe nenhum custo adicional quando uma mensagem a enviar ou receber uma mensagem de uma fila particionada ou tópico.There is no additional cost when sending a message to, or receiving a message from, a partitioned queue or topic.

Ativar a criação de partiçõesEnable partitioning

Para utilizar as filas e tópicos particionados com o Azure Service Bus, utilizar o Azure SDK versão 2.2 ou posterior ou especifique api-version=2013-10 ou posterior nos seus pedidos HTTP.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

No escalão mensagens padrão, pode criar filas do Service Bus e tópicos em 1, 2, 3, 4 ou tamanhos de 5 GB (a predefinição é 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). Com a criação de partições ativado, o Service Bus cria cópias de 16 (16 partições) da entidade, cada um o mesmo tamanho especificado.With partitioning enabled, Service Bus creates 16 copies (16 partitions) of the entity, each of the same size specified. Assim, se criar uma fila que é de 5 GB de tamanho, com 16 partições o tamanho máximo da fila se torna (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. Pode ver o tamanho máximo de sua particionada fila ou tópico examinando sua entrada portal do Azure, no descrição geral painel para essa entidade.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

Um espaço de nomes de escalão Premium, as entidades de criação de partições não são suportadas.In a Premium tier namespace, partitioning entities are not supported. No entanto, pode ainda criar tópicos e filas do Service Bus em 1, 2, 3, 4, 5, 10, 20, 40 ou tamanhos de 80 GB (a predefinição é 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). Pode ver o tamanho da sua fila ou tópico examinando sua entrada portal do Azure, no descrição geral painel para essa entidade.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.

Criar uma entidade com partiçõesCreate a partitioned entity

Existem várias formas de criar uma fila particionada ou tópico.There are several ways to create a partitioned queue or topic. Ao criar a fila ou tópico da sua aplicação, pode ativar a criação de partições para a fila ou tópico, respectivamente definindo a QueueDescription.EnablePartitioning QueueDescription.EnablePartitioning ou TopicDescription.EnablePartitioning TopicDescription.EnablePartitioning propriedade verdadeiro.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. Estas propriedades tem de ser definidas no momento da fila ou tópico é criado e estão disponíveis apenas no antigo windowsazure. Servicebus biblioteca.These properties must be set at the time the queue or topic is created, and are available only in the older WindowsAzure.ServiceBus library. Conforme indicado anteriormente, não é possível alterar essas propriedades num tópico ou fila existente.As stated previously, it is not possible to change these properties on an existing queue or topic. Por exemplo:For example:

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

Em alternativa, pode criar uma fila particionada ou um tópico no portal do Azure.Alternatively, you can create a partitioned queue or topic in the Azure portal. Quando cria uma fila ou tópico no portal, o ativar a criação de partições opção na fila ou tópico criar caixa de diálogo é marcada por padrão.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. Apenas pode desativar esta opção numa entidade de escalão Standard; no escalão Premium de criação de partições não é suportada e a caixa de verificação não tem qualquer efeito.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.

Utilização de chaves de partiçãoUse of partition keys

Quando uma mensagem é colocado em fila numa fila particionada ou um tópico, o Service Bus verifica a presença de uma chave de partição.When a message is enqueued into a partitioned queue or topic, Service Bus checks for the presence of a partition key. Se ele encontrar um, seleciona a partição com base nessa chave.If it finds one, it selects the partition based on that key. Se não encontrar uma chave de partição, seleciona a partição com base num algoritmo interno.If it does not find a partition key, it selects the partition based on an internal algorithm.

Utilizar uma chave de partiçãoUsing a partition key

Alguns cenários, tais como sessões ou de transações, exigem que as mensagens sejam armazenados numa partição específica.Some scenarios, such as sessions or transactions, require messages to be stored in a specific partition. Todos esses cenários requerem a utilização de uma chave de partição.All these scenarios require the use of a partition key. Todas as mensagens que utilizam a mesma chave de partição são atribuídas para a mesma partição.All messages that use the same partition key are assigned to the same partition. Se a partição está temporariamente indisponível, o Service Bus devolve um erro.If the partition is temporarily unavailable, Service Bus returns an error.

Dependendo do cenário, as propriedades de mensagem diferente são utilizadas como uma chave de partição:Depending on the scenario, different message properties are used as a partition key:

SessionId: Se tiver uma mensagem a SessionId propriedade definida, em seguida, o Service Bus utiliza SessionID como a chave de partição.SessionId: If a message has the SessionId property set, then Service Bus uses SessionID as the partition key. Dessa forma, todas as mensagens que pertencem à mesma sessão são processadas pelo mesmo message broker.This way, all messages that belong to the same session are handled by the same message broker. Sessões de ativar o Service Bus para garantir a ordenação, bem como a consistência dos Estados de sessão.Sessions enable Service Bus to guarantee message ordering as well as the consistency of session states.

PartitionKey: Se tiver uma mensagem a PartitionKey propriedade, mas não a SessionId propriedade definida, em seguida, o Service Bus utiliza o PartitionKey valor da propriedade como a chave de partição.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. Se a mensagem tem ambos os SessionId e o PartitionKey conjunto de propriedades, ambas as propriedades têm de ser idênticas.If the message has both the SessionId and the PartitionKey properties set, both properties must be identical. Se o PartitionKey estiver definida como um valor diferente para o SessionId propriedade, barramento de serviço retorna uma exceção de operação inválido.If the PartitionKey property is set to a different value than the SessionId property, Service Bus returns an invalid operation exception. O PartitionKey propriedade deve ser utilizada se um remetente envia mensagens transacionais com reconhecimento de não é de sessão.The PartitionKey property should be used if a sender sends non-session aware transactional messages. A chave de partição garante que todas as mensagens que são enviadas dentro de uma transação são processadas pelo mesmo broker mensagens.The partition key ensures that all messages that are sent within a transaction are handled by the same messaging broker.

MessageId: Se a fila ou tópico tem o RequiresDuplicateDetection definida como true e o SessionId ou PartitionKey propriedades não estão definidas, o MessageId valor da propriedade serve como a chave de partição.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. (As bibliotecas do Microsoft .NET e AMQP atribuir automaticamente um ID de mensagem se o aplicativo de envio não existir.) Neste caso, todas as cópias da mesma mensagem são processadas pelo mesmo message broker.(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. Este ID permite que o Service Bus para detetar e eliminar as mensagens duplicadas.This ID enables Service Bus to detect and eliminate duplicate messages. Se o RequiresDuplicateDetection propriedade não está definida como true, do Service Bus não considera o MessageId propriedade como uma chave de partição.If the RequiresDuplicateDetection property is not set to true, Service Bus does not consider the MessageId property as a partition key.

Não utilizar uma chave de partiçãoNot using a partition key

Na ausência de uma chave de partição, do Service Bus distribui mensagens de uma forma de rodízio para todas as partições da particionada fila ou tópico.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. Se a partição escolhida não estiver disponível, o Service Bus atribui a mensagem a uma partição diferente.If the chosen partition is not available, Service Bus assigns the message to a different partition. Dessa forma, a operação de envio for bem-sucedido apesar da indisponibilidade temporária de um arquivo de mensagens.This way, the send operation succeeds despite the temporary unavailability of a messaging store. No entanto, não obterá a ordenação garantido que fornece uma chave de partição.However, you will not achieve the guaranteed ordering that a partition key provides.

Para uma discussão mais aprofundada sobre o compromisso entre disponibilidade (nenhuma chave de partição) e consistência (com uma chave de partição), consulte este artigo.For a more in-depth discussion of the tradeoff between availability (no partition key) and consistency (using a partition key), see this article. Estas informações se aplica igualmente a entidades particionadas do Service Bus.This information applies equally to partitioned Service Bus entities.

Para dar do Service Bus suficiente tempo para colocar em fila a mensagem numa partição diferente, o OperationTimeout valor especificado pelo cliente que envia a mensagem deve ser superior a 15 segundos.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. É recomendado que defina os OperationTimeout propriedade para o valor predefinido de 60 segundos.It is recommended that you set the OperationTimeout property to the default value of 60 seconds.

Uma chave de partição "fixa" uma mensagem para uma partição específica.A partition key "pins" a message to a specific partition. Se o arquivo de mensagens que contém esta partição não estiver disponível, o Service Bus devolve um erro.If the messaging store that holds this partition is unavailable, Service Bus returns an error. Na ausência de uma chave de partição, do Service Bus pode escolher uma partição diferente e a operação for concluída com êxito.In the absence of a partition key, Service Bus can choose a different partition and the operation succeeds. Por conseguinte, é recomendado que não está a fornecer uma chave de partição, a menos que seja necessário.Therefore, it is recommended that you do not supply a partition key unless it is required.

Tópicos avançados: utilizar transações com entidades particionadasAdvanced topics: use transactions with partitioned entities

As mensagens que são enviadas como parte de uma transação têm de especificar uma chave de partição.Messages that are sent as part of a transaction must specify a partition key. A chave pode ser uma das seguintes propriedades: SessionId, PartitionKey, ou MessageId.The key can be one of the following properties: SessionId, PartitionKey, or MessageId. Todas as mensagens que são enviadas como parte da mesma transação tem de especificar a mesma chave de partição.All messages that are sent as part of the same transaction must specify the same partition key. Se tentar enviar uma mensagem sem uma chave de partição dentro de uma transação, o Service Bus devolve uma exceção de operação inválido.If you attempt to send a message without a partition key within a transaction, Service Bus returns an invalid operation exception. Se está tentando enviar várias mensagens na mesma transação que têm chaves de partição diferentes, o Service Bus devolve uma exceção de operação inválido.If you attempt to send multiple messages within the same transaction that have different partition keys, Service Bus returns an invalid operation exception. Por exemplo: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();

Se qualquer uma das propriedades que servem como uma chave de partição forem definidas, o Service Bus fixa a mensagem para uma partição específica.If any of the properties that serve as a partition key are set, Service Bus pins the message to a specific partition. Este comportamento ocorre independentemente de uma transação é utilizada.This behavior occurs whether or not a transaction is used. Recomenda-se que não especificar uma chave de partição se não for necessário.It is recommended that you do not specify a partition key if it is not necessary.

Utilizar sessões com entidades particionadasUsing sessions with partitioned entities

Para enviar uma mensagem transacional para um tópico com reconhecimento de sessão ou a fila, a mensagem tem de ter o SessionId propriedade definida.To send a transactional message to a session-aware topic or queue, the message must have the SessionId property set. Se o PartitionKey propriedade for especificada, bem, tem de ser idêntico do SessionId propriedade.If the PartitionKey property is specified as well, it must be identical to the SessionId property. Caso sejam diferentes, o barramento de serviço retorna uma exceção de operação inválido.If they differ, Service Bus returns an invalid operation exception.

Ao contrário das filas (não-particionada) regulares ou tópicos, não é possível utilizar uma única transação para enviar várias mensagens para diferentes sessões.Unlike regular (non-partitioned) queues or topics, it is not possible to use a single transaction to send multiple messages to different sessions. Se tentou, o Service Bus devolve uma exceção de operação inválido.If attempted, Service Bus returns an invalid operation exception. Por exemplo: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();

Reencaminhamento de mensagens automáticas com entidades particionadasAutomatic message forwarding with partitioned entities

Service Bus suporta mensagem automática de reencaminhamento de, para ou entre entidades particionadas.Service Bus supports automatic message forwarding from, to, or between partitioned entities. Para ativar o reencaminhamento de mensagens automática, defina o QueueDescription.ForwardTo QueueDescription.ForwardTo propriedade na fila de origem ou subscrição.To enable automatic message forwarding, set the QueueDescription.ForwardTo property on the source queue or subscription. Se a mensagem de especificar uma chave de partição (SessionId, PartitionKey, ou MessageId), essa chave de partição é utilizada para a entidade de destino.If the message specifies a partition key (SessionId, PartitionKey, or MessageId), that partition key is used for the destination entity.

Considerações e diretrizesConsiderations and guidelines

  • Recursos de uniformização elevada: Se uma entidade utiliza funcionalidades como sessões, deteção de duplicados ou controle explícito da chave de criação de partições, em seguida, as operações de mensagens são sempre encaminhadas para a partição específica.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. Se nenhuma das partições ocorrerem tráfego elevado ou o armazenamento subjacente está danificado, essas operações falharem e disponibilidade é reduzida.If any of the partitions experience high traffic or the underlying store is unhealthy, those operations fail and availability is reduced. Em geral, a consistência é ainda muito maior do que as entidades de não-particionada; apenas um subconjunto de tráfego está a ter problemas, em vez de todo o tráfego.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. Para obter mais informações, consulte esta discussão sobre disponibilidade e consistência.For more information, see this discussion of availability and consistency.
  • Gestão: Operações, tais como Create, Update e Delete devem ser executadas em todas as partições da entidade.Management: Operations such as Create, Update, and Delete must be performed on all the partitions of the entity. Se qualquer partição está danificada, pode resultar em falhas para essas operações.If any partition is unhealthy, it could result in failures for these operations. Para a operação de obtenção de informações como mensagem conta tem de ser agregadas de todas as partições.For the Get operation, information such as message counts must be aggregated from all partitions. Se qualquer partição está danificada, o estado de disponibilidade da entidade é comunicado como limitado.If any partition is unhealthy, the entity availability status is reported as limited.
  • Cenários de mensagem do volume de baixa: Para estes cenários, especialmente quando se utilizam o protocolo HTTP, poderá ter de efetuar várias receber operações para obter todas as mensagens.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. Para pedidos de receção, o front-end executa um receive em todas as partições e armazena em cache todas as respostas recebidas.For receive requests, the front end performs a receive on all the partitions and caches all the responses received. Um pedido de receção subsequentes na mesma conexão seria beneficiar Esta colocação em cache e receber latências será inferiores.A subsequent receive request on the same connection would benefit from this caching and receive latencies will be lower. No entanto, se tiver várias ligações ou utilizar HTTP, que estabelece uma ligação nova para cada solicitação.However, if you have multiple connections or use HTTP, that establishes a new connection for each request. Como tal, não é garantido que ele seria apresentado no mesmo nó.As such, there is no guarantee that it would land on the same node. Se todas as mensagens existentes são bloqueadas e armazenados em cache no outro front-end, a operação receive devolve nulo.If all existing messages are locked and cached in another front end, the receive operation returns null. As mensagens expiram, eventualmente, e pode recebê-las novamente.Messages eventually expire and you can receive them again. Recomenda-se a ligação keep-alive de HTTP.HTTP keep-alive is recommended.
  • Procurar/Peek mensagens: Disponível apenas no antigo windowsazure. Servicebus biblioteca.Browse/Peek messages: Available only in the older WindowsAzure.ServiceBus library. PeekBatch não devolve o número de mensagens especificado no sempre o MessageCount propriedade.PeekBatch does not always return the number of messages specified in the MessageCount property. Existem dois motivos comuns para esse comportamento.There are two common reasons for this behavior. Uma razão é que o tamanho do agregado da coleção de mensagens excede o tamanho máximo de 256 KB.One reason is that the aggregated size of the collection of messages exceeds the maximum size of 256 KB. Outro motivo é que, se a fila ou tópico tem o propriedade EnablePartitioning definida como verdadeiro, uma partição pode não ter suficiente mensagens para concluir o número pedido de mensagens.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. Em geral, se um aplicativo quiser receber um número específico de mensagens, ela deve chamar PeekBatch repetidamente até que ele obtém esse número de mensagens ou não existirem mais mensagens de olhar.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. Para obter mais informações, incluindo exemplos de código, consulte a QueueClient.PeekBatch ou SubscriptionClient.PeekBatch documentação da API.For more information, including code samples, see the QueueClient.PeekBatch or SubscriptionClient.PeekBatch API documentation.

Mais recentes recursos adicionaisLatest added features

Limitações de entidades particionadasPartitioned entities limitations

Atualmente o Service Bus impõe as seguintes limitações nas filas e tópicos particionados:Currently Service Bus imposes the following limitations on partitioned queues and topics:

  • Filas e tópicos particionados não são suportados no escalão mensagens Premium.Partitioned queues and topics are not supported in the Premium messaging tier. Sessões são suportados na camada de premier utilizando SessionId.Sessions are supported in the premier tier by using SessionId.
  • Filas e tópicos particionados não suporta o envio de mensagens que pertencem a diferentes sessões numa única transação.Partitioned queues and topics do not support sending messages that belong to different sessions in a single transaction.
  • Atualmente, o Service Bus permite até 100 filas ou tópicos particionados por espaço de nomes.Service Bus currently allows up to 100 partitioned queues or topics per namespace. Cada particionada fila ou tópico conta para a quota de 10 000 entidades por espaço de nomes (não é aplicável para o escalão Premium).Each partitioned queue or topic counts towards the quota of 10,000 entities per namespace (does not apply to Premium tier).

Passos SeguintesNext steps

Leia sobre os conceitos principais do AMQP 1.0 mensagens especificação na Guia do protocolo AMQP 1.0.Read about the core concepts of the AMQP 1.0 messaging specification in the AMQP 1.0 protocol guide.