Saída do Azure Stream Analytics para o Azure Cosmos DB

A saída do Azure Cosmos DB no Azure Stream Analytics escreve os resultados do processamento de fluxos como documentos JSON num contentor do Azure Cosmos DB. Suporta arquivamento de dados e consultas de baixa latência em dados JSON não estruturados. Compreender como este resultado se comporta ajuda-o a configurá-lo para o rendimento, consistência e partição que o seu cenário exige.

Noções básicas do Azure Cosmos DB como destino de saída

A saída do Azure Cosmos DB do Stream Analytics grava os resultados do processamento do seu fluxo em formato JSON nos contentores do Azure Cosmos DB. Se você não estiver familiarizado com o Azure Cosmos DB, consulte a documentação do Azure Cosmos DB para começar.

O Stream Analytics liga-se ao Azure Cosmos DB apenas através da API SQL. Outras APIs do Azure Cosmos DB ainda não são suportadas. Se você apontar o Stream Analytics para contas do Azure Cosmos DB criadas com outras APIs, os dados podem não estar armazenados corretamente. Quando usares o Azure Cosmos DB como saída, define o teu trabalho para o nível de compatibilidade 1.2.

O Stream Analytics não cria contêineres em seu banco de dados. Em vez disso, requer que você os crie previamente. Em seguida, você pode controlar os custos de cobrança dos contêineres do Azure Cosmos DB. Você também pode ajustar o desempenho, a consistência e a capacidade de seus contêineres diretamente usando as APIs do Azure Cosmos DB. As seções a seguir detalham algumas das opções de contêiner para o Azure Cosmos DB.

Ajustando consistência, disponibilidade e latência

Para corresponder aos requisitos da sua aplicação, ajuste a base de dados e os contentores no Azure Cosmos DB e faça compromissos entre consistência, disponibilidade, latência e rendimento.

Dependendo dos níveis de consistência de leitura que o seu cenário necessita face à latência de leitura e escrita, escolha um nível de consistência na sua conta de base de dados. Para melhorar o rendimento, aumente as Unidades de Pedido (RUs) no contentor. Também por padrão, o Azure Cosmos DB habilita a indexação síncrona em cada operação CRUD para seu contêiner. Esta opção é outra forma útil de controlar o desempenho de leitura e escrita no Azure Cosmos DB. Para obter mais informações, consulte o artigo Alterar os níveis de consistência do seu banco de dados e da consulta.

Inserções e atualizações do Stream Analytics

Ao utilizar a integração do Stream Analytics com o Azure Cosmos DB, pode inserir ou atualizar registos no seu contentor com base numa determinada coluna de ID do Documento. Esta operação também é chamada de upsert. O Stream Analytics usa uma abordagem otimista de atualização. As atualizações acontecem apenas quando uma inserção falha com um conflito de ID de documento.

Ao usar o nível de compatibilidade 1.0, o Stream Analytics executa esta atualização como uma operação PATCH, suportando assim atualizações parciais do documento. O Stream Analytics adiciona novas propriedades ou substitui uma propriedade existente de forma incremental. No entanto, as alterações nos valores das propriedades da matriz em seu documento JSON resultam na substituição de toda a matriz. Ou seja, a matriz não é mesclada.

Ao usar o nível de compatibilidade 1.2, o comportamento do upsert muda para inserir ou substituir o documento. A seção posterior sobre o nível de compatibilidade 1.2 descreve melhor esse comportamento.

Se o documento JSON recebido tiver um campo ID existente, o Azure Cosmos DB usa automaticamente esse campo como a coluna ID do Documento. O Stream Analytics trata quaisquer operações de escrita subsequentes da seguinte forma, o que conduz a uma destas situações:

  • IDs exclusivos resultam em inserção.
  • IDs duplicados e ID de documento definidos como ID levam ao upsert.
  • IDs duplicados e ID de documento não definidos levam a erro, após o primeiro documento.

Se você quiser salvar todos os documentos, incluindo aqueles que têm uma ID duplicada, renomeie o campo ID em sua consulta (usando a palavra-chave AS ). Deixe que o Azure Cosmos DB crie o campo ID ou substitua o ID pelo valor de outra coluna (usando a palavra-chave AS ou a configuração de ID do documento).

Particionamento de dados no Azure Cosmos DB

O Azure Cosmos DB dimensiona automaticamente partições com base na sua carga de trabalho. Utilize contentores ilimitados para particionar os seus dados. Quando o Stream Analytics grava em contêineres ilimitados, ele usa tantos gravadores paralelos quanto a etapa de consulta anterior ou o esquema de particionamento de entrada.

Nota

O Azure Stream Analytics suporta apenas contentores ilimitados com chaves de partição no nível superior. Por exemplo, /region é suportado. Chaves de partição aninhadas (por exemplo, /region/name) não são suportadas.

Dependendo da sua escolha de chave de partição, poderá receber este aviso:

CosmosDB Output contains multiple rows and just one row per partition key. If the output latency is higher than expected, consider choosing a partition key that contains at least several hundred records per partition key.

Escolha uma propriedade de chave de partição que tenha muitos valores distintos e distribua a sua carga de trabalho de forma uniforme entre esses valores. Como consequência natural da particionação, a taxa de transferência máxima de uma única partição limita os pedidos que utilizam a mesma chave de partição.

O tamanho de armazenamento para documentos que pertencem ao mesmo valor de chave de partição é limitado a 20 GB (o limite de tamanho de partição física é de 50 GB). Uma chave de partição ideal é aquela que aparece frequentemente como filtro nas suas consultas e tem cardinalidade suficiente para garantir que a sua solução é escalável.

As chaves de partição usadas para consultas do Stream Analytics e do Azure Cosmos DB não precisam ser idênticas. Para topologias totalmente paralelas, use a chave de partição de entrada, PartitionId, como chave de partição da consulta Stream Analytics, mas essa escolha pode não ser a recomendável para a chave de partição de um contentor Azure Cosmos DB.

Uma chave de partição também é o limite para transações em procedimentos armazenados e gatilhos para o Azure Cosmos DB. Escolha a chave de partição para que os documentos que ocorrem juntos nas transações partilhem o mesmo valor da chave de partição. O artigo Particionamento no Azure Cosmos DB fornece mais detalhes sobre como escolher uma chave de partição.

Para contentores fixos do Azure Cosmos DB, o Stream Analytics não oferece forma de escalar ou retirar depois de estarem cheios. Eles têm um limite superior de 10 GB e 10.000 RU/s de taxa de transferência. Para migrar os dados de um container fixo para um container ilimitado (por exemplo, um com pelo menos 1.000 RU/s e uma chave de partição), use a ferramenta de migração de dados ou a biblioteca change feed.

A capacidade de gravar em vários contentores fixos está a ser descontinuada. Não o uses para expandir o teu trabalho de Stream Analytics.

Melhor desempenho com nível de compatibilidade 1.2

Ao utilizar o nível de compatibilidade 1.2, o Stream Analytics suporta integração nativa para escrita em massa no Azure Cosmos DB. Ao utilizar esta integração, o Stream Analytics grava dados no Azure Cosmos DB de forma eficaz, maximizando a taxa de transferência e gerindo eficientemente os pedidos limitados.

O mecanismo de escrita melhorado está disponível sob um novo nível de compatibilidade devido a uma diferença no comportamento de upsert. Ao usar níveis anteriores à 1.2, o comportamento do upsert é inserir ou fundir o documento. Ao usar a versão 1.2, o comportamento do upsert muda para inserir ou substituir o documento.

Ao usar versões anteriores à 1.2, o Stream Analytics utiliza um procedimento armazenado personalizado para inserir ou atualizar documentos em massa para cada chave de partição no Azure Cosmos DB. Aí, o Stream Analytics grava um lote numa única transação. Mesmo quando um único registo apresenta um erro transitório (throttling), o Stream Analytics tem de tentar novamente o lote todo. Este comportamento faz com que cenários com limitação razoável sejam lentos.

O exemplo a seguir mostra dois trabalhos idênticos do Stream Analytics lendo a partir da mesma entrada de Hubs de Eventos do Azure. Ambos os trabalhos do Stream Analytics são totalmente particionados com uma consulta de passagem e gravação em contêineres idênticos do Azure Cosmos DB. As métricas à esquerda são do trabalho configurado com nível de compatibilidade 1.0. As métricas à direita são do trabalho configurado com a versão 1.2. A chave de partição de um contêiner do Azure Cosmos DB é um GUID exclusivo que vem do evento de entrada.

Captura de tela que mostra a comparação das métricas do Stream Analytics.

A taxa de eventos recebidos nos Event Hubs é duas vezes superior à que os contentores do Azure Cosmos DB (20.000 RUs) estão configurados para receber, por isso pode esperar throttling no Azure Cosmos DB. No entanto, o trabalho com 1.2 está escrevendo consistentemente em uma taxa de transferência mais alta (eventos de saída por minuto) e com uma utilização média de SU% mais baixa. No seu ambiente, esta diferença depende de mais alguns fatores. Esses fatores incluem a escolha do formato do evento, o tamanho do evento/mensagem de entrada, as chaves de partição e a consulta.

Captura de tela que mostra a comparação das métricas do Azure Cosmos DB.

Ao usar a versão 1.2, o Stream Analytics utiliza de forma mais inteligente 100 por cento do throughput disponível no Azure Cosmos DB, com poucas resubmissões por limitação de velocidade ou limitação de taxa. Esse comportamento fornece uma experiência melhor para outras cargas de trabalho, como consultas em execução no contêiner ao mesmo tempo. Se você quiser ver como o Stream Analytics se expande com o Azure Cosmos DB como um coletor para 1.000 a 10.000 mensagens por segundo, experimente este projeto de exemplo do Azure.

O rendimento da saída do Azure Cosmos DB é idêntico ao usar 1.0 e 1.1. É altamente recomendável que você use o nível de compatibilidade 1.2 no Stream Analytics com o Azure Cosmos DB.

Configurações do Azure Cosmos DB para saída JSON

Quando configura o Azure Cosmos DB como uma saída no Stream Analytics, as seguintes propriedades definem a saída.

Captura de tela que mostra os campos de informações para um fluxo de saída do Azure Cosmos DB.

Campo Descrição
Alias de saída Um alias para se referir a essa saída na sua consulta do Stream Analytics.
Subscrição A assinatura do Azure.
ID de conta O nome ou URI de endpoint da conta Azure Cosmos DB.
Chave da conta A chave de acesso compartilhada para a conta do Azure Cosmos DB.
Base de Dados O nome do banco de dados do Azure Cosmos DB.
Nome do contentor O nome do contêiner, como MyContainer. Um contêiner chamado MyContainer deve existir.
ID do Documento Opcional. O nome da coluna nos eventos de saída que serve como chave única para operações de inserção ou atualização. Se o deixares vazio, o Stream Analytics insere todos os eventos sem opção de atualização.

Depois de configurar a saída do Azure Cosmos DB, você pode usá-la na consulta como o destino de uma instrução INTO. Quando usas uma saída do Azure Cosmos DB dessa forma, tens de definir explicitamente uma chave de partição.

O registo de saída deve conter uma coluna sensível a maiúsculas e minúsculas, com o nome da chave de partição no Azure Cosmos DB. Para obter maior paralelização, a instrução pode exigir uma cláusula PARTITION BY que usa a mesma coluna.

Aqui está um exemplo de consulta:

    SELECT TollBoothId, PartitionId
    INTO CosmosDBOutput
    FROM Input1 PARTITION BY PartitionId

Processamento de erros e repetição de tentativas

Se ocorrer uma falha transitória, indisponibilidade de serviço ou limitação enquanto o Stream Analytics está enviando eventos para o Azure Cosmos DB, o Stream Analytics tentará novamente indefinidamente concluir a operação com êxito. Mas não tenta novamente em caso de falhas Unauthorized (código de erro HTTP 401), NotFound (código de erro HTTP 404), Forbidden (código de erro HTTP 403) nem BadRequest (código de erro HTTP 400).

Problemas comuns que causam falhas na saída do Azure Cosmos DB

Várias condições podem causar a falha da saída do Azure Cosmos DB. Os dados de saída do Stream Analytics podem violar uma restrição única de índice no contentor, a PartitionKey coluna pode não existir, ou a Id coluna pode não existir. Para mais informações sobre restrições de índice único, consulte Restrições de chave únicas no Azure Cosmos DB.