{"id":29715169,"url":"https://github.com/fernandoareias/erlda","last_synced_at":"2025-07-24T05:02:58.788Z","repository":{"id":302541831,"uuid":"1004949551","full_name":"fernandoareias/erlda","owner":"fernandoareias","description":"Staged event-driven implementation with Erlang","archived":false,"fork":false,"pushed_at":"2025-07-09T17:39:46.000Z","size":39,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-10T00:50:36.409Z","etag":null,"topics":["erlang","event-driven","seda","staged-event-driven-architecture"],"latest_commit_sha":null,"homepage":"","language":"Erlang","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fernandoareias.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","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,"zenodo":null}},"created_at":"2025-06-19T12:28:53.000Z","updated_at":"2025-07-09T17:39:49.000Z","dependencies_parsed_at":"2025-07-03T00:26:34.395Z","dependency_job_id":"689dc6d0-e97e-484b-9500-4cde29c0508f","html_url":"https://github.com/fernandoareias/erlda","commit_stats":null,"previous_names":["fernandoareias/erlda"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fernandoareias/erlda","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandoareias%2Ferlda","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandoareias%2Ferlda/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandoareias%2Ferlda/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandoareias%2Ferlda/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fernandoareias","download_url":"https://codeload.github.com/fernandoareias/erlda/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fernandoareias%2Ferlda/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266796295,"owners_count":23985470,"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-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"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":["erlang","event-driven","seda","staged-event-driven-architecture"],"created_at":"2025-07-24T05:01:22.368Z","updated_at":"2025-07-24T05:02:58.772Z","avatar_url":"https://github.com/fernandoareias.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ERLDA\n\nEste projeto é uma implementação do padrão SEDA (Staged Event-Driven Architecture) em Erlang.\n\n---\n\n## Requisitos\n\n- Erlang/OTP 24 ou superior\n- [rebar3](https://www.rebar3.org/) \n\n## Instalação e Execução\n\n1. **Clone o repositório:**\n   ```sh\n   git clone \u003curl-git\u003e\n   cd erlda\n   ```\n2. **Compile o projeto:**\n   ```sh\n   rebar3 compile\n   ```\n3. **Inicie o shell Erlang:**\n   ```sh\n   rebar3 shell\n   ```\n4. O servidor estará ouvindo em: `localhost:8080`\n\n## Estrutura da pasta src/lib\n\nA pasta `src/lib` contém módulos fundamentais para a implementação do padrão SEDA neste projeto:\n\n- **stage_behaviour.erl**: Define o behaviour (contrato) para os estágios do SEDA, padronizando a interface e o ciclo de vida dos estágios. Permite que diferentes estágios implementem suas próprias lógicas seguindo uma estrutura comum.\n- **stage_controller.erl**: Responsável por gerenciar o pool de workers de cada estágio, incluindo a criação, remoção e balanceamento dinâmico dos processos conforme a demanda do sistema.\n- **worker.erl**: Implementa a lógica básica de um worker, que executa as tarefas atribuídas pelo estágio. Os workers são os responsáveis pelo processamento concorrente das requisições em cada estágio.\n\nEsses módulos são reutilizáveis e servem como base para a construção dos estágios específicos do pipeline de processamento.\n\n## Exemplos de uso\n\n### Servidor Web (Web Server)\n\nComo exemplo prático de aplicação do padrão SEDA, este projeto inclui um servidor web simples, implementado inteiramente em Erlang. O servidor recebe solicitações HTTP e as processa por meio de uma pipeline de estágios, cada um responsável por uma etapa específica do processamento. Essa arquitetura demonstra como os módulos genéricos da pasta `src/lib` podem ser reutilizados para construir sistemas concorrentes, escaláveis e de fácil manutenção.\n\nO servidor web é dividido em estágios independentes, cada um com múltiplos workers, promovendo concorrência, isolamento e escalabilidade. O fluxo de processamento de uma requisição HTTP é o seguinte:\n\n1. **http_server**: Aceita conexões TCP e repassa os dados recebidos para o próximo estágio.\n2. **http_parser_stage**: Realiza o parsing da requisição HTTP e encaminha para o estágio responsável pelo recurso solicitado.\n3. **get_stage**: Lê arquivos do diretório `www/` e responde ao cliente com o conteúdo solicitado ou retorna um erro 404 caso o arquivo não exista.\n\nCada estágio utiliza o behaviour definido em `stage_behaviour.erl` e é gerenciado pelo `stage_controller.erl`, que controla o pool de workers responsáveis pelo processamento concorrente das requisições.\n\n\u003cimg src=\"docs/image.svg\" alt=\"Fluxo dos Estágios SEDA\" width=\"600\"/\u003e\n\n## Exemplo de Requisição HTTP\n\n```sh\ncurl http://localhost:8080/index.html\n```\n\nA resposta será o conteúdo do arquivo `www/index.html` ou um erro 404 caso não exista.\n\n## Teste de carga\n\nUse o script em `load-tests/test-script.js` com o [k6](https://k6.io/):\n\n```sh\nk6 run load-tests/test-script.js\n```\n\n## Observações\n- Cada estágio possui múltiplos workers, escolhidos aleatoriamente para balancear a carga.\n- O projeto segue o padrão SEDA, facilitando a escalabilidade e a manutenção.\n- Sinta-se à vontade para contribuir!\n ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandoareias%2Ferlda","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffernandoareias%2Ferlda","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffernandoareias%2Ferlda/lists"}