#sistemas-distribuidos
25 posts
2026 - fevereiro
1 post2023 - julho
1 post2023 - janeiro
1 post2022 - dezembro
1 post2021 - dezembro
1 post2019 - março
2 posts2017 - junho
1 post2016 - dezembro
2 posts2016 - junho
1 post2016 - março
1 post2015 - dezembro
4 posts2015 - novembro
4 posts2015 - outubro
1 post2014 - novembro
1 post2014 - julho
1 post2013 - dezembro
1 post2008 - junho
1 post2026 - fevereiro
1 postJobs Assíncronos que sobrevivem ao Caos | Bastidores do The M.Akita Chronicles
Jobs Rails 8 precisam sobreviver a crashes, retries e concorrência. Locks com TTL, claiming atômico, estados ambíguos, crons de segurança e notificações fazem o processamento continuar sem duplicar emails.
2023 - julho
1 post[Akitando] #143 - Discutindo sobre Banco de Dados - Dos primórdios a Big Data
A evolução dos bancos de dados explica por que SQL, NoSQL e serviços cloud fazem escolhas diferentes. Para começar, RDS com Postgres ou MariaDB, cache e jobs assíncronos resolvem a maior parte dos casos.
2023 - janeiro
1 post[Akitando] #135 - ChatGPT Consegue te Substituir? | Entendendo Jobs Assíncronos
Akita usa uploads de imagens para mostrar por que Promises não substituem jobs assíncronos com Bull ou Kafka. O ChatGPT acelera código simples, mas ainda depende de experiência para funcionar em produção.
2022 - dezembro
1 post[Akitando] #133 - Tornando sua App Web Mais Rápida! | 4 Técnicas de Otimização
Akita explica como NGINX, pools, cache, réplicas, filas, métricas e CDNs ajudam uma aplicação web a escalar. O caminho é medir gargalos e aliviar recursos, não trocar de stack.
2021 - dezembro
1 post[Akitando] #110 - Como fazer o Ingresso.com escalar? | Conceitos Intermediários de Web
A partir da instabilidade do Ingresso.com, Akita explica CDNs, cache e jobs assíncronos e propõe uma sala de espera para controlar o acesso à escolha de assentos e serviços externos.
2019 - março
2 posts[Akitando] #44 - Concorrência e Paralelismo (Parte 2) | Entendendo Back-end para Iniciantes (Parte 4)
Fabio compara processos, threads, fibers, pools, filas e promises em várias linguagens e conclui que escolher tecnologia pelo contexto e coordenar tarefas importa mais que perseguir escala abstrata.
[Akitando] #43 - Concorrência e Paralelismo (Parte 1) | Entendendo Back-End para Iniciantes (Parte 3)
Akita explica como processos, threads, locks, schedulers e I/O assíncrono evoluíram até soluções como C10K, NGINX e Twisted. A escolha depende do problema.
2017 - junho
1 postEx Manga Downloadr - Parte 6: A Ascensão do FLOW
Troquei Poolboy e um GenServer customizado por Flow para simplificar o scraping paralelo. O código ficou mais legível, mas levou mais de 3 minutos, contra menos da metade na versão anterior.
2016 - dezembro
2 postsEx Pusher Lite - Parte 3 - Uma Solução Completa
Montei um serviço inspirado no Pusher com Phoenix e Elixir, conectando uma aplicação Rails por WebSockets e API e distribuindo mensagens entre nós. A solução cobre muitos casos, mas ainda não é segura para produção.
Aplicativo Elixir Phoenix em Deploy num Setup com Balanceamento de Carga no DigitalOcean
O autor monta no DigitalOcean um cluster Phoenix com dois nós, HAProxy e PostgreSQL, e consegue operar WebSockets distribuídos com Erlang. O sistema funciona, mas o edeliver é lento e o login ainda falha de forma intermitente.
2016 - junho
1 post[Manga-Downloadr] Melhorando o Crystal/Ruby de rajadas para fluxo de pool
Trocando rajadas de requisições por pools constantes de workers no Manga-Downloadr, o autor reduz os tempos para 27s no Ruby, 30s no JRuby e 21s no Crystal, mas Elixir termina em 15s.
2016 - março
1 postMelhorando a Performance de Integração entre Microservices com Memcache e ETAGs
Usando ETAGs, If-None-Match e Memcached entre duas APIs Rails, o autor reduz respostas de 26ms para 12ms e de 62ms para 24ms. A técnica é simples e rende mais em dados que mudam pouco.
2015 - dezembro
4 postsConsertando o Demo de Chat do DHH no Rails 5
Ao revisar o chat de Action Cable de DHH, o autor move a gravação para um background job e remove o callback do model. O código retorna mais rápido, mas a vantagem de concorrência não foi medida.
Ex Pusher Lite - Parte 2 - O Primeiro Core Funcional!
A Parte 2 transforma o ExPusherLite em um core Phoenix funcional, com apps, keys e secrets, autenticação, canais, broadcasts e deploy no Heroku. Os testes foram rápidos, mas a segurança ainda é frágil.
Ex Pusher Lite - Parte 1: Phoenix Channels e aplicações Rails
A Parte 1 substitui o Pusher por um servidor Phoenix com Channels, WebSockets e Basic Auth, mantendo o cliente Rails e o SuckerPunch. O clone funciona sob controle próprio, mas ainda é incompleto.
O Obrigatório "Por Que Elixir?" - Visão Pessoal
O autor explica por que pretende combinar Rails e Phoenix e defende Elixir para sistemas concorrentes e distribuídos. Imutabilidade, schedulers e supervisores tornam a tolerância a falhas mais acessível.
2015 - novembro
4 posts"Yocto Services"! E o Meu Primeiro Mês com Elixir!
Após um mês intenso estudando Elixir, o autor propõe pensar nos processos BEAM como “Yocto Services”: GenServers supervisionados que falham isoladamente, trocam mensagens e conversam entre nós.
Exercício ExMessenger: Entendendo Nodes em Elixir
Refatorei um chat de terminal pré-1.0 para um Umbrella app e explorei Nodes, nomes, cookies e GenServers remotos. O resultado se aproxima mais de peers distribuídos que de um cliente TCP e servidor tradicional.
Observando Processos em Elixir - The Little Elixir & OTP Guidebook
Com GenServer, Supervisor e Observer, mostro um worker sendo reiniciado, um pool de 5 processos sendo reposto e o runtime permanecendo ativo, embora o estado do worker seja perdido.
Ex Manga Downloadr - Parte 2: Poolboy ao resgate!
Troquei lotes manuais de 80 requisições por um Worker GenServer com Poolboy e um Supervisor, usando um pool de 50 processos. O download de Akira, com cerca de 2.200 páginas, levou menos de 50 segundos, limitado pelo MangaReader.
2015 - outubro
1 postPhoenix Experiment: Holding 2 Million Websocket clients!
Um benchmark de Chris McCord levou o Phoenix a 2 milhões de clientes WebSocket em uma máquina de 40 cores e 128 GB. Broadcasts para um tópico levavam de 1 a 3 segundos, com o limite em ulimit.
2014 - novembro
1 post[Heroku Tips] Usando Followers do Heroku Postgresql
Mostro como usar Followers do Heroku PostgreSQL e a gem Octopus para separar leituras pesadas das escritas no master. Como a réplica tem atraso, medir o ganho antes e depois é indispensável.
2014 - julho
1 post[Small Bites] Tirando Proveito de Threads em Ruby
Para buscar títulos de links do blog, o autor troca chamadas sequenciais por Threads Ruby e reduz o tempo de mais de 19 segundos para 1,6. O ganho vem da concorrência durante operações de I/O.
2013 - dezembro
1 postSoluções para um Mundo Assíncrono/Concorrente
CPU-bound e I/O-bound são problemas conhecidos, não motivos automáticos para trocar Rails. O texto recomenda jobs em background, serviços prontos e migração de runtime apenas quando o caso realmente exigir.
2008 - junho
1 postConversando com Blaine Cook (Twitter)
Blaine Cook separa performance de escalabilidade, explica a arquitetura assíncrona do Twitter e o custo do sharding. Para ele, problemas de escala raramente são culpa do Rails.