[Build in Public] Como desenvolver a arquitetura de um sistema?
Estou estudando mais sobre arquitetura recentemente e para colocar em prática resolvi registrar em um build in public o meu aprendizado e compartilhar um pouco de conhecimento.
Estou lendo o livro Fundamentos da Arquitetura de Software, então vou pegar alguns exemplos e conceitos dele. recomendo a leitura
Requisitos
Acredito que entender os requisitos de um sistema seja um ótimo ponto de partida.
No capítulo 5 é citado os Katas de Arquitetura como um método mais inteligente para arquitetos iniciantes praticarem e entenderem quais são os requisitos não funcionais:
Katas de arquitetura são exercícios práticos para treinar design de sistemas, onde a ideia é a mesma dos code katas: você não fica bom em arquitetura lendo sobre ela, mas repetindo o gesto muitas vezes em um ambiente sem consequência.
Resolvi aplicar esse kata no meu próprio projeto que venho desenvolvendo em paralelo. Segue o cenário que montei:
Descrição
Um sistema de IA que monitora câmeras de um estabelecimento e emite alertas para o segurança sobre possíveis furtos ou outras ocorrências.
Usuários
Minha meta é ter 1 estabelecimento real utilizando, mas vou pensar a arquitetura para algumas dezenas de usuários.
Requisitos
- O usuário recebe um alerta da ocorrência junto do vídeo
- O sistema deve permitir o download do vídeo
- 3 tipos de usuários: Super_user (baixa vídeos, acesso aos relatórios, cria usuários), User (recebe alertas), Admin (cadastra câmeras, acesso aos relatórios, cria usuários)
- User deve confirmar se é ocorrência ou falso positivo (essa confirmação serve pra ir treinando o modelo com o tempo)
Atributos
- Escalabilidade: 1 cliente traz em média 20 câmeras
- Robustez: o sistema deve ser capaz de se reconectar às câmeras automaticamente, para previnir contra quedas de rede e reinício de DVR
- Reaproveitamento: mudar as regras da IA para diferentes clientes
- Armazenamento: eventos validados ficam salvos por 30 dias, falsos positivos por 1 dia. O que não gera evento é excluído 1 minuto após o término do tempo de buffer
Tecnologias
Aqui vou listar as tecnologias que vou utilizar e vou linkar posts explicando como vou usá-las e os motivos pra escolher cada uma. Conforme eu for criando novos posts e desenvolvendo mais o projeto, vou editando este post aqui.
- FFmpeg: decodificação e captura do stream RTSP das câmeras
- YOLO + ByteTrack: detecção e rastreio de objetos nos frames
- Motor de regras: decide se o que foi detectado vira um evento ou não
- Docker: pra empacotar e rodar o agente em cada câmera/cliente
Se você já mexeu com arquitetura de sistemas parecidos ou tem dicas/críticas sobre essas decisões, sua ajuda vai ser muito bem vinda.