O DynamoDB é um banco desenhado aos moldes Chave->Valor. Na prática a intenção dele é obter dados rapidamente através do seu ID (Chave). Infelizmente, por sua natureza, ele não possui a capacidade de efetuar COUNT, MAX, MIN e outras funções de agregação que existem nos bancos tradicionais. Vejo que exitem algumas alternativas, mas a aplicação vai depender do quanto ($ ou horas) estás disposito a investir.
-
Materialized Tables. Este approach é muito comum em Timeseries, mas serve para dados não efêmeros tbm. Basicamente, seria armazenar todos os seus eventos em uma tabela do DynamoDB, amarrar um listener Lambda a ele para que ele ouça todas os eventos salvos neste tabela. Esta função Lambda iria, então, salvar os dados já com o contador calculado em outra tabela. O desafio aqui é dimensionar as leituras e escritas do Dynamo para que tu possas fazer corretamente o calculo sem receber erros do sistema. Aqui o maior custo seria em horas de trabalho. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-gsi-aggregation.html
-
Usar o AWS EMR para fazer este serviço de agregação. Neste caso, tu podes usar o Hive para executar SQL nas suas tabelas do Dynamo. Também coloquei um Link sobre isso abaixo. Aqui o custo maior é $, o setup a AWS faz para ti. https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Querying.html#w2ab1c36c13c17b9
-
Adotar o RedShift ou ElasticSearch ao invés do Dynamo. Eles são muito eficientes para fazer queries, especialmente o RedShift. O ES também performa bem este tipo de agregação, apesar de ser mais forte com indexação. Dependendo da frequência com que tu queres que os dados precisem ser atualizados, tu podes inclusive salvar eles já calculados no Dynamo. Aqui, o custo é $. RS e ES não saem baratos quando se salva mta informação.
-
Adotar um RDBMS para isso. Surpreendentemente, eles resolvem muito bem este tipo de problema. Especialmente se tu adotar a técnica de materialização que citei acima e, além disso, apagar registros já envolvidos na materialização (reduzindo significativamente o tamanho do plano cartesiano e tornando as queries mais rápidas). Na Ibratan e na Sizebay adotei este approach e colhi muitos bons frutos. Infelizmente, não foi um trabalho de horas, mas de 1 semana inteira. O custo, porém, ficou na casa dos U$80/mês.
-
Usar um banco de dados não relacional resenhado para agregação. Neste caso, existem muitos DBs no mercado. Usei alguns deles mais exaustivamente, outros só meros testes. Quando o assunto é TS, InfluxDB é o meu favorito, não apenas pela performance, visto que existem muitos com a performance similar, mas pela facilidade de manutenir, instalar e melhorar a performance a longo prazo. Segue abaixo um link de um overview. https://www.influxdata.com/time-series-database/