Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reescrevendo Software Crítico em Elixir -- Um e...

Reescrevendo Software Crítico em Elixir -- Um estudo de caso

Apresentação realizada na ElixirBrasil2019

Renan Ranelli

May 26, 2019
Tweet

More Decks by Renan Ranelli

Other Decks in Programming

Transcript

  1. Senior Software Engineer @ Telnyx (Chicago, IL) São Paulo @

    Brasil Elixir desde 2015 Organizador do ElugSP Antes de Elixir, varios Ruby, Python, C#, etc
  2. - (almost) Stateless - Super sensível à latência - Baixo

    throughput (bem baixo) Propriedades do Dialplan service
  3. - A antiga implementação do serviço era escrita em python.

    (De agora em diante chamada de “dialplan python”) - Todos os devs python acabaram saindo do time de telefonia. - Python é notoriamente mais difícil de escalar vertical & horizontalmente do que Elixir “The Python situation”
  4. Definições: 1. Erlang é uma linguagem 2. Erlang/OTP é plataforma

    3. Elixir é uma linguagem que roda na plataforma Erlang/OTP
  5. - "Erlang é uma linguagem funcional"! - Erlang "Resolve" concorrência!

    - É o "segredo" por trás do Whatsapp - Metade da telefonia do mundo é feita em Erlang (citation needed) - "Nine-nines availability" Coisas que ouvimos falar:
  6. - "Soft real time" - Preemptive scheduling (responsivo, justo &

    baixa variância da latência) - Verticalmente Escalável - Distribuição e Concorrência são cidadãos de 1a classe - Garantias de execução fornecidas pelo runtime (a base para tolerância a falha) - "Alta performance" Características da VM do Erlang
  7. - Elixir compila para o bytecode Erlang - Criada por

    um BR! José Valim <3 - A semântica é absolutamente a mesma entre Elixir e Erlang. (mais parecido com TypeScript/JS do que Clojure/Java, Elm/JS, etc) - Para a plataforma, código Elixir e código Erlang são *indistinguíveis* Elixir é só uma pequena gota
  8. "When designing the Erlang language and the Erlang VM, Joe,Mike

    and Robert did not aim to implement a functional programming language, they wanted a runtime where they could build distributed, fault-tolerant applications. It just happened that the foundation for writing such systems share many of the functional programming principles. And it reflects in both Erlang and Elixir. Therefore, the discussion becomes much more interesting when you ask about their end-goals and how functional programming helped them achieve them. The further we explore those goals,we realize how they tie in with immutability and the control of shared state, for example: ..." -- Valim, José Elixir Beyond Functional Programming
  9. - A sintaxe e ecossistema Erlang são *alienigenas* para os

    desenvolvedores dessa geração. - Existem inúmeras barreiras para adoção de Erlang: falta ferramental, docs difíceis de ler, zero polimorfismo de dados, etc. - Elixir traz o "21st century" para a Erlang-landia, através de metaprogramming, ferramental coeso e bem desenhado, documentação *excelente* e uma comunidade vibrante e acolhedora Raison d'être do Elixir:
  10. Com *cooperative scheduling*: T1 T2 T3 T4 T5 T1 T2

    T3 T4 T5 T1 T2 T3 T4 T5 1) Or 2) Or 3)
  11. Sem *preemptive scheduling*: T1 T2 T3 T4 T5 1) Or

    2) E por ai vai... T4 T5 T1 T2 T3 T4 T5 T4 T5 T5
  12. - Buscar "buy-in" stakeholders de negócio - Reservar recursos para

    o projeto - Codar & deploy-ar continuamente (shadow deploys) - Verificar a paridade de features (Tudo isso enquanto o tráfego de *PRODUÇÃO* cresce dia após dia!) Nossa jornada
  13. - Tivemos de convencer vários stakeholders de negócio que seria

    necessário "desacelerar" o desenvolvimento de novas features para pagar "débito técnico" - É fundamental frasear os benefícios em *termos de negócio* Buscar "buy-in" stakeholders de negócio
  14. - Conseguimos aprovar um desenvolvedor dedicado full-time para esse projeto.

    Nenhuma outra responsabilidade. (#sqn) - Re-escrever é um trabalho imenso em que você busca um "alvo em movimento". Se você não conseguir focar, você vai fracassar Reservar recursos
  15. Codar & deploy-ar continuamente Proxy Python Dialplan Graylog XML Request

    Elixir Dialplan Ignore response! XML Response XML Response
  16. Codar & deploy-ar continuamente Proxy Python Dialplan Graylog XML Request

    Elixir Dialplan Ignore response! XML Response XML Response “Operational database”
  17. Verificar paridade de Features SELECT p.xml_dialplan, e.xml_dialplan, p.request FROM python_dialplan_logs

    as p INNER JOIN elixir_dialplan_logs as e ON p.call_id == e.call_id WHERE e.xml_dialplan != p.xml_dialplan
  18. Logo no começo, percebemos: - A maioria das diferenças eram

    causadas por falhas em serviços "downstream". - Quando não era esse o caso, "gravar" a resposta das dependências era suficiente para reproduzir o cenário de erro. Verificar paridade de Features
  19. Logo no começo, percebemos: - A maioria das diferenças eram

    causadas por falhas em serviços "downstream". - Quando não era esse o caso, "gravar" a resposta das dependências era suficiente para reproduzir o cenário de erro. Verificar paridade de Features (Tipo o VCR do Ruby)
  20. O que garante que a re-escrita em Elixir não vai

    degringolar da mesma forma que o python degringolou?
  21. Elixir economiza um pouquinho de tempo em *várias* situações …

    portanto, sobra *mais tempo* pra fazer o que é *importante*!