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

A Tale on XML Parsing

A Tale on XML Parsing

Uma historia de como a Duffel conseguiu melhorar a performance da busca: 10x mais rapida, 10x menos memoria.

Ulisses Almeida

September 08, 2022
Tweet

More Decks by Ulisses Almeida

Other Decks in Programming

Transcript

  1. Ulisses Almeida
    A Tale on XML Parsing

    View Slide

  2. ● Londres/Reino Unido
    ● @ulissesalmeida
    ● (Desenvolvedor Web Elixir)
    Engenheiro de Software
    na Duffel ✈
    Ulisses
    Almeida

    View Slide

  3. View Slide

  4. https://www.humblebundle.com/books/elixir-programming-pragmatic-programmers-books

    View Slide

  5. Como melhoramos em
    10x o processamento
    de XML com Elixir

    View Slide

  6. 💉 ELIXIR ON
    STEROIDS!!! 󰙤
    📜 A tale on XML
    Parsing 🤴 👸
    BIIIIRRRLLL !!!!
    ELIXIR TA SAINDO DA JAULA!!!
    BIIIIRRRLLL !!!!
    BORA BEAM !!!!
    ELIXIR DESCENDENTE !!!!

    View Slide

  7. Uma história de
    como saímos de uma
    situação assim:

    View Slide

  8. View Slide

  9. View Slide

  10. Para uma situação
    assim:

    View Slide

  11. View Slide

  12. View Slide

  13. View Slide

  14. View Slide

  15. View Slide

  16. Como funciona a busca na Duffel?

    View Slide

  17. O Primeiro Grande
    Cliente
    A primeira
    investigação
    Quando
    cheguei
    Hoje
    Grande
    Cliente

    View Slide

  18. JURO QUE JÁ ESTAVA ASSIM
    QUANDO EU CHEGUEI

    View Slide

  19. View Slide

  20. Escalável, mas não barato

    View Slide

  21. Vale a pena assistir!
    https://www.youtube.com/watch?v=ZMgUTPcHeo4

    View Slide

  22. A Primeira
    Investigação
    A primeira
    investigação
    Quando
    cheguei
    Hoje

    View Slide

  23. A investigação
    Nenhuma era mais
    rápida que Saxy
    Muito complexo e
    custoso
    Muito custoso para
    mudar
    Bibliotecas Abordagem Rust

    View Slide

  24. Circulando o
    problema
    A primeira
    investigação
    Quando
    cheguei
    Hoje
    Grande
    Cliente
    Circulando

    View Slide

  25. Resolvendo problemas!
    Ninguém quer ver e
    nem processar
    milhares de ofertas
    Validações com
    Ecto é realmente
    necessário para
    consumir API?
    Fazer o parsing
    mais cedo que
    pudermos
    Filtros Remover
    processamento
    HTTP
    Streaming

    View Slide

  26. Resolvendo problemas!
    Ninguém quer ver
    milhares de ofertas
    Validações com
    Ecto é realmente
    necessário para
    consumir API?
    Fazer o parsing
    mais cedo que
    pudermos
    Filtros Remover
    processamento
    HTTP
    Streaming

    View Slide

  27. O debug maldito!

    View Slide

  28. O debug maldito!
    1 GB de memória!!!

    View Slide

  29. O debug maldito!
    # pseudo code
    metadata
    |> Map.put(:response_xml, xml)
    |> Jason.encode!(pretty: tue)

    View Slide

  30. View Slide

  31. View Slide

  32. View Slide

  33. Agora vai!
    A primeira
    investigação
    Quando
    cheguei
    Hoje
    Grande
    Cliente
    Circulando Agora vai!

    View Slide

  34. O Plano
    2 semanas para
    examinar o
    problema
    2 semanas para
    criar protótipos de
    baixa fidelidade
    4 semanas para
    integrar uma
    companhia aérea
    Investigar Protótipos Produção

    View Slide

  35. 1. A nova investigação

    View Slide

  36. Xmerl Features
    XPath!
    Manipular e
    gerar XMLs

    View Slide

  37. SweetXML e Xpath
    duration_in_minutes:
    transform_by(
    ~x"./FlightDetail/FlightDuration/Value/text()"s,
    &to_minutes/1
    ),
    https://github.com/kbrw/sweet_xml

    View Slide

  38. 2. Investigando protótipos para construir
    Saxy tem
    SimpleForm
    Eliminar o DOM
    intermediário
    O futuro do XML?
    em outra palestra
    talvez
    Mini-DOM Sax to Structs VTD-XML

    View Slide

  39. Benchmarks

    View Slide

  40. Nova proposta: DataSchema + SimpleForm
    field:
    {:duration_in_minutes,
    {["FlightSegment", "FlightDetail", "FlightDuration", "Value"], :text},
    MinutesType},
    https://github.com/Adzz/data_schema

    View Slide

  41. Nova proposta: Saxy SimpleForm

    View Slide

  42. Nova proposta: Saxy SimpleForm

    View Slide

  43. 3. Produção!
    A companhia aérea
    mais usada
    Feature flag com
    Unleash
    Código velho novo
    vivendo juntos por
    um tempo
    Impacto Gradual Débito

    View Slide

  44. E o resultado…

    View Slide

  45. View Slide

  46. No pretty json
    SimpleForm
    5x moar volume

    View Slide

  47. Novo kit de solução XML

    View Slide

  48. ● Implementação para todas integrações
    com companhia aéreas
    ● Materiais e documentação do novo kit
    de solução
    ● Treinamento e divulgação interna na
    empresa
    ● Remover código antigo durante a
    grande jornada de migração
    Com o sucesso, grande
    responsabilidades

    View Slide

  49. Em uma dimensão
    alternativa…
    A primeira
    versão da
    Duffel API
    Hoje

    View Slide

  50. Does Saxy work with XPath?
    Saxy in its core is a SAX parser, therefore Saxy does not, and likely will not, offer any XPath
    functionality.
    SweetXml is a wonderful library to work with XPath. However, :xmerl, the library used by
    SweetXml, is not always memory efficient and speedy. You can combine the best of both sides
    with Saxmerl, which is a Saxy extension converting XML documents into SweetXml compatible
    format. Please check that library out for more information.
    !

    View Slide

  51. However, :xmerl, the library
    used by SweetXml, is not
    always memory efficient and
    speedy.

    View Slide

  52. View Slide

  53. ● Documentação ambígua
    ● As pessoas em geral estão
    acostumadas com XPath
    ● SimpleForm do Saxy não tem um uso
    fácil
    Complicado You can combine the best of both sides with
    Saxmerl, which is a Saxy extension
    converting XML documents into SweetXml
    compatible format
    Memory efficiency and better performance
    - Several benchmarks show that Saxmerl
    usually uses 4x less memory than :xmerl or
    SweetXml, and is usually 70–90% faster.
    Note that benchmarking XML
    parsers is difficult and highly
    depends on the complexity of the
    documents being parsed.

    View Slide

  54. Lições aprendidas e
    o futuro
    A primeira
    investigação
    Quando
    cheguei
    Hoje
    Grande
    Cliente
    Circulando Agora vai!

    View Slide

  55. ● Confie, mas verifique
    ○ Verifique 10 vezes mais
    principalmente quando a única
    opção boa é mudar de linguagem
    ● Ame o problema, investigue a fundo!
    ○ Não desista cedo, por mais
    complicado que pareça!
    ○ Instrumentação! Dados!
    Métricas!
    ● Não se prenda a soluções
    ○ XPath era legal, mas fazíamos
    pouco uso da ferramenta
    ● Mudanças grandes demoram
    ○ Fazer missões paralelas, ganhar
    experiência, conquistar
    confiança
    ● Pessoas diferentes, abordagens
    diferentes
    Lições aprendidas

    View Slide

  56. Futuro
    ● Usaremos Rust?
    ○ Até agora não temos previsão,
    mas pode ser que um dia sim.
    Vai valer a pena? Não sei XD
    ● DataSchema + SimpleForm?
    ○ Provavelmente lançaremos o kit
    de maneira open source. Mas sem
    previsão

    View Slide

  57. Às vezes você
    precisa escalar a
    colina para ver a
    montanha
    Clarice Lispector

    View Slide

  58. 08 e 09 de setembro
    Ulisses Almeida| @ulissesalmeida

    View Slide