SlideShare uma empresa Scribd logo
São Paulo
Amazon DynamoDB
Modelagem de dados e boas práticas para
escalar
Felipe Garcia, Amazon Web Services
28 de Maio, 2015 | São Paulo, SP
Escalar
Exemplos
• Catálogo de produtos (workload uniforme)
• Jogo online multi jogador (otimização de queries)
• Aplicativo de mensagens (distribuindo itens grandes)
• Placar de jogo de rede social (views materializadas)
• Votação em tempo real (agregação escalável)
Catálogo de Produtos
Cacheando itens lidos frequentemente
Dynamo db   tópico avançado - modelagem de dados e boas práticas para escalar
Site de E-Commerce
Produto A Produto B
Consumidor
Tabela CatalogoProdutos
Site de E-Commerce
Produto A Produto B
Consumidor
SELECT Id, Descricao, ...
FROM CatalogoProdutos
WHERE Id=“Produto A”
Tabela CatalogoProdutos
Escalando com o Amazon DynamoDB
Preciso escalar para
a BlackFriday
Administrador (Você)
Tabela CatalogoProdutos
Escalando com o Amazon DynamoDB
Administrador (Você)
Provisionar 5000 capacidades de leitura
Tabela CatalogoProdutos
Escalando com o Amazon DynamoDB
Administrador (Você)
2500 capacidades de leitura (cada)
Provisionar 5000 capacidades de leitura
Partição 1 Partição 2
Tabela CatalogoProdutos
Escalando com o Amazon DynamoDB
Administrador (Você)
(sem compartilhamento)
Partição 1 Partição 2
Tabela CatalogoProdutos
Provisionar 5000 capacidades de leitura
Escalando com o Amazon DynamoDB
Partição 1 Partição 2
Tabela CatalogoProdutos
Escalando com o Amazon DynamoDB
Administrador (Você)
Tabela CatalogoProdutos
Provisionando 100.000 capacidades de leitura
Partição 1
2000 RCU
Partição K
2000 RCU
Partição M
2000 RCU
Partição 50
2000 RCU
Gargalos ao escalar
Produto A Produto B
Consumidores
Partição 1
2000 RCU
Partição K
2000 RCU
Partição M
2000 RCU
Partição 50
2000 RCU
Tabela CatalogoProdutos
Partição 1
2000 RCU
Partição K
2000 RCU
Partição M
2000 RCU
Partição 50
2000 RCU
Gargalos ao escalar
Produto A Produto B
Consumidores
Tabela CatalogoProdutos
Partição 1
2000 RCU
Partição K
2000 RCU
Partição M
2000 RCU
Partição 50
2000 RCU
Gargalos ao escalar
Produto A Produto B
Consumidores
Tabela CatalogoProdutos
Partição 1
2000 RCU
Partição K
2000 RCU
Partição M
2000 RCU
Partição 50
2000 RCU
Gargalos ao escalar
Produto A Produto B
Consumidores
Tabela CatalogoProdutos
Como definir o que é uniforme?
Tamanho
(Gigabytes)
Desempenho
(Solitações por segundo)
Quantidade de partições: Tamanho
# de Partições =
(para tamanho)
Tamanho da Tabela (bytes) / 10 GB
Quantidade de partições: Desempenho
# de Partições =
(para desempenho)
RCU / 3000 + WCU / 1000
Quantidade de partições: Total
# de Partições =
(para tamanho)
Tamanho da Tabela (bytes) / 10 GB
# de Partições =
(para desempenho)
RCU / 3000 + WCU / 1000
(T)
(D)
# de Partições =
(total)
MAX (T | D)
Desempenho por partição
100,000 𝑅𝐶𝑈
50 𝑝𝑎𝑟𝑡𝑖çõ𝑒𝑠
≈ 𝟐𝟎𝟎𝟎 𝑐𝑎𝑝𝑎𝑐𝑖𝑑𝑎𝑑𝑒𝑠 𝑑𝑒 𝑙𝑒𝑖𝑡𝑢𝑟𝑎 𝑝𝑜𝑟 𝑝𝑎𝑟𝑡𝑖çã𝑜
Partição 1
2000 RCU
Partição K
2000 RCU
Partição M
2000 RCU
Partição 50
2000 RCU
ProductCatalog Table
Espaço
(quais hash keys)
Tempo
(capacidade consumida
por segundo)
Examine seu padrão de tráfego: Espaço
Partição
Tempo
Temperatura
Examine seu padrão de tráfego: Tempo
Flexibilidade embutida
0
400
800
1200
1600
UnidadesdeCapacidade
Time
Provisionado Consumido
“salve” a capacidade não utilizada
consuma a capacidade salva
Capacidade de “queima”
0
400
800
1200
1600
UnicdadesdeCapacidade
Tempo
Provisionado Consumido Negado
Capacidade de queima: 300 segundos
(1200 × 300 = 3600 UC)
Solicitações negadas
• Estime o desempenho por partição
• Teste seu workload para escalar horizontalmente
Conheça seu workload
Seu workload não é uniforme
Partição 1
2000 RCU
Partição K
2000 RCU
Partição M
2000 RCU
Partição 50
2000 RCU
Escalando para evitar gargalos
Produto A Produto B
Compradores
Tabela CatalogoProdutos
Examine seu padrão de tráfego: Espaço
Timestamp Tabela HashKey Leituras Escritas
2014-09-30T10:00:00.000 Products Produto A 0.5 0.0
2014-09-30T10:00:00.001 Products Produto A 0.5 0.0
2014-09-30T10:00:00.003 Products Produto A 0.5 0.0
2014-09-30T10:00:00.003 Products Produto C 0.5 0.0
2014-09-30T10:00:00.005 Products Produto A 0.5 0.0
2014-09-30T10:00:00.006 Products Produto B 0.5 0.0
2014-09-30T10:00:00.006 Products Produto A 0.5 0.0
2014-09-30T10:00:00.007 Products Produto A 0.5 0.0
Solicitaçõesporsegundo
Primary Key do Item
Distribuição de solicitações por Hash Key
Solicitações do DynamoDB
Solicitaçõesporsegundo
Primary Key do Item
Distribuição de solicitações por Hash Key
Solicitações do DynamoDB Hits no Cache
Partição 1 Partição 2
Tabela CatalogoProdutos
Usuário
DynamoDB
Usuário
SELECT Id, Descricao, ...
FROM CatalogoProdutos
WHERE Id=”PRODUTO_POPULAR"
• Torna workloads mais uniformes
• Reduz custo
• Reduz latência
Cacheie itens com leitura intensa
Leituras serão mais pesadas do
que o desempenho por partição
Jogo online Multiplayer
Substitua indexes por filtros
Dynamo db   tópico avançado - modelagem de dados e boas práticas para escalar
Dados do jogo online multiplayer
IdJogo Data Host Oponente Estado
d9bl3 2014-10-02 Felipe Alice FINALIZADO
72f49 2014-09-30 Alice Bob PENDENTE
o2pnb 2014-10-08 Bob Carol EM_PROGRESSO
b932s 2014-10-03 Carol Bob PENDENTE
ef9ca 2014-10-03 Felipe Bob EM_PROGRESSO
Tabela Jogos
IdJogo Data Host Oponente Estado
d9bl3 2014-10-02 Felipe Alice FINALIZADO
72f49 2014-09-30 Alice Bob PENDENTE
o2pnb 2014-10-08 Bob Carol EM_PROGRESSO
b932s 2014-10-03 Carol Bob PENDENTE
ef9ca 2014-10-03 Felipe Bob EM_PROGRESSO
Tabela Jogos
Multiplayer online game data
EM_PROGRESSO FINALIZADOPENDENTE
Transições dos estados de um jogo
Dynamo db   tópico avançado - modelagem de dados e boas práticas para escalar
Index Secundário
Consulta para solicitações recebidas
Bob
Oponente Estado IdJogo Data Host
Alice FINALIZADO d9bl3 2014-10-02 Felipe
Carol EM_PROGRESSO o2pnb 2014-10-08 Bob
Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe
Bob PENDENTE 72f49 2014-10-03 Alice
Bob PENDENTE b932s 2014-09-30 Carol
Index Secundário
Oponente Estado IdJogo Data Host
Alice FINALIZADO d9bl3 2014-10-02 Felipe
Carol EM_PROGRESSO o2pnb 2014-10-08 Bob
Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe
Bob PENDENTE 72f49 2014-10-03 Alice
Bob PENDENTE b932s 2014-09-30 Carol
Consulta para solicitações recebidas
Bob
Index Secundário
Oponente Estado IdJogo Data Host
Alice FINALIZADO d9bl3 2014-10-02 Felipe
Carol EM_PROGRESSO o2pnb 2014-10-08 Bob
Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe
Bob PENDENTE 72f49 2014-10-03 Alice
Bob PENDENTE b932s 2014-09-30 Carol
Consulta para solicitações recebidas
Bob
SELECT * FROM Jogo
WHERE Oponente='Bob'
AND Estado=’PENDENTE'
Consulta para solicitações recebidas
Bob
SELECT * FROM Jogo
WHERE Oponente='Bob'
AND Estado=’PENDENTE'
ORDER BY Data?
Oponente Estado IdJogo Data Host
Alice FINALIZADO d9bl3 2014-10-02 Felipe
Carol EM_PROGRESSO o2pnb 2014-10-08 Bob
Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe
Bob PENDENTE 72f49 2014-10-03 Alice
Bob PENDENTE b932s 2014-09-30 Carol
Index Secundário
Consulta para solicitações recebidas
• Indexes do DynamoDB fornecem Hash Key e
Range Key
• E com consultas para duas comparações e um
range?
SELECT * FROM Jogo
WHERE Oponente='Bob'
AND Estado='EM_PROGRESO'
ORDER BY Data?
(hash)
(range)
(?)
Index Secundário
Oponente Data IdJogo Estado Host
Alice 2014-10-02 d9bl3 FINALIZADO Felipe
Carol 2014-10-08 o2pnb EM_PROGRESSO Bob
Bob 2014-09-30 72f49 PENDENTE Alice
Bob 2014-10-03 b932s PENDENTE Carol
Bob 2014-10-03 ef9ca EM_PROGRESSO Felipe
Métdo 1: Filtro com Query
Bob
Index Secundário
Métdo 1: Filtro com Query
Bob
Oponente Data IdJogo Estado Host
Alice 2014-10-02 d9bl3 FINALIZADO Felipe
Carol 2014-10-08 o2pnb EM_PROGRESSO Bob
Bob 2014-09-30 72f49 PENDENTE Alice
Bob 2014-10-03 b932s PENDENTE Carol
Bob 2014-10-03 ef9ca EM_PROGRESSO Felipe
SELECT * FROM Jogo
WHERE Oponente='Bob'
ORDER BY Data DESC
FILTER ON Estado='PENDENTE'
(filtrado)
Agulha no palheiro
Agulha no palheiro
Bob
Agulha no palheiro ordenado
Bob
• Envie menos data pelos “cabos”
• Simplifica código da aplicação
• Expressões simples semelhantes a SQL
– AND, OR, NOT, ()
Use um filtro de query
Seu index não é todo seletivo
Método 2: Chave composta
EstadoData
FINALIZADO_2014-10-02
EM_PROGRESSO_2014-10-08
EM_PROGRESSO_2014-10-03
PENDENTE_2014-09-30
PENDENTE_2014-10-03
Estado
FINALIZADO
EM_PROGRESSO
EM_PROGRESSO
PENDENTE
PENDENTE
Data
2014-10-02
2014-10-08
2014-10-03
2014-10-03
2014-09-30
Index Secundário
Método 2: Chave composta
Oponente EstadoData IdJogo Host
Alice FINALIZADO_2014-10-02 d9bl3 Felipe
Carol EM_PROGRESSO_2014-10-08 o2pnb Bob
Bob EM_PROGRESSO_2014-10-03 ef9ca Felipe
Bob PENDENTE_2014-09-30 72f49 Alice
Bob PENDENTE_2014-10-03 b932s Carol
Opponent StatusDate GameId Host
Alice DONE_2014-10-02 d9bl3 Felipe
Carol EM_PROGRESSO_2014-10-08 o2pnb Bob
Bob EM_PROGRESSO_2014-10-03 ef9ca Felipe
Bob PENDENTE_2014-09-30 72f49 Alice
Bob PENDENTE_2014-10-03 b932s Carol
Secondary Index
Método 2: Chave composta
Bob
SELECT * FROM Jogo
WHERE Oponente='Bob'
AND EstadoData STARTS_WITH 'PENDENTE'
• Concatene atributos para formar chaves
secundárias de index úteis
Substitua o filtro com indexes
Você quer otimizar uma consulta
o máximo possível
Status + Date
Aplicativo de mensagens
Distribuir itens grandes
Applicativo de mensagens: Documentos JSON
Tabela Mensagens
Aplicativo Mensagens
Aplicativo de Mensagens
Felipe
Destinatario Data Remetente Mensagem
Felipe 2014-10-02 Bob …
… 48 mensagens adicionais para Felipe …
Felipe 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
…várias outras mensagens de demais usuários…
Tabela Mensagens
Destinatario Data Remetente Mensagem
Felipe 2014-10-02 Bob …
… 48 mensagens adicionais para Felipe…
Felipe 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
…várias outras mensagens de demais usuários…
Aplicativo de Mensagens
Felipe
Tabela Mensaens
SELECT *
FROM Mensagens
WHERE Destinatario='Felipe'
LIMIT 50
ORDER BY Data DESC
Destinatario Data Remetente Mensagem
Felipe 2014-10-02 Bob …
… 48 mensagens adicionais para Felipe…
Felipe 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
…várias outras mensagens dos demais usuários…
Aplicativo de Mensagens
Felipe
Tabela Mensagens
Custo da consulta?
SELECT *
FROM Mensagens
WHERE Destinatario='Felipe'
LIMIT 50
ORDER BY Data DESC
Destinatario Data Remetente Mensagem
Felipe 2014-10-02 Bob …
… 48 mensagens adicionais para Felipe …
Felipe 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
…várias outras mensagens dos demais usuários…
Aplicativo de Mensagens
Tabela Mensagens
Tamanho médio de cada item = 256 KB
Mensagens grandes, anexo…
Felipe
SELECT *
FROM Mensagens
WHERE Destinatario='Felipe'
LIMIT 50
ORDER BY Date DESC
Destinatario Data Remetente Mensagem
Felipe 2014-10-02 Bob …
… 48 mensagens adicionais para Felipe …
Felipe 2014-10-03 Alice …
Alice 2014-09-28 Bob …
Alice 2014-10-01 Carol …
…várias outras mensagens dos demais usuários…
Aplicativo de Mensagens
Felipe
Tabela Mensagens
50 itens × 256 KB cada
SELECT *
FROM Mensagens
WHERE Destinatario='Felipe'
LIMIT 50
ORDER BY Data DESC
Calculando o custo de uma consulta
Itens processados por consulta
Tamanho médio
Taxa de conversão
Leituras com consistência eventual
Tabela
Mensagens
Tabela
Inbox
Aplicativo de Mensagens
Destinatario Data Remetente Assunto IdMsg
Felipe 2014-10-02 Bob Olá!… afed
Felipe 2014-10-03 Alice RE: O ite… 3kf8
Alice 2014-09-28 Bob FW: Tudo… 9d2b
Alice 2014-10-01 Carol Oi!... ct7r
Separe os dados maiores
Tabela Inbox Tabela Mensagens
IdMsg Corpo
9d2b …
3kf8 …
ct7r …
afed …
(Dados maiores
das mensagens)
(Metadado das mensagens, indexado por destinatário)
Destinatario Data Remetente Assunto IdMsg
Felipe 2014-10-02 Bob Olá!… afed
Felipe 2014-10-03 Alice RE: O ite… 3kf8
Alice 2014-09-28 Bob FW: Tudo… 9d2b
Alice 2014-10-01 Carol Oi!... ct7r
Separe os dados maiores
Tabela Inbox Tabela Mensagens
IdMsg Corpo
9d2b …
3kf8 …
ct7r …
afed …
Felipe
1. Consultar a inbox: 1 RCU
(50 itens sequenciais com 128 bytes)
Destinatario Data Remetente Assunto IdMsg
Felipe 2014-10-02 Bob Olá!… afed
Felipe 2014-10-03 Alice RE: O ite… 3kf8
Alice 2014-09-28 Bob FW: Tudo… 9d2b
Alice 2014-10-01 Carol Oi!... ct7r
Separe os dados maiores
Tabela Inbox Tabela Mensagens
IdMsg Corpo
9d2b …
3kf8 …
ct7r …
afed …
Felipe
1. Consultar a Inbox: 1 RCU
2. BatchGetItem Mensagens: 1600 RCU
(50 itens separados com 256 KB)
(50 itens sequenciais com 128 bytes)
Aplicativo de Mensagens: Escritas
Tabela
Mensagens
Tabela
Inbox
Felipe
PutItem
{
IdMsg: 123,
Corpo: ...
}
PutItem
{
Destinatario: Matheus,
Data: 2014-10-23,
IdMsg: 123,
...
}
Lidando com falhas
Tabela
Mensagens
Tabela
Inbox
Felipe
PutItem
{
IdMsg: 123,
Corpo: ...
}
PutItem
{
Destinatario: Matheus,
Data: 2014-10-23,
IdMsg: 123,
...
}
Escritas simplificadas
Felipe
PutItem
{
IdMsg: 123,
Corpo: ...,
Destinatario: Matheus,
Remetente: Felipe,
Data: 2014-10-23,
...
}
Inbox
Índice Secundário
Global (GSI)
Tabela
Mensagens
Projeções do Índice Secundário
Aplicativo Mensagens: Escritas
Inbox
Índice Global
Secundário (GSI)
Tabela
Mensagens
Felipe
Outbox
Índice Global
Secundário (GSI)
• Reduzir o tamanho dos itens um-para-muitos
• Configure as projeções dos índices secundários
Distribua itens grandes
Consultar muitos itens grandes
simultaneamente
Inbox
Messages
Placar de jogo
de rede social
De-normalize os schemas
Desenhe para tolerância a falhas
Placar de jogo de rede social
• Encontrar amigos jogando o mesmo jogo
• Veja como você está, comparando aos seus
amigos
Placar de jogo de rede social
Usuario MP
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Tabela Amigos Tabela MaioresPlacares
Usuario Amigo
Bob Alice
Bob Chuck
Alice Bob
Alice Chuck
Alice Erin
Placar de jogo de rede social
Usuario MP
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Tabela Amigos Tabela MaioresPlacares
Usuario Amigo
Bob Alice
Bob Chuck
Alice Bob
Alice Chuck
Alice Erin
Alice
Placar de jogo de rede social
Usuario Placar
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Tabela Amigos Tabela MaioresPlacares
Usuario Amigo
Bob Alice
Bob Chuck
Alice Bob
Alice Chuck
Alice Erin
1. Query 2. BatchGetItem
Alice
Ineficiências no modelo de dados
• Sempre traz todos os amigos
– Alguns amigos, não jogam
– Talvez esteja interessado somente nos top 10
• Operações de um item para cada amigo
– Query custa 1 RCU para 4 KB de dados
– GetItem arredonda cada item para 1RCU
Placar de amigos melhorado: Leituras
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Usuario MP
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Tabela
Tabela Amigos Tabela MaioresPlacares
Placar de amigos melhorado: Leituras
Usuari
o
Amigo MP
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Usuario MP
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Usuario MP Amigo
Bob 20 Chuck
Bob 1000 Alice
Alice 20 Chuck
Alice 470 Bob
Alice 580 Erin
Tabela Índice Local Secundário (LSI)
Tabela PlacarAmigos Tabela MaioresPlacares
Placar de amigos melhorado: Leituras
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Usuario MP
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Usuario MP Amigo
Bob 20 Chuck
Bob 1000 Alice
Alice 20 Chuck
Alice 470 Bob
Alice 580 Erin
Tabela Índice Local Secundário (LSI)
Tabela PlacarAmigos Tabela MaioresPlacares
Query
FROM PlacarAmigos-Index
WHERE Usuario=Alice, DESC, LIMIT 10Alice
• Reduza o custo das consultas
• Otimize a latência da consulta
• Decisão custo de escrita vs custo leitura, desempenho
De-normalize os schemas
Desempenho de leitura importa
mais que o custo de escrita
PlacaresAmigos
Usuario MP
Chuck 30
Alice 1000
Bob 470
Dave 850
Erin 580
Placar de amigos melhorado: Escritas
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 30
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
1. UpdateItem
2. UpdateItem(s)
Chuck
Usuario MP
Chuck 30
Alice 1000
Bob 470
Dave 850
Erin 580
Quando algo de errado acontece
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
1. UpdateItem
2. UpdateItem(s)
Chuck
Usuario MP Atualizando
Chuck 20
Alice 1000
Bob 470
Dave 850
Erin 580
Planejando para falhas
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
true enquanto estiver atualizando o placar
Usuario MP Atualizando
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
Planejando para falhas
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 20
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
1. UpdateItem
Chuck
Usuario MP Atualizando
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
Planejando para falhas
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
Chuck
2. UpdateItem(s)
Usuario MP Atualizando
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
Planejando para falhas
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 20
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
Chuck
3. GetItem
Usuario MP A
Chuck 30 true
Alice 1000
Bob 470
Dave 850
Erin 580
Planejando para falhas
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 30
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
Chuck
4. UpdateItem(s)
Usuario MP Atualizando
Chuck 30
Alice 1000
Bob 470
Dave 850
Erin 580
Planejando para falhas
Usuario Amigo MP
Bob Alice 1000
Bob Chuck 30
Alice Bob 470
Alice Chuck 30
Alice Erin 580
Tabela PlacaresAmigos Tabela MaioresPlacares
5. UpdateItem
Chuck
Biblioteca de transações (cliente)
PutItemRequest aceitarBob;
PutItemRequest confirmarChuck;
Transaction t = txManager.newTransaction();
t.putItem(aceitarBob);
t.putItem(confirmarChuck);
t.commit();
Biblioteca de transações (cliente)
Tabela
Amigos
Tabela
Transacoes
Tabela
ImagensTransacao
Cliente
Transação
Bob
Biblioteca de transações (cliente)
• Desenhada para casos de uso de baixa
contenção
• Custo das operações e latência são maiores do
que escritas normais
• Fácil de usar
• Desenhe para tolerância a falhas, e que as escritas
possam ser recuperadas
• Espere escritas sobrepostas
• Estude quando limpar as transações travadas
• Biblioteca de transações pode te ajudar a começar
Desenhe para tolerância a falhas
Estiver escrevendo múltiplos
itens ou tabelas
Arquitetura Placar: Antes
Seu
Aplicativo
Tabela
AmigoPlacares
Tabela
MaioresPlacares
Arquitetura Placar: Antes
Seu
Aplicativo
Tabela
AmigoPlacares
Tabela
MaioresPlacares
Arquitetura Placar:
DynamoDB Streams
Seu aplicativo
Kinesis
Seu
Aplicativo
Tabela
AmigoPlacares
MaioresPlacares
DynamoDB
Stream
Tabela
MaioresPlacares
Usuario MP
Chuck 20
Alice 100
Tabela MaioresPlacares
Planejando para falha
Chuck
Seq Usuario Velho Novo
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
Stream MaioresPlacares
Usuario MP
Chuck 30
Alice 100
Tabela MaioresPlacares
Planejando para falha
Chuck
Seq Usuario Antigo Novo
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
Stream MaioresPlacares
Usuario MP
Chuck 30
Alice 100
Tabela MaioresPlacares
Planejando para falha
Chuck
Seq Usuario Antigo Novo
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
Stream MaioresPlacares
User H.S.
Chuck 30
Alice 100
HighScores Table
Planejando para falha
Chuck
Seq User Old New
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
HighScores Stream
Usuario MP
Chuck 30
Alice 100
Tabela MaioresPlacares
Planejando para falha
Usuari
o
Amigo MP
Bob Chuck 20
Alice Chuck 20
Tabela AmigoPlacares
Amigo Usuario
Chuck Alice
Chuck Bob
Tabela Índice Secundário Global (GSI)
Seq Usuario Antigo Novo
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
Stream MaioresPlacares
Seu aplicativo
Kinesis
Usuario MP
Chuck 30
Alice 100
Tabela MaioresPlacares
Planejando para falha
Usuario Amigo MP
Bob Chuck 20
Alice Chuck 20
Tabela AmigoPlacares
Amigo Usuario
Chuck Alice
Chuck Bob
Tabela Índice Secundário Global (GSI)
Seq Usuario Antigo Novo
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
Stream MaioresPlacares
Seu aplicativo
Kinesis
Usuario MP
Chuck 30
Alice 100
Tabela MaioresPlacares
Planejando para falha
Usuario Amigo MP
Bob Chuck 30
Alice Chuck 30
Tabela AmigoPlacares
Amigo Usuari
o
Chuck Alice
Chuck Bob
Tabela Índice Secundário Global (GSI)
Seq Usuario Antigo Novo
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
Stream MaioresPlacares
Seu aplicativo
Kinesis
Usuario MP
Chuck 30
Alice 100
Tabela MaioresPlacares
Planning for failure
Usuari
o
Amigo MP
Bob Chuck 30
Alice Chuck 30
Tabela AmigoPlacares
Amigo Usuario
Chuck Alice
Chuck Bob
Tabela Índice Secundário Global (GSI)
Seq Usuario Antig
o
Novo
1 Chuck 10 20
2 Alice 80 90
3 Alice 90 100
4 Chuck 20 30
Stream MaioresPlacares
Seu Aplicativo
Kinesis
Table de
Progresso das
Streams
Propagação de escritas
com DynamoDB Streams
• Simplifique o gerenciamento de erros com escritas
assíncronas
Manter múltiplas tabelas ou
fontes de dados sincronizadas
Votação em
tempo real
Particionar itens de escrita
intensa
Desenhe para tolerância a falhas
Votação
Candidato A
Vots: 20
Candidato B
Vots: 30
Eleitor
Tabela Votos
Candidato A
Votos: 21
Candidato B
Votos: 30
Tabela Votos
Votação
UPDATE Votos
SET Votos = Votos + 1
WHERE Id=“Candidato A”Eleitor
(incremento atômico)
Escalando com o Amazon DynamoDB
Preciso escalar
para a eleição
Administrador (Você)
Tabela Votos
Escalando com o Amazon DynamoDB
Administrador (Você)
Provisionar 200.000 capacidades de escrita
Partição 1
1000 WCU
Partição K
1000 WCU
Partição M
1000 WCU
Partição N
1000 WCU
Tabela Votos
Gargalos ao escalar
Candidato A Candidato B
Eleitor
Partição 1
1000 WCU
Partição K
1000 WCU
Partição M
1000 WCU
Partição N
1000 WCU
Tabela Votos
Partição 1
1000 WCU
Partição K
1000 WCU
Partição M
1000 WCU
Partição N
1000 WCU
Tabela Votos
Candidato A Candidato B
Gargalos ao escalar
Eleitores
Particionando escritas
Candidato A
Candidato A_2
Candidato A_1
Candidato A_3
Candidato A_4
Candidato A_7
CandidatoA_6 Candidato A_8
Candidato A_5
Particionando escritas
Candidato A_2
Candidato B_1
Candidato B_2
Candidato B_3
Candidato B_5
Candidato B_4
Candidato B_7
Candidato B_6
Candidato A_1
Candidato A_3
Candidato A_4
Candidato A_7 Candidato B_8
Candidato A_6 Candidato A_8
Candidato A_5
Eleitor
Tabela Votos
Particionando escritas
Candidato A_2
Candidato B_1
Candidato B_2
Candidato B_3
Candidato B_5
Candidato B_4
Candidato B_7
Candidato B_6
Candidato A_1
Candidato A_3
Candidato A_4
Candidato A_7 Candidato B_8
UpdateItem: “CandidatoA_” + rand(0, 10)
ADD 1 to Votos
Candidato A_6 Candidato A_8
Candidato A_5
Eleitor
Votes Table
Tabela Votos
Agregando partições
Candidato A_2
Candidato B_1
Candidato B_2
Candidato B_3
Candidato B_5
Candidato B_4
Candidato B_7
Candidato B_6
Candidato A_1
Candidato A_3
Candidato A_4
Candidato A_5
Candidato A_6 Candidato A_8
Candidato A_7 Candidato B_8
Processo
Periódico
Candidato A
Total: 2.5M
1. Somar
2. Armazenar Eleitor
• Decisão custo leitura vs escalabilidade na escrita,
desempenho
• Considere o desempenho por chave-valor e por partição
Particione chaves-valor com escrita
intensa
Seu workload de escrita não é
horizontalmente escalável
Requerimentos para votação
• Permitir cada pessoa votar somente uma vez
• Não é permitido alterar os votos
• Agregação em tempo real
• Análises dos eleitors, demografia
Exatidão na votação
Usuario Candidato Data
Alice A 2013-10-02
Bob B 2013-10-02
Eve B 2013-10-02
Chuck A 2013-10-02
Tabela UsuarioVotos
Eleitor
Exatidão na votação
Usuario Candidato Data
Alice A 2013-10-02
Bob B 2013-10-02
Eve B 2013-10-02
Chuck A 2013-10-02
Tabela UsuarioVotos
Segmento Votos
A_1 23
B_2 12
B_1 14
A_2 25
Tabela VotosAgregados
Eleitor
1. Gravar voto, de-duplicar, re-tentar 2. Incrementar contador do
candidato
Exatidão na agregação?
Usuario Candidato Data
Alice A 2013-10-02
Bob B 2013-10-02
Eve B 2013-10-02
Chuck A 2013-10-02
Tabela CandidatoVotos
Segmento Votos
A_1 23
B_2 12
B_1 14
A_2 25
Tabela VotosAgregados
Eleitor
Arquitetura de votação em tempo real
Tabela
VotosAgregados
Eleitores
Tabela
UsuarioVotos
Aplicativo
Votação
Arquitetura de votação em tempo real (melhorada)
Tabela
VotosAgregados
Amazon
Redshift Amazon EMR
Seu aplicativo
Kinesis
Eleitores Tabela
UsuarioVotos
Aplicativo
Votação
UsuarioVotos
DynamoDB
Stream
Arquitetura de votação em tempo real
Tabela
VotosAgregados
Amazon
Redshift Amazon EMR
Seu aplicativo
Kinesis
Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos
DynamoDB
Stream
Arquitetura de votação em tempo real
Tabela
VotosAgregados
Amazon
Redshift Amazon EMR
Seu aplicativo
Kinesis
Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos
DynamoDB
Stream
Arquitetura de votação em tempo real
Tabela
VotosAgregados
Amazon
Redshift Amazon EMR
Seu aplicativo
Kinesis
Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos
DynamoDB
Stream
Arquitetura de votação em tempo real
Tabela
VotosAgregados
Amazon
Redshift Amazon EMR
Seu aplicativo
Kinesis
Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos
DynamoDB
Stream
Análises com
DynamoDB Streams
• Colete e de-duplique dados no DynamoDB
• Agregue dados em memória e salve
periodicamente
Executar agregação e análise em
tempo real
Aprendizados
Catálogo de Produtos
Avalie os requerimentos de desempenho por chave-valor
Cacheie itens de leitura intensa
Jogo online multiplayer
Converta consultas filtradas em consultas
indexadas
Estado + Data
Aplicativo de mensagem
Distribua itens grandes
Inbox
Mensagens
Placar de jogo de rede social
De-normalize dados para otimizar consultas
Desenhe para tolerância a falhas
Propague escritas com DynamoDB Streams
PlacaresAmigos
Votação em tempo real
Particione itens de escrita intensa
Execute análises com DynamoDB Streams
Escalar
Obrigado!

Mais conteúdo relacionado

PDF
Apache Spark - Basics of RDD | Big Data Hadoop Spark Tutorial | CloudxLab
PDF
[TDC2016] Apache Cassandra Estratégias de Modelagem de Dados
PPTX
PPTX
SPARQL-DL - Theory & Practice
PDF
Iceberg: a fast table format for S3
PPTX
Apache Hive Tutorial
PPTX
What is Object storage ?
PPTX
Sql vs NoSQL
Apache Spark - Basics of RDD | Big Data Hadoop Spark Tutorial | CloudxLab
[TDC2016] Apache Cassandra Estratégias de Modelagem de Dados
SPARQL-DL - Theory & Practice
Iceberg: a fast table format for S3
Apache Hive Tutorial
What is Object storage ?
Sql vs NoSQL

Mais procurados (20)

PPTX
Relational RDBMS : MySQL, PostgreSQL and SQL SERVER
PPTX
CockroachDB
PPTX
Mongodb basics and architecture
PPTX
Understanding DB2 Optimizer
PDF
MS-SQL SERVER ARCHITECTURE
PPTX
Introduction to MongoDB
PDF
Spark SQL principes et fonctions
PPTX
Introduction to MongoDB and CRUD operations
PDF
Getting Strated with Amazon Dynamo DB (Jim Scharf) - AWS DB Day
PPTX
Bucket your partitions wisely - Cassandra summit 2016
PDF
[Pgday.Seoul 2017] 3. PostgreSQL WAL Buffers, Clog Buffers Deep Dive - 이근오
PPTX
Apache Spark Architecture | Apache Spark Architecture Explained | Apache Spar...
PPT
Hive(ppt)
PDF
Introduction To Amazon Web Services | AWS Tutorial for Beginners | AWS Traini...
PPTX
introduction à MongoDB
PPTX
Introduction to Apache Spark Developer Training
PPTX
ABCs of AWS: S3
PPT
Introduction to mongodb
PPTX
Introduction to Redis
PPT
Parquet overview
Relational RDBMS : MySQL, PostgreSQL and SQL SERVER
CockroachDB
Mongodb basics and architecture
Understanding DB2 Optimizer
MS-SQL SERVER ARCHITECTURE
Introduction to MongoDB
Spark SQL principes et fonctions
Introduction to MongoDB and CRUD operations
Getting Strated with Amazon Dynamo DB (Jim Scharf) - AWS DB Day
Bucket your partitions wisely - Cassandra summit 2016
[Pgday.Seoul 2017] 3. PostgreSQL WAL Buffers, Clog Buffers Deep Dive - 이근오
Apache Spark Architecture | Apache Spark Architecture Explained | Apache Spar...
Hive(ppt)
Introduction To Amazon Web Services | AWS Tutorial for Beginners | AWS Traini...
introduction à MongoDB
Introduction to Apache Spark Developer Training
ABCs of AWS: S3
Introduction to mongodb
Introduction to Redis
Parquet overview
Anúncio

Destaque (13)

PDF
DynamoDB: um banco NoSQL
PDF
DynamoDB - Uma Introdução
PDF
Escalando primeiros 10 milhões de usuários
PPTX
Webinar: Introdução a Big data
PDF
Webinar: Otimização de Custos na AWS
PDF
Bancos de Dados Relacionais e NoSQL na Nuvem da AWS
PPTX
Tendências de Big Data
PDF
Arquiteturas Cloud: Uma Introdução
PDF
Bancos de Dados gerenciados na nuvem AWS
PDF
NoSQL e Big Data na Nuvem
PPTX
Webinar: Como explorar os recursos de aprendizagem da AWS
PDF
Utilizando NoSQL para Big Data com DynamoDB
PDF
Padrões de Arquitetura na Nuvem da AWS
DynamoDB: um banco NoSQL
DynamoDB - Uma Introdução
Escalando primeiros 10 milhões de usuários
Webinar: Introdução a Big data
Webinar: Otimização de Custos na AWS
Bancos de Dados Relacionais e NoSQL na Nuvem da AWS
Tendências de Big Data
Arquiteturas Cloud: Uma Introdução
Bancos de Dados gerenciados na nuvem AWS
NoSQL e Big Data na Nuvem
Webinar: Como explorar os recursos de aprendizagem da AWS
Utilizando NoSQL para Big Data com DynamoDB
Padrões de Arquitetura na Nuvem da AWS
Anúncio

Semelhante a Dynamo db tópico avançado - modelagem de dados e boas práticas para escalar (20)

PPTX
Deep dive de Amazon DynamoDB
PPTX
Migrei meu ambiente de BI para o Redshift
PDF
VoltDB talk at QCON-Brasil
PPT
Gerenciamento, Performance e Capacity Planning do Susistema de I/O por Eugêni...
PDF
APM, Gestão de Performance da Aplicação por Antônio Cesar Sartoratto Dias
PDF
Uso de estatísticas pelo postgre sql
PPTX
SQL Server FastTrack com SQL Server 2012
PPTX
Performance no MongoDB - TDC 2017 | Florianópolis
PDF
Expremendo performance do sql server
PDF
AULA_INDICES_BANCO_DE_DADOS_RELACIONAISPARTE_1.pdf
PDF
Webinar: Data warehouse na nuvem da AWS
PPT
TechEd 2005: Novos Recursos T-SQL (SQL 2005)
PDF
Pentaho JUG Vale 2012
PDF
Oficina Pentaho
PDF
Melhores práticas para obter Performance no Storage por Antonio Cesar Sartora...
PDF
[Webinar] Performance e otimização de banco de dados MySQL
PPTX
Oracle Database 12c - Novas Características para DBAs e Desenvolvedores
PPTX
Clínica SGBD
PDF
Boas praticas em um Projeto de Banco de Dados
PPTX
Iniciando com Amazon DynamoDB
Deep dive de Amazon DynamoDB
Migrei meu ambiente de BI para o Redshift
VoltDB talk at QCON-Brasil
Gerenciamento, Performance e Capacity Planning do Susistema de I/O por Eugêni...
APM, Gestão de Performance da Aplicação por Antônio Cesar Sartoratto Dias
Uso de estatísticas pelo postgre sql
SQL Server FastTrack com SQL Server 2012
Performance no MongoDB - TDC 2017 | Florianópolis
Expremendo performance do sql server
AULA_INDICES_BANCO_DE_DADOS_RELACIONAISPARTE_1.pdf
Webinar: Data warehouse na nuvem da AWS
TechEd 2005: Novos Recursos T-SQL (SQL 2005)
Pentaho JUG Vale 2012
Oficina Pentaho
Melhores práticas para obter Performance no Storage por Antonio Cesar Sartora...
[Webinar] Performance e otimização de banco de dados MySQL
Oracle Database 12c - Novas Características para DBAs e Desenvolvedores
Clínica SGBD
Boas praticas em um Projeto de Banco de Dados
Iniciando com Amazon DynamoDB

Mais de Amazon Web Services LATAM (20)

PPTX
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
PPTX
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
PPTX
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
PPTX
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
PPTX
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
PPTX
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
PPTX
Automatice el proceso de entrega con CI/CD en AWS
PPTX
Automatize seu processo de entrega de software com CI/CD na AWS
PPTX
Cómo empezar con Amazon EKS
PPTX
Como começar com Amazon EKS
PPTX
Ransomware: como recuperar os seus dados na nuvem AWS
PPTX
Ransomware: cómo recuperar sus datos en la nube de AWS
PPTX
Ransomware: Estratégias de Mitigação
PPTX
Ransomware: Estratégias de Mitigación
PPTX
Aprenda a migrar y transferir datos al usar la nube de AWS
PPTX
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWS
PPTX
Cómo mover a un almacenamiento de archivos administrados
PPTX
Simplifique su BI con AWS
PPTX
Simplifique o seu BI com a AWS
PPTX
Os benefícios de migrar seus workloads de Big Data para a AWS
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
AWS para terceiro setor - Sessão 1 - Introdução à nuvem
AWS para terceiro setor - Sessão 2 - Armazenamento e Backup
AWS para terceiro setor - Sessão 3 - Protegendo seus dados.
Automatice el proceso de entrega con CI/CD en AWS
Automatize seu processo de entrega de software com CI/CD na AWS
Cómo empezar con Amazon EKS
Como começar com Amazon EKS
Ransomware: como recuperar os seus dados na nuvem AWS
Ransomware: cómo recuperar sus datos en la nube de AWS
Ransomware: Estratégias de Mitigação
Ransomware: Estratégias de Mitigación
Aprenda a migrar y transferir datos al usar la nube de AWS
Aprenda como migrar e transferir dados ao utilizar a nuvem da AWS
Cómo mover a un almacenamiento de archivos administrados
Simplifique su BI con AWS
Simplifique o seu BI com a AWS
Os benefícios de migrar seus workloads de Big Data para a AWS

Dynamo db tópico avançado - modelagem de dados e boas práticas para escalar

  • 2. Amazon DynamoDB Modelagem de dados e boas práticas para escalar Felipe Garcia, Amazon Web Services 28 de Maio, 2015 | São Paulo, SP
  • 4. Exemplos • Catálogo de produtos (workload uniforme) • Jogo online multi jogador (otimização de queries) • Aplicativo de mensagens (distribuindo itens grandes) • Placar de jogo de rede social (views materializadas) • Votação em tempo real (agregação escalável)
  • 5. Catálogo de Produtos Cacheando itens lidos frequentemente
  • 7. Site de E-Commerce Produto A Produto B Consumidor Tabela CatalogoProdutos
  • 8. Site de E-Commerce Produto A Produto B Consumidor SELECT Id, Descricao, ... FROM CatalogoProdutos WHERE Id=“Produto A” Tabela CatalogoProdutos
  • 9. Escalando com o Amazon DynamoDB Preciso escalar para a BlackFriday Administrador (Você) Tabela CatalogoProdutos
  • 10. Escalando com o Amazon DynamoDB Administrador (Você) Provisionar 5000 capacidades de leitura Tabela CatalogoProdutos
  • 11. Escalando com o Amazon DynamoDB Administrador (Você) 2500 capacidades de leitura (cada) Provisionar 5000 capacidades de leitura Partição 1 Partição 2 Tabela CatalogoProdutos
  • 12. Escalando com o Amazon DynamoDB Administrador (Você) (sem compartilhamento) Partição 1 Partição 2 Tabela CatalogoProdutos Provisionar 5000 capacidades de leitura
  • 13. Escalando com o Amazon DynamoDB Partição 1 Partição 2 Tabela CatalogoProdutos
  • 14. Escalando com o Amazon DynamoDB Administrador (Você) Tabela CatalogoProdutos Provisionando 100.000 capacidades de leitura Partição 1 2000 RCU Partição K 2000 RCU Partição M 2000 RCU Partição 50 2000 RCU
  • 15. Gargalos ao escalar Produto A Produto B Consumidores Partição 1 2000 RCU Partição K 2000 RCU Partição M 2000 RCU Partição 50 2000 RCU Tabela CatalogoProdutos
  • 16. Partição 1 2000 RCU Partição K 2000 RCU Partição M 2000 RCU Partição 50 2000 RCU Gargalos ao escalar Produto A Produto B Consumidores Tabela CatalogoProdutos
  • 17. Partição 1 2000 RCU Partição K 2000 RCU Partição M 2000 RCU Partição 50 2000 RCU Gargalos ao escalar Produto A Produto B Consumidores Tabela CatalogoProdutos
  • 18. Partição 1 2000 RCU Partição K 2000 RCU Partição M 2000 RCU Partição 50 2000 RCU Gargalos ao escalar Produto A Produto B Consumidores Tabela CatalogoProdutos
  • 19. Como definir o que é uniforme?
  • 21. Quantidade de partições: Tamanho # de Partições = (para tamanho) Tamanho da Tabela (bytes) / 10 GB
  • 22. Quantidade de partições: Desempenho # de Partições = (para desempenho) RCU / 3000 + WCU / 1000
  • 23. Quantidade de partições: Total # de Partições = (para tamanho) Tamanho da Tabela (bytes) / 10 GB # de Partições = (para desempenho) RCU / 3000 + WCU / 1000 (T) (D) # de Partições = (total) MAX (T | D)
  • 24. Desempenho por partição 100,000 𝑅𝐶𝑈 50 𝑝𝑎𝑟𝑡𝑖çõ𝑒𝑠 ≈ 𝟐𝟎𝟎𝟎 𝑐𝑎𝑝𝑎𝑐𝑖𝑑𝑎𝑑𝑒𝑠 𝑑𝑒 𝑙𝑒𝑖𝑡𝑢𝑟𝑎 𝑝𝑜𝑟 𝑝𝑎𝑟𝑡𝑖çã𝑜 Partição 1 2000 RCU Partição K 2000 RCU Partição M 2000 RCU Partição 50 2000 RCU ProductCatalog Table
  • 26. Examine seu padrão de tráfego: Espaço Partição Tempo Temperatura
  • 27. Examine seu padrão de tráfego: Tempo
  • 29. Capacidade de “queima” 0 400 800 1200 1600 UnicdadesdeCapacidade Tempo Provisionado Consumido Negado Capacidade de queima: 300 segundos (1200 × 300 = 3600 UC) Solicitações negadas
  • 30. • Estime o desempenho por partição • Teste seu workload para escalar horizontalmente Conheça seu workload Seu workload não é uniforme
  • 31. Partição 1 2000 RCU Partição K 2000 RCU Partição M 2000 RCU Partição 50 2000 RCU Escalando para evitar gargalos Produto A Produto B Compradores Tabela CatalogoProdutos
  • 32. Examine seu padrão de tráfego: Espaço Timestamp Tabela HashKey Leituras Escritas 2014-09-30T10:00:00.000 Products Produto A 0.5 0.0 2014-09-30T10:00:00.001 Products Produto A 0.5 0.0 2014-09-30T10:00:00.003 Products Produto A 0.5 0.0 2014-09-30T10:00:00.003 Products Produto C 0.5 0.0 2014-09-30T10:00:00.005 Products Produto A 0.5 0.0 2014-09-30T10:00:00.006 Products Produto B 0.5 0.0 2014-09-30T10:00:00.006 Products Produto A 0.5 0.0 2014-09-30T10:00:00.007 Products Produto A 0.5 0.0
  • 33. Solicitaçõesporsegundo Primary Key do Item Distribuição de solicitações por Hash Key Solicitações do DynamoDB
  • 34. Solicitaçõesporsegundo Primary Key do Item Distribuição de solicitações por Hash Key Solicitações do DynamoDB Hits no Cache
  • 35. Partição 1 Partição 2 Tabela CatalogoProdutos Usuário DynamoDB Usuário SELECT Id, Descricao, ... FROM CatalogoProdutos WHERE Id=”PRODUTO_POPULAR"
  • 36. • Torna workloads mais uniformes • Reduz custo • Reduz latência Cacheie itens com leitura intensa Leituras serão mais pesadas do que o desempenho por partição
  • 37. Jogo online Multiplayer Substitua indexes por filtros
  • 39. Dados do jogo online multiplayer IdJogo Data Host Oponente Estado d9bl3 2014-10-02 Felipe Alice FINALIZADO 72f49 2014-09-30 Alice Bob PENDENTE o2pnb 2014-10-08 Bob Carol EM_PROGRESSO b932s 2014-10-03 Carol Bob PENDENTE ef9ca 2014-10-03 Felipe Bob EM_PROGRESSO Tabela Jogos
  • 40. IdJogo Data Host Oponente Estado d9bl3 2014-10-02 Felipe Alice FINALIZADO 72f49 2014-09-30 Alice Bob PENDENTE o2pnb 2014-10-08 Bob Carol EM_PROGRESSO b932s 2014-10-03 Carol Bob PENDENTE ef9ca 2014-10-03 Felipe Bob EM_PROGRESSO Tabela Jogos Multiplayer online game data
  • 43. Index Secundário Consulta para solicitações recebidas Bob Oponente Estado IdJogo Data Host Alice FINALIZADO d9bl3 2014-10-02 Felipe Carol EM_PROGRESSO o2pnb 2014-10-08 Bob Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe Bob PENDENTE 72f49 2014-10-03 Alice Bob PENDENTE b932s 2014-09-30 Carol
  • 44. Index Secundário Oponente Estado IdJogo Data Host Alice FINALIZADO d9bl3 2014-10-02 Felipe Carol EM_PROGRESSO o2pnb 2014-10-08 Bob Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe Bob PENDENTE 72f49 2014-10-03 Alice Bob PENDENTE b932s 2014-09-30 Carol Consulta para solicitações recebidas Bob
  • 45. Index Secundário Oponente Estado IdJogo Data Host Alice FINALIZADO d9bl3 2014-10-02 Felipe Carol EM_PROGRESSO o2pnb 2014-10-08 Bob Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe Bob PENDENTE 72f49 2014-10-03 Alice Bob PENDENTE b932s 2014-09-30 Carol Consulta para solicitações recebidas Bob SELECT * FROM Jogo WHERE Oponente='Bob' AND Estado=’PENDENTE'
  • 46. Consulta para solicitações recebidas Bob SELECT * FROM Jogo WHERE Oponente='Bob' AND Estado=’PENDENTE' ORDER BY Data? Oponente Estado IdJogo Data Host Alice FINALIZADO d9bl3 2014-10-02 Felipe Carol EM_PROGRESSO o2pnb 2014-10-08 Bob Bob EM_PROGRESSO ef9ca 2014-10-03 Felipe Bob PENDENTE 72f49 2014-10-03 Alice Bob PENDENTE b932s 2014-09-30 Carol Index Secundário
  • 47. Consulta para solicitações recebidas • Indexes do DynamoDB fornecem Hash Key e Range Key • E com consultas para duas comparações e um range? SELECT * FROM Jogo WHERE Oponente='Bob' AND Estado='EM_PROGRESO' ORDER BY Data? (hash) (range) (?)
  • 48. Index Secundário Oponente Data IdJogo Estado Host Alice 2014-10-02 d9bl3 FINALIZADO Felipe Carol 2014-10-08 o2pnb EM_PROGRESSO Bob Bob 2014-09-30 72f49 PENDENTE Alice Bob 2014-10-03 b932s PENDENTE Carol Bob 2014-10-03 ef9ca EM_PROGRESSO Felipe Métdo 1: Filtro com Query Bob
  • 49. Index Secundário Métdo 1: Filtro com Query Bob Oponente Data IdJogo Estado Host Alice 2014-10-02 d9bl3 FINALIZADO Felipe Carol 2014-10-08 o2pnb EM_PROGRESSO Bob Bob 2014-09-30 72f49 PENDENTE Alice Bob 2014-10-03 b932s PENDENTE Carol Bob 2014-10-03 ef9ca EM_PROGRESSO Felipe SELECT * FROM Jogo WHERE Oponente='Bob' ORDER BY Data DESC FILTER ON Estado='PENDENTE' (filtrado)
  • 52. Agulha no palheiro ordenado Bob
  • 53. • Envie menos data pelos “cabos” • Simplifica código da aplicação • Expressões simples semelhantes a SQL – AND, OR, NOT, () Use um filtro de query Seu index não é todo seletivo
  • 54. Método 2: Chave composta EstadoData FINALIZADO_2014-10-02 EM_PROGRESSO_2014-10-08 EM_PROGRESSO_2014-10-03 PENDENTE_2014-09-30 PENDENTE_2014-10-03 Estado FINALIZADO EM_PROGRESSO EM_PROGRESSO PENDENTE PENDENTE Data 2014-10-02 2014-10-08 2014-10-03 2014-10-03 2014-09-30
  • 55. Index Secundário Método 2: Chave composta Oponente EstadoData IdJogo Host Alice FINALIZADO_2014-10-02 d9bl3 Felipe Carol EM_PROGRESSO_2014-10-08 o2pnb Bob Bob EM_PROGRESSO_2014-10-03 ef9ca Felipe Bob PENDENTE_2014-09-30 72f49 Alice Bob PENDENTE_2014-10-03 b932s Carol
  • 56. Opponent StatusDate GameId Host Alice DONE_2014-10-02 d9bl3 Felipe Carol EM_PROGRESSO_2014-10-08 o2pnb Bob Bob EM_PROGRESSO_2014-10-03 ef9ca Felipe Bob PENDENTE_2014-09-30 72f49 Alice Bob PENDENTE_2014-10-03 b932s Carol Secondary Index Método 2: Chave composta Bob SELECT * FROM Jogo WHERE Oponente='Bob' AND EstadoData STARTS_WITH 'PENDENTE'
  • 57. • Concatene atributos para formar chaves secundárias de index úteis Substitua o filtro com indexes Você quer otimizar uma consulta o máximo possível Status + Date
  • 59. Applicativo de mensagens: Documentos JSON
  • 61. Aplicativo de Mensagens Felipe Destinatario Data Remetente Mensagem Felipe 2014-10-02 Bob … … 48 mensagens adicionais para Felipe … Felipe 2014-10-03 Alice … Alice 2014-09-28 Bob … Alice 2014-10-01 Carol … …várias outras mensagens de demais usuários… Tabela Mensagens
  • 62. Destinatario Data Remetente Mensagem Felipe 2014-10-02 Bob … … 48 mensagens adicionais para Felipe… Felipe 2014-10-03 Alice … Alice 2014-09-28 Bob … Alice 2014-10-01 Carol … …várias outras mensagens de demais usuários… Aplicativo de Mensagens Felipe Tabela Mensaens SELECT * FROM Mensagens WHERE Destinatario='Felipe' LIMIT 50 ORDER BY Data DESC
  • 63. Destinatario Data Remetente Mensagem Felipe 2014-10-02 Bob … … 48 mensagens adicionais para Felipe… Felipe 2014-10-03 Alice … Alice 2014-09-28 Bob … Alice 2014-10-01 Carol … …várias outras mensagens dos demais usuários… Aplicativo de Mensagens Felipe Tabela Mensagens Custo da consulta? SELECT * FROM Mensagens WHERE Destinatario='Felipe' LIMIT 50 ORDER BY Data DESC
  • 64. Destinatario Data Remetente Mensagem Felipe 2014-10-02 Bob … … 48 mensagens adicionais para Felipe … Felipe 2014-10-03 Alice … Alice 2014-09-28 Bob … Alice 2014-10-01 Carol … …várias outras mensagens dos demais usuários… Aplicativo de Mensagens Tabela Mensagens Tamanho médio de cada item = 256 KB Mensagens grandes, anexo… Felipe SELECT * FROM Mensagens WHERE Destinatario='Felipe' LIMIT 50 ORDER BY Date DESC
  • 65. Destinatario Data Remetente Mensagem Felipe 2014-10-02 Bob … … 48 mensagens adicionais para Felipe … Felipe 2014-10-03 Alice … Alice 2014-09-28 Bob … Alice 2014-10-01 Carol … …várias outras mensagens dos demais usuários… Aplicativo de Mensagens Felipe Tabela Mensagens 50 itens × 256 KB cada SELECT * FROM Mensagens WHERE Destinatario='Felipe' LIMIT 50 ORDER BY Data DESC
  • 66. Calculando o custo de uma consulta Itens processados por consulta Tamanho médio Taxa de conversão Leituras com consistência eventual
  • 68. Destinatario Data Remetente Assunto IdMsg Felipe 2014-10-02 Bob Olá!… afed Felipe 2014-10-03 Alice RE: O ite… 3kf8 Alice 2014-09-28 Bob FW: Tudo… 9d2b Alice 2014-10-01 Carol Oi!... ct7r Separe os dados maiores Tabela Inbox Tabela Mensagens IdMsg Corpo 9d2b … 3kf8 … ct7r … afed … (Dados maiores das mensagens) (Metadado das mensagens, indexado por destinatário)
  • 69. Destinatario Data Remetente Assunto IdMsg Felipe 2014-10-02 Bob Olá!… afed Felipe 2014-10-03 Alice RE: O ite… 3kf8 Alice 2014-09-28 Bob FW: Tudo… 9d2b Alice 2014-10-01 Carol Oi!... ct7r Separe os dados maiores Tabela Inbox Tabela Mensagens IdMsg Corpo 9d2b … 3kf8 … ct7r … afed … Felipe 1. Consultar a inbox: 1 RCU (50 itens sequenciais com 128 bytes)
  • 70. Destinatario Data Remetente Assunto IdMsg Felipe 2014-10-02 Bob Olá!… afed Felipe 2014-10-03 Alice RE: O ite… 3kf8 Alice 2014-09-28 Bob FW: Tudo… 9d2b Alice 2014-10-01 Carol Oi!... ct7r Separe os dados maiores Tabela Inbox Tabela Mensagens IdMsg Corpo 9d2b … 3kf8 … ct7r … afed … Felipe 1. Consultar a Inbox: 1 RCU 2. BatchGetItem Mensagens: 1600 RCU (50 itens separados com 256 KB) (50 itens sequenciais com 128 bytes)
  • 71. Aplicativo de Mensagens: Escritas Tabela Mensagens Tabela Inbox Felipe PutItem { IdMsg: 123, Corpo: ... } PutItem { Destinatario: Matheus, Data: 2014-10-23, IdMsg: 123, ... }
  • 72. Lidando com falhas Tabela Mensagens Tabela Inbox Felipe PutItem { IdMsg: 123, Corpo: ... } PutItem { Destinatario: Matheus, Data: 2014-10-23, IdMsg: 123, ... }
  • 73. Escritas simplificadas Felipe PutItem { IdMsg: 123, Corpo: ..., Destinatario: Matheus, Remetente: Felipe, Data: 2014-10-23, ... } Inbox Índice Secundário Global (GSI) Tabela Mensagens
  • 74. Projeções do Índice Secundário
  • 75. Aplicativo Mensagens: Escritas Inbox Índice Global Secundário (GSI) Tabela Mensagens Felipe Outbox Índice Global Secundário (GSI)
  • 76. • Reduzir o tamanho dos itens um-para-muitos • Configure as projeções dos índices secundários Distribua itens grandes Consultar muitos itens grandes simultaneamente Inbox Messages
  • 77. Placar de jogo de rede social De-normalize os schemas Desenhe para tolerância a falhas
  • 78. Placar de jogo de rede social • Encontrar amigos jogando o mesmo jogo • Veja como você está, comparando aos seus amigos
  • 79. Placar de jogo de rede social Usuario MP Chuck 20 Alice 1000 Bob 470 Dave 850 Erin 580 Tabela Amigos Tabela MaioresPlacares Usuario Amigo Bob Alice Bob Chuck Alice Bob Alice Chuck Alice Erin
  • 80. Placar de jogo de rede social Usuario MP Chuck 20 Alice 1000 Bob 470 Dave 850 Erin 580 Tabela Amigos Tabela MaioresPlacares Usuario Amigo Bob Alice Bob Chuck Alice Bob Alice Chuck Alice Erin Alice
  • 81. Placar de jogo de rede social Usuario Placar Chuck 20 Alice 1000 Bob 470 Dave 850 Erin 580 Tabela Amigos Tabela MaioresPlacares Usuario Amigo Bob Alice Bob Chuck Alice Bob Alice Chuck Alice Erin 1. Query 2. BatchGetItem Alice
  • 82. Ineficiências no modelo de dados • Sempre traz todos os amigos – Alguns amigos, não jogam – Talvez esteja interessado somente nos top 10 • Operações de um item para cada amigo – Query custa 1 RCU para 4 KB de dados – GetItem arredonda cada item para 1RCU
  • 83. Placar de amigos melhorado: Leituras Usuario Amigo MP Bob Alice 1000 Bob Chuck 20 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Usuario MP Chuck 20 Alice 1000 Bob 470 Dave 850 Erin 580 Tabela Tabela Amigos Tabela MaioresPlacares
  • 84. Placar de amigos melhorado: Leituras Usuari o Amigo MP Bob Alice 1000 Bob Chuck 20 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Usuario MP Chuck 20 Alice 1000 Bob 470 Dave 850 Erin 580 Usuario MP Amigo Bob 20 Chuck Bob 1000 Alice Alice 20 Chuck Alice 470 Bob Alice 580 Erin Tabela Índice Local Secundário (LSI) Tabela PlacarAmigos Tabela MaioresPlacares
  • 85. Placar de amigos melhorado: Leituras Usuario Amigo MP Bob Alice 1000 Bob Chuck 20 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Usuario MP Chuck 20 Alice 1000 Bob 470 Dave 850 Erin 580 Usuario MP Amigo Bob 20 Chuck Bob 1000 Alice Alice 20 Chuck Alice 470 Bob Alice 580 Erin Tabela Índice Local Secundário (LSI) Tabela PlacarAmigos Tabela MaioresPlacares Query FROM PlacarAmigos-Index WHERE Usuario=Alice, DESC, LIMIT 10Alice
  • 86. • Reduza o custo das consultas • Otimize a latência da consulta • Decisão custo de escrita vs custo leitura, desempenho De-normalize os schemas Desempenho de leitura importa mais que o custo de escrita PlacaresAmigos
  • 87. Usuario MP Chuck 30 Alice 1000 Bob 470 Dave 850 Erin 580 Placar de amigos melhorado: Escritas Usuario Amigo MP Bob Alice 1000 Bob Chuck 30 Alice Bob 470 Alice Chuck 30 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares 1. UpdateItem 2. UpdateItem(s) Chuck
  • 88. Usuario MP Chuck 30 Alice 1000 Bob 470 Dave 850 Erin 580 Quando algo de errado acontece Usuario Amigo MP Bob Alice 1000 Bob Chuck 30 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares 1. UpdateItem 2. UpdateItem(s) Chuck
  • 89. Usuario MP Atualizando Chuck 20 Alice 1000 Bob 470 Dave 850 Erin 580 Planejando para falhas Usuario Amigo MP Bob Alice 1000 Bob Chuck 20 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares true enquanto estiver atualizando o placar
  • 90. Usuario MP Atualizando Chuck 30 true Alice 1000 Bob 470 Dave 850 Erin 580 Planejando para falhas Usuario Amigo MP Bob Alice 1000 Bob Chuck 20 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares 1. UpdateItem Chuck
  • 91. Usuario MP Atualizando Chuck 30 true Alice 1000 Bob 470 Dave 850 Erin 580 Planejando para falhas Usuario Amigo MP Bob Alice 1000 Bob Chuck 30 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares Chuck 2. UpdateItem(s)
  • 92. Usuario MP Atualizando Chuck 30 true Alice 1000 Bob 470 Dave 850 Erin 580 Planejando para falhas Usuario Amigo MP Bob Alice 1000 Bob Chuck 30 Alice Bob 470 Alice Chuck 20 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares Chuck 3. GetItem
  • 93. Usuario MP A Chuck 30 true Alice 1000 Bob 470 Dave 850 Erin 580 Planejando para falhas Usuario Amigo MP Bob Alice 1000 Bob Chuck 30 Alice Bob 470 Alice Chuck 30 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares Chuck 4. UpdateItem(s)
  • 94. Usuario MP Atualizando Chuck 30 Alice 1000 Bob 470 Dave 850 Erin 580 Planejando para falhas Usuario Amigo MP Bob Alice 1000 Bob Chuck 30 Alice Bob 470 Alice Chuck 30 Alice Erin 580 Tabela PlacaresAmigos Tabela MaioresPlacares 5. UpdateItem Chuck
  • 95. Biblioteca de transações (cliente) PutItemRequest aceitarBob; PutItemRequest confirmarChuck; Transaction t = txManager.newTransaction(); t.putItem(aceitarBob); t.putItem(confirmarChuck); t.commit();
  • 96. Biblioteca de transações (cliente) Tabela Amigos Tabela Transacoes Tabela ImagensTransacao Cliente Transação Bob
  • 97. Biblioteca de transações (cliente) • Desenhada para casos de uso de baixa contenção • Custo das operações e latência são maiores do que escritas normais • Fácil de usar
  • 98. • Desenhe para tolerância a falhas, e que as escritas possam ser recuperadas • Espere escritas sobrepostas • Estude quando limpar as transações travadas • Biblioteca de transações pode te ajudar a começar Desenhe para tolerância a falhas Estiver escrevendo múltiplos itens ou tabelas
  • 101. Arquitetura Placar: DynamoDB Streams Seu aplicativo Kinesis Seu Aplicativo Tabela AmigoPlacares MaioresPlacares DynamoDB Stream Tabela MaioresPlacares
  • 102. Usuario MP Chuck 20 Alice 100 Tabela MaioresPlacares Planejando para falha Chuck Seq Usuario Velho Novo 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 Stream MaioresPlacares
  • 103. Usuario MP Chuck 30 Alice 100 Tabela MaioresPlacares Planejando para falha Chuck Seq Usuario Antigo Novo 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 Stream MaioresPlacares
  • 104. Usuario MP Chuck 30 Alice 100 Tabela MaioresPlacares Planejando para falha Chuck Seq Usuario Antigo Novo 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 4 Chuck 20 30 Stream MaioresPlacares
  • 105. User H.S. Chuck 30 Alice 100 HighScores Table Planejando para falha Chuck Seq User Old New 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 4 Chuck 20 30 HighScores Stream
  • 106. Usuario MP Chuck 30 Alice 100 Tabela MaioresPlacares Planejando para falha Usuari o Amigo MP Bob Chuck 20 Alice Chuck 20 Tabela AmigoPlacares Amigo Usuario Chuck Alice Chuck Bob Tabela Índice Secundário Global (GSI) Seq Usuario Antigo Novo 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 4 Chuck 20 30 Stream MaioresPlacares Seu aplicativo Kinesis
  • 107. Usuario MP Chuck 30 Alice 100 Tabela MaioresPlacares Planejando para falha Usuario Amigo MP Bob Chuck 20 Alice Chuck 20 Tabela AmigoPlacares Amigo Usuario Chuck Alice Chuck Bob Tabela Índice Secundário Global (GSI) Seq Usuario Antigo Novo 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 4 Chuck 20 30 Stream MaioresPlacares Seu aplicativo Kinesis
  • 108. Usuario MP Chuck 30 Alice 100 Tabela MaioresPlacares Planejando para falha Usuario Amigo MP Bob Chuck 30 Alice Chuck 30 Tabela AmigoPlacares Amigo Usuari o Chuck Alice Chuck Bob Tabela Índice Secundário Global (GSI) Seq Usuario Antigo Novo 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 4 Chuck 20 30 Stream MaioresPlacares Seu aplicativo Kinesis
  • 109. Usuario MP Chuck 30 Alice 100 Tabela MaioresPlacares Planning for failure Usuari o Amigo MP Bob Chuck 30 Alice Chuck 30 Tabela AmigoPlacares Amigo Usuario Chuck Alice Chuck Bob Tabela Índice Secundário Global (GSI) Seq Usuario Antig o Novo 1 Chuck 10 20 2 Alice 80 90 3 Alice 90 100 4 Chuck 20 30 Stream MaioresPlacares Seu Aplicativo Kinesis Table de Progresso das Streams
  • 110. Propagação de escritas com DynamoDB Streams • Simplifique o gerenciamento de erros com escritas assíncronas Manter múltiplas tabelas ou fontes de dados sincronizadas
  • 111. Votação em tempo real Particionar itens de escrita intensa Desenhe para tolerância a falhas
  • 112. Votação Candidato A Vots: 20 Candidato B Vots: 30 Eleitor Tabela Votos
  • 113. Candidato A Votos: 21 Candidato B Votos: 30 Tabela Votos Votação UPDATE Votos SET Votos = Votos + 1 WHERE Id=“Candidato A”Eleitor (incremento atômico)
  • 114. Escalando com o Amazon DynamoDB Preciso escalar para a eleição Administrador (Você) Tabela Votos
  • 115. Escalando com o Amazon DynamoDB Administrador (Você) Provisionar 200.000 capacidades de escrita Partição 1 1000 WCU Partição K 1000 WCU Partição M 1000 WCU Partição N 1000 WCU Tabela Votos
  • 116. Gargalos ao escalar Candidato A Candidato B Eleitor Partição 1 1000 WCU Partição K 1000 WCU Partição M 1000 WCU Partição N 1000 WCU Tabela Votos
  • 117. Partição 1 1000 WCU Partição K 1000 WCU Partição M 1000 WCU Partição N 1000 WCU Tabela Votos Candidato A Candidato B Gargalos ao escalar Eleitores
  • 118. Particionando escritas Candidato A Candidato A_2 Candidato A_1 Candidato A_3 Candidato A_4 Candidato A_7 CandidatoA_6 Candidato A_8 Candidato A_5
  • 119. Particionando escritas Candidato A_2 Candidato B_1 Candidato B_2 Candidato B_3 Candidato B_5 Candidato B_4 Candidato B_7 Candidato B_6 Candidato A_1 Candidato A_3 Candidato A_4 Candidato A_7 Candidato B_8 Candidato A_6 Candidato A_8 Candidato A_5 Eleitor Tabela Votos
  • 120. Particionando escritas Candidato A_2 Candidato B_1 Candidato B_2 Candidato B_3 Candidato B_5 Candidato B_4 Candidato B_7 Candidato B_6 Candidato A_1 Candidato A_3 Candidato A_4 Candidato A_7 Candidato B_8 UpdateItem: “CandidatoA_” + rand(0, 10) ADD 1 to Votos Candidato A_6 Candidato A_8 Candidato A_5 Eleitor Votes Table
  • 121. Tabela Votos Agregando partições Candidato A_2 Candidato B_1 Candidato B_2 Candidato B_3 Candidato B_5 Candidato B_4 Candidato B_7 Candidato B_6 Candidato A_1 Candidato A_3 Candidato A_4 Candidato A_5 Candidato A_6 Candidato A_8 Candidato A_7 Candidato B_8 Processo Periódico Candidato A Total: 2.5M 1. Somar 2. Armazenar Eleitor
  • 122. • Decisão custo leitura vs escalabilidade na escrita, desempenho • Considere o desempenho por chave-valor e por partição Particione chaves-valor com escrita intensa Seu workload de escrita não é horizontalmente escalável
  • 123. Requerimentos para votação • Permitir cada pessoa votar somente uma vez • Não é permitido alterar os votos • Agregação em tempo real • Análises dos eleitors, demografia
  • 124. Exatidão na votação Usuario Candidato Data Alice A 2013-10-02 Bob B 2013-10-02 Eve B 2013-10-02 Chuck A 2013-10-02 Tabela UsuarioVotos Eleitor
  • 125. Exatidão na votação Usuario Candidato Data Alice A 2013-10-02 Bob B 2013-10-02 Eve B 2013-10-02 Chuck A 2013-10-02 Tabela UsuarioVotos Segmento Votos A_1 23 B_2 12 B_1 14 A_2 25 Tabela VotosAgregados Eleitor 1. Gravar voto, de-duplicar, re-tentar 2. Incrementar contador do candidato
  • 126. Exatidão na agregação? Usuario Candidato Data Alice A 2013-10-02 Bob B 2013-10-02 Eve B 2013-10-02 Chuck A 2013-10-02 Tabela CandidatoVotos Segmento Votos A_1 23 B_2 12 B_1 14 A_2 25 Tabela VotosAgregados Eleitor
  • 127. Arquitetura de votação em tempo real Tabela VotosAgregados Eleitores Tabela UsuarioVotos Aplicativo Votação
  • 128. Arquitetura de votação em tempo real (melhorada) Tabela VotosAgregados Amazon Redshift Amazon EMR Seu aplicativo Kinesis Eleitores Tabela UsuarioVotos Aplicativo Votação UsuarioVotos DynamoDB Stream
  • 129. Arquitetura de votação em tempo real Tabela VotosAgregados Amazon Redshift Amazon EMR Seu aplicativo Kinesis Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos DynamoDB Stream
  • 130. Arquitetura de votação em tempo real Tabela VotosAgregados Amazon Redshift Amazon EMR Seu aplicativo Kinesis Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos DynamoDB Stream
  • 131. Arquitetura de votação em tempo real Tabela VotosAgregados Amazon Redshift Amazon EMR Seu aplicativo Kinesis Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos DynamoDB Stream
  • 132. Arquitetura de votação em tempo real Tabela VotosAgregados Amazon Redshift Amazon EMR Seu aplicativo Kinesis Eleitores Tabela UsuarioVotosAplicativo Votação UsuarioVotos DynamoDB Stream
  • 133. Análises com DynamoDB Streams • Colete e de-duplique dados no DynamoDB • Agregue dados em memória e salve periodicamente Executar agregação e análise em tempo real
  • 135. Catálogo de Produtos Avalie os requerimentos de desempenho por chave-valor Cacheie itens de leitura intensa
  • 136. Jogo online multiplayer Converta consultas filtradas em consultas indexadas Estado + Data
  • 137. Aplicativo de mensagem Distribua itens grandes Inbox Mensagens
  • 138. Placar de jogo de rede social De-normalize dados para otimizar consultas Desenhe para tolerância a falhas Propague escritas com DynamoDB Streams PlacaresAmigos
  • 139. Votação em tempo real Particione itens de escrita intensa Execute análises com DynamoDB Streams