Introdução
Neste tutorial, vamos explorar como construir sistemas resilientes utilizando Erlang, um dos paradigmas mais comuns no desenvolvimento de aplicações escaláveis e tolerantes a falhas. Usaremos o framework Cowboy para gerenciar servidores HTTP e o banco de dados Mnesia para armazenar dados em memória e em disco, oferecendo um acesso rápido e confiável. Este guia está voltado para desenvolvedores que desejam implementar soluções robustas e escaláveis, aproveitando as características únicas de Erlang, como a concorrência e a resiliência inherente. Ao final, você terá uma aplicação básica, capaz de lidar com diferentes cenários de carga e recuperação de falhas com eficiência.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter Erlang instalado em sua máquina. Você pode fazer o download a partir do site oficial do Erlang/OTP. Após a instalação, verifique a versão do Erlang utilizando o comando `erl -version`. Para este tutorial, utilizaremos um editor de texto como Visual Studio Code ou qualquer outro de sua escolha para programar.
commands# Verificar versão do Erlang
erl -versionCriação do Projeto com Cowboy e Mnesia
Crie uma nova pasta para o seu projeto. Dentro dela, crie um arquivo chamado `rebar.config` para iniciar seu projeto Erlang com Cowboy e Mnesia. O Rebar é uma ferramenta de construção para Erlang que facilita a gestão de dependências e a construção de projetos.
rebar.config{deps, [{cowboy, '2.9.0'}, {mnesia, '1.0.0'}]}.
Implementação do Servidor HTTP com Cowboy
Crie um módulo chamado `my_app_http.erl`, onde configuraremos o servidor Cowboy para escutar requisições. Este módulo conterá as rotas e o tratamento das requisições HTTP básicas.
my_app_http.erl-module(my_app_http). -export([start/0]). start() -> {ok, _} = cowboy:start_clear(my_http, 100, [{port, 8080}], #{env => #{dispatch => cowboy_router:compile([ {'_', [{<<"/hello">>, hello_handler, []}]}])}}). ok.
Criação do Handler para as Requisições
Implemente o `hello_handler.erl`, que responderá a requisições HTTP e irá interagir com o banco de dados Mnesia para armazenar algum estado, como mensagens ou contadores.
hello_handler.erl-module(hello_handler). -export([init/2, handle/2, terminate/3]). init(_Para, _Req) -> {ok, Req, #{}}. handle(Req, State) -> {ok, Response} = cowboy:reply(200, #{<<"content-type">> => <<"text/plain">>}, <<"Hello, world!">>), {ok, Response, State}. terminate(_Reason, _Req, _State) -> ok.
Configuração do Banco de Dados Mnesia
Crie um módulo chamado `my_app_mnesia.erl` para configuração e inicialização do banco de dados Mnesia. Configure suas tabelas e inicie o sistema de banco de dados no início da aplicação.
my_app_mnesia.erl-module(my_app_mnesia). -export([start/0, create_tables/0]). start() -> mnesia:start(), create_tables(). create_tables() -> mnesia:create_table(my_table, [{attributes, record_info(fields, my_record)}]).
Interação com Mnesia
Implemente funcionalidades para armazenar e recuperar dados usando Mnesia. Por exemplo, crie funções para adicionar mensagens no banco de dados.
my_app_mnesia.erladd_message(Message) -> mnesia:transaction(fun() -> mnesia:write({my_record, Message}) end).
Testando a Aplicação
Após implementar as funcionalidades, use a ferramenta `curl` para testar os endpoints. Você pode iniciar o servidor e fazer requisições como a seguir.
commands# Iniciando o servidor
erl -pa ebin -s my_app_http
# Realizando uma requisição
curl http://localhost:8080/helloVerificação de Resiliência
Implemente testes de resiliência através de simulações de falhas. Você pode usar ferramentas como `erl -eval` para testar a recuperação após uma falha de processo.
commands# Testando resiliência
erl -eval 'my_app_resilience:test()', halt().
Conclusão
Neste tutorial, você aprendeu a construir uma aplicação básica usando Erlang, Cowboy e Mnesia. Vimos como configurar um servidor HTTP, criar manipuladores para requisições e interagir com um banco de dados em memória. Esses conceitos são fundamentais para criar sistemas escaláveis e resilientes, que podem se recuperar rapidamente de falhas. Com esta base, você está preparado para desenvolver aplicações mais complexas, tirando pleno proveito da robustez que Erlang oferece.