{"id":26172693,"url":"https://github.com/epiresdasilva/super-serverless-sample","last_synced_at":"2025-04-14T20:21:50.152Z","repository":{"id":42512139,"uuid":"357741421","full_name":"epiresdasilva/super-serverless-sample","owner":"epiresdasilva","description":"Backend serverless que simula o sistema de votação do BBB","archived":false,"fork":false,"pushed_at":"2022-04-01T23:24:35.000Z","size":142,"stargazers_count":36,"open_issues_count":1,"forks_count":5,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-03-28T08:41:01.656Z","etag":null,"topics":["api-gateway","aws","aws-lambda","dynamodb","eventbridge","lambda","postgresql","rds","rds-aurora","serverless","sqs","sqs-queue"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/epiresdasilva.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-04-14T01:51:58.000Z","updated_at":"2024-11-01T19:26:29.000Z","dependencies_parsed_at":"2022-09-08T22:11:34.112Z","dependency_job_id":null,"html_url":"https://github.com/epiresdasilva/super-serverless-sample","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epiresdasilva%2Fsuper-serverless-sample","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epiresdasilva%2Fsuper-serverless-sample/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epiresdasilva%2Fsuper-serverless-sample/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/epiresdasilva%2Fsuper-serverless-sample/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/epiresdasilva","download_url":"https://codeload.github.com/epiresdasilva/super-serverless-sample/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248952428,"owners_count":21188441,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-gateway","aws","aws-lambda","dynamodb","eventbridge","lambda","postgresql","rds","rds-aurora","serverless","sqs","sqs-queue"],"created_at":"2025-03-11T19:58:16.554Z","updated_at":"2025-04-14T20:21:50.126Z","avatar_url":"https://github.com/epiresdasilva.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SSS - Super Serverless Sample\n\nEsse é um projeto de exemplo de arquitetura serverless usando como inspiração a votação para eliminação do paredão do BBB.\nNessas votações, o sistema da Globo recebe uma alta carga de execuções e precisa de uma arquitetura que consiga processar tudo isso.\n\n## Arquitetura\n\n![](assets/sss-arquitetura.jpg)\n\nExplicação sobre cada recurso utilizado\n* API Gateway: recebimento das requisições através de uma API Rest e enviando de forma assíncrona para processamento, proporcionando um alto *throughput*\n* EventBridge: poderoso broker de mensagens que permite a execução paralela de cada mensagem de forma massiva. Alta capacidade de processamento das mensagens no mesmo ritmo que é recebido\n* DynamoDB: armazenamento dos votos individuais\n* SQS: envio de mensagens em lotes para processo assíncrono de contagem dos votos. O envio de lotes proporciona uma contagem mais rápida. Ao mesmo tempo, o SQS permite um processamento alto e controlado para não sobrecarregar o banco de dados\n* RDS (Aurora Serverless): armazenamento da contagem dos votos, permitindo o incremento do valor e emissão de relatórios de forma mais otimizada\n\n### Desafio da definição da arquitetura\n\nEsse desenho de arquitetura mostrado anteriormente é a versão final, mas precisei iterar sobre ele para chegar nessas conclusões. Por isso, quero registrar também as escolhas que não atenderam as necessidades.\nPara começar, é importante dizer que serverless te entrega escala sem preocupação, mas isso não significa que você terá a escala necessária para resolver o seu problema. Isso porque cada serviço tem suas característica e apesar de em termos de infraestrutura você não ficar na mão, você pode ainda ter problema de vazão.\n\n#### API Gateway e SQS\n\nNa primeira tentativa, utilizei o SQS conectado ao API Gateway para receber os votos de forma assíncrona direto do endpoint. Em termos de disponibilidade não tive nenhum problema, mas o consumo dessas mensagens não atendia a velocidade de contabilização de votos que precisava.\nPor esse motivo, o uso de um Broker como o EventBridge fez mais sentido.\n\n#### DynamoDB Stream\n\nTambém na primeira versão da arquitetura, ao invés do uso de SQS como Destination da Lambda de registro de votos, eu havia utilizado a Lambda conectada no DynamoDB Stream para ouvir os eventos de cadastro. Em termos funcionais funcionou muito bem, mas assim como o Kinesis, o DynamoDB Stream trabalha com o conceito de `shard`. Sendo assim, só é possível paralelizar a mesma quantidade de `shards` configuradas no DynamoDB.\nMesmo tendo a opção de paralelizar e aumentar a capacidade, ainda ficou aquém da velocidade necessária para o problema.\n\n## Executar\n\nEsse projeto utiliza Serverless Framework para gerar a infraestrutura como código. Por esse motivo, fica fácil reproduzir essa aplicação em sua própria conta da AWS.\n\nBasta executar o comando abaixo na raiz do projeto:\n```\nsls deploy\n```\n\nAntes de realizar uma chamada para o endpoint, você precisa criar uma tabela no seu banco de dados RDS:\n```sql\ncreate table vote_bag_count (id serial primary key, name text, vote_count integer, saved_at timestamp);\n```\n\n## Estatísticas\n\n### Teste de carga\n\n* Nos testes mais simples: 5k requisições por segundo\n    * 10 segundos de duração\n    * 50k requisições no total\n* Testes de processamento: 20k requisições por segundo\n    * 60 segundos de duração\n    * 1,2mi requisições no total\n    * Tempo de processamento do placar: 25 minutos\n\n### Desenvolvimento\n\nO desenvolvimento todo foi realizado dentro de uma semana, trabalhando somente em dias úteis em torno de 2 horas por dia. Um total de 10 horas de desenvolvimento.\n\n### Custos\n\nOs valores abaixo são do intervalo todo de desenvolvimento, portanto esses custos incluem todos os testes realizados inúmeras vezes e não somente o teste final que resultou na estatística citada anteriormente.\n\n* RDS: US$ 2,90 / dia\n* VPC: US$ 1,44 / dia\n* Lambda: US$ 1,00 total\n* API Gateway: US$ 7,12 total\n* DynamoDB: US$ 2,46 total\n* SQS: US$ 0,21 total\n* **Total: US$ 52,57**\n\n## O que ainda poderia ser feito\n\n* Abordagem mais robusta de dados: processar as mensagens mais rapidamente\n    * Near realtime com Kinesis, por exemplo\n* Pipeline para deploy automatizado: não precisar de deploy manual\n* Utilização de SecretsManager: basicamente para proteger a credencial do banco de dados RDS\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepiresdasilva%2Fsuper-serverless-sample","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fepiresdasilva%2Fsuper-serverless-sample","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fepiresdasilva%2Fsuper-serverless-sample/lists"}