Usar fragmentação de gravação para distribuir workloads uniformemente - Amazon DynamoDB

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Usar fragmentação de gravação para distribuir workloads uniformemente

Uma forma de distribuir melhor as gravações entre o espaço de chaves de uma partição no Amazon DynamoDB é aumentar o espaço. É possível fazer isso de várias formas diferentes. Você pode adicionar um número aleatório aos valores de chaves de partição para distribuir os itens entre partições. Ou pode usar um número calculado com base em algo que você está consultando.

Fragmentação usando sufixos aleatórios

Uma estratégia para a distribuição mais uniforme de cargas em um espaço de chave de partição é adicionar um número aleatório ao final dos valores de chave de partição. Então, você randomiza as gravações no espaço maior.

Por exemplo, para uma chave de partição que represente a data de hoje, você pode escolher um número aleatório entre 1 e 200 e concatená-lo como um sufixo à data. Isso produz valores de chave de partição como 2014-07-09.1, 2014-07-09.2 e assim por diante, até 2014-07-09.200. Como você está randomizando a chave de partição, as gravações na tabela em cada dia são espalhadas uniformemente entre várias partições. Isso resulta em melhor paralelismo e throughput geral mais alto.

Contudo, para ler todos os itens de um determinado dia, você teria que consultar os itens quanto a todos os sufixos e mesclar os resultados. Por exemplo, você primeiro emite uma solicitação de Query do valor da chave de partição 2014-07-09.1. Depois emite outra Query de 2014-07-09.2, e assim por diante, por meio de 2014-07-09.200. Por fim, seu aplicativo precisaria mesclar os resultados de todas essas solicitações Query.

Fragmentação usando sufixos calculados

Uma estratégia de randomização pode melhorar bastante o throughput de gravação. Mas é difícil ler um item específico, porque você não sabe que valor de sufixo foi usado na gravação do item. Para facilitar a leitura de itens individuais, você pode usar uma estratégia diferente. Em vez de usar um número aleatório para distribuir os itens entre as partições, use um número calculado com base em algo que você deseja consultar.

Considere o exemplo anterior, em que uma tabela usa a data de hoje na chave de partição. Agora considere que cada item conta com um atributo OrderId acessível e que você precisa com frequência de localizar os itens por ID de pedidos, além da data. Antes que o aplicativo grave o item na tabela, ele pode calcular um sufixo hash com base no ID do pedido e anexá-lo à data da chave de partição. O cálculo pode gerar um número entre 1 e 200 que é distribuído uniformemente, semelhante à estratégia aleatória.

Bastaria um cálculo simples, como o produto dos valores de pontos de código UTF-8 para os caracteres no ID do pedido, módulo 200, + 1. O valor da chave de partição seria então a data concatenada ao resultado do cálculo.

Com essa estratégia, as gravações são distribuídas uniformemente entre os valores de chaves de partição e, portanto, entre as partições físicas. É possível executar uma operação GetItem facilmente para um determinado item e data, pois você pode calcular o valor de chave da partição de um valor OrderId específico.

Para ler todos os itens de um determinado dia, você ainda precisa realizar uma operação Query em cada uma das chaves 2014-07-09.N (em que N é de 1 a 200), e sua aplicação então deve mesclar todos os resultados. O benefício é evitar de ter um valor de chave de partição "hot" único consumindo toda a workload.

nota

Para obter uma estratégia mais eficiente, projetada especificamente para lidar com um alto volume de dados de séries temporais, consulte Dados de séries temporais.