{"id":24435695,"url":"https://github.com/miguelprogrammer/process-video","last_synced_at":"2025-08-27T02:19:12.453Z","repository":{"id":272670364,"uuid":"917195774","full_name":"MiguelProgrammer/process-video","owner":"MiguelProgrammer","description":"Projeto - Pós-graduação FIAP","archived":false,"fork":false,"pushed_at":"2025-02-08T15:40:10.000Z","size":10152,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-13T22:12:53.592Z","etag":null,"topics":["clean-architecture","continuous-deployment","continuous-integration","devops","docker","gihub-actions","junit","mockito","swagger-ui","threads"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MiguelProgrammer.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-15T14:37:38.000Z","updated_at":"2025-02-08T02:17:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"d8ec83da-f8dd-42ce-ab61-ce69337b70f2","html_url":"https://github.com/MiguelProgrammer/process-video","commit_stats":null,"previous_names":["miguelprogrammer/process-video"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MiguelProgrammer/process-video","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MiguelProgrammer%2Fprocess-video","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MiguelProgrammer%2Fprocess-video/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MiguelProgrammer%2Fprocess-video/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MiguelProgrammer%2Fprocess-video/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MiguelProgrammer","download_url":"https://codeload.github.com/MiguelProgrammer/process-video/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MiguelProgrammer%2Fprocess-video/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272280336,"owners_count":24906115,"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","status":"online","status_checked_at":"2025-08-27T02:00:09.397Z","response_time":76,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["clean-architecture","continuous-deployment","continuous-integration","devops","docker","gihub-actions","junit","mockito","swagger-ui","threads"],"created_at":"2025-01-20T17:33:16.434Z","updated_at":"2025-08-27T02:19:12.436Z","avatar_url":"https://github.com/MiguelProgrammer.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# process-video\nProjeto para finalizar última entrega - Pós-graduação FIAP\n\n\u003cimg src=\"https://i.imgur.com/NlV37va.png\" width=\"1000\"\u003e\n\n## Miro - DDD\n\u003cp style='text-align: indent'\u003elink para leitura: \u003ca href=\"https://miro.com/app/board/uXjVLi5-7EY=/\"\u003eDoc Domain Driven Design\u003c/a\u003e\u003c/p\u003e\n\n##\n\u003cp style='text-align: indent'\u003e A ideia por de trás deste conceito é a de receber um vídeo ou mais, realizar o processamento dos mesmos, tirar prints de cada frame sem que nenhum se perca, \npersistir os prints em base dados. Como arquiteto, a primeira questão a se pensar é a de \"custos\". Quão será custoso para realizar tal tarefa de processamento de tais arquivos, \nmante-los em base dedados e consumi-los. A princípio, para as tarefas mais simples, pensando a baixo nível, seria uma aplicação com persistência poliglota, \nserá necessário um banco de dados que trabalhe com chave e valor como o MongoDB \u003cimg src=\"https://github.com/user-attachments/assets/9cd41ad2-cccd-4863-b5e2-cfed465dcc55\" width=\"25\"\u003e\npara persistir nossos prints e um outro banco como PostgreSql\n\u003cimg src=\"https://github.com/user-attachments/assets/744c5564-978f-4e56-9c80-17709a30724c\" width=\"20\"\u003e para persistir informações referente ao tipo de arquivo enviado.\u003c/p\u003e\n\n##\nApós criação dos itens para persistir nossos arquivos e informações, partimos para a parte de processamento, preciso que cada video encaminhado para o processamento não interrompido,\nvejo uma alternativa como um serviço reativo talvez, mensageria.\n\n##\nA arquitetura a ser adotada para este projeto sera clean architecture.\n\n\u003cimg src=\"https://github.com/user-attachments/assets/48d89f4b-e2d8-4bf0-9fd9-c153b53639a0\" width=\"500\"\u003e\n\n##\n\u003cp style='text-align: indent'\u003eA arquitetura limpa coopera com o business, organização, design e manutenibilidade, sempre respeitando os adapters e gateways. \nNa medida em que a construção e implementação das features, venho analisando melhor a arquitetura e me pergunto se não seria melhor para esse cenário a arquiteura event-drive, \ncomo prentendo criar um serviço assíncrono, irei utilizar apache kafka para enfileirar meus objetos para que eu possa ter mais organização de fluxo de request e esta arquitetura coopera \nbastante com esse cenário, possa ser que eu mude ao final do projeto.\u003c/p\u003e\n\n\u003cimg src=\"https://github.com/user-attachments/assets/12514a6b-0c2e-4459-b1b6-6ea1d3f49017\" width=\"500\"\u003e\n\n##\n\u003cp style='text-align: indent'\u003eInfelizmente, não pude adotar a arquitetura voltada a eventos \u003cb\u003eevent-driven\u003c/b\u003e. Esta arquitetura lida diretamente com filas, processos assíncronos, e para este cenário, \nnão pude utilza-la, a um certo limite de bytes para usar filas e o kafka não iria suportar o tamanho da stream. Então parti para serviços não blockantes.\nBrinquei bastante com spring webflux \u003cimg src=\"https://gitlab.com/uploads/-/system/project/avatar/25570288/webflux.png\" width=\"27\"\u003e. \nPode-se dizer que apanhei bastante para inserir uma api reativa ao meu cenário, até consegui, mas como já tinha meu usecase pronto para lidar com um certo tipo de entreda, \nremovi o spring webflux, tente lidar com arquivo e processa-los, persisti-los e recupera-los, é uma insana codifiação.\n\nAo final, fui para o simples, subi o tento do Java na aplicação, sai do Java17 e fui para Java21, assim eu posso trabalhar com threads virtuais, nos meus testes, as requisições foram bem sucedidas, \nporém, minha rest-api atua blockante, é um trade-off que minha arquitetura adotada me atribuiu, o famoso \u003cb\u003eOver-engineering\u003c/b\u003e.\n\nTudo isso é muito interessante, houve momentos em que parti para o que realmente interessa, yagne, mas após todo esse processo de refactoring, percebi que é necessário se pensar com clareza \nna adoção das coisas simples, na medida em que você constroi a aplicação, você precisa analisar se está pensando em atender o problema ou usar tal arquitetura ou padrão de projeto.\nEncontri diversas falhas durante o processo de desenvolvimento, realizaei diversas alterações, depuração, debugs, logs e outros meios mais de me esgotar ao ponto de volta ao início do problema e\n partir para a adoção do simples. Este projeto cooperou bo quesito visão arquitetural.\u003c/p\u003e\n\n## Tests - Unit, Integration and System\n\u003cp style='text-align: indent'\u003e Cobertura baixa de testes, mas existe teste.\u003c/p\u003e\n\n\u003cimg src=\"https://i.imgur.com/y09qrex.png\" width=\"500\"\u003e \n\n## Docker Hub\n\u003cp style='text-align: indent'\u003e\n A imagem da aplicação está disponibilizada no \u003ca href=\"https://hub.docker.com/r/migprogrammer/process-videos\"\u003eDockerHub\u003c/a\u003e\nou baixe a imagem agora mesmo \n\n```\n  docker push migprogrammer/process-videos:tagname \n```\n\n Observações e considerações: Ao abaixar a imagem, será necessário ter o banco NoSql MongoDb instalado, também, deixe os seus vídeos nao seguinte\ndiretório 'C:\\videos'.\n\u003c/p\u003e\n\n## Observabilidade - Dynatrace \n\u003cp style='text-align: indent'\u003eUsei o Dynatrace para ver como a aplicação lidá com o processamento de videos e geração de imagens\u003c/p\u003e\n\n\u003cimg src=\"https://i.imgur.com/JiD0vgV.png\" width=\"500\"\u003e \n\n\u003cimg src=\"https://i.imgur.com/VsQszJk.png\" width=\"500\"\u003e \n\n\u003cimg src=\"https://i.imgur.com/qzinB4E.png\" width=\"500\"\u003e ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiguelprogrammer%2Fprocess-video","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmiguelprogrammer%2Fprocess-video","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmiguelprogrammer%2Fprocess-video/lists"}