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

Escalando globalmente com TypeScript e JavaScript na Klarna

Escalando globalmente com TypeScript e JavaScript na Klarna

Lucas Santos

July 25, 2023
Tweet

More Decks by Lucas Santos

Other Decks in Programming

Transcript

  1. Escalando globalmente
    o que fazer quando os usuários são MILHÕES?

    View Slide

  2. $ whoami_
    {twitter, youtube, linkedin…}.lsantos.dev
    software engineer_
    [email protected]

    View Slide

  3. > agenda.ts
    export const agenda = new Set([
    'O que é a Klarna?',
    'Uma noção de escopo',
    'Premissas básicas',
    'O que eu vou detalhar',
    'Código',
    'Testes',
    'Comunicação entre serviços',
    'Tracing',
    'Outros pontos',
    'Things happen…',
    'Refs e surpresa',
    ]);

    View Slide

  4. View Slide

  5. View Slide

  6. em números
    - ~7000 funcionários
    - Manter centralização é complicado
    - 25 Países
    - Muitas regras distintas (especialmente USA)
    - 18 anos no mercado
    - Legados são um problema real
    - em média ~850M de mensagens no Kafka por dia (~10.000/s)
    - Lags pequenos são significativos
    - +500 microsserviços

    View Slide

  7. Premissas

    View Slide

  8. Premissas

    View Slide

  9. Premissas

    View Slide

  10. Premissas

    View Slide

  11. Premissas

    View Slide

  12. Premissas

    View Slide

  13. Tópicos
    O que a gente vai ver
    - Testes
    - Persistência
    - Comunicação
    - Práticas de código
    O que a gente não vai ver
    - Segurança
    - Infraestrutura
    - Processos
    - Automação, CI/CD, etc

    View Slide

  14. Código

    View Slide

  15. Tenha um padrão

    View Slide

  16. Padrões

    View Slide

  17. Padrões

    View Slide

  18. Padrões

    View Slide

  19. outros padrões
    - Middlewares x Handlers
    - Middleware hell
    - Mutable vs Immutable
    - Mudança por referência
    - Variáveis globais

    View Slide

  20. outros padrões
    - Middlewares x Handlers
    - Middleware hell
    - Mutable vs Immutable
    - Mudança por referência
    - Variáveis globais

    View Slide

  21. Seja async

    View Slide

  22. async first

    View Slide

  23. async first

    View Slide

  24. async first

    View Slide

  25. async first

    View Slide

  26. async first

    View Slide

  27. Takeaways
    - Sempre seja assíncrono
    - Console.log é síncrono
    - Use streams para processar grandes quantidades de dados
    - Não bloqueie o event loop

    View Slide

  28. Tipos

    View Slide

  29. View Slide

  30. View Slide

  31. O curso de TypeScript mais completo do Brasil!
    https://formacaots.com.br
    Cupom:FRONTIN2023

    View Slide

  32. Não precisa tipar tudo

    View Slide

  33. Mas algumas coisas sim

    View Slide

  34. Reuse tipos

    View Slide

  35. Reuse tipos

    View Slide

  36. Reuse tipos

    View Slide

  37. Validação estrita
    https://zod.dev

    View Slide

  38. Validação estrita

    View Slide

  39. Validação estrita

    View Slide

  40. Testes

    View Slide

  41. View Slide

  42. Testes unitários
    - Tenha muitos (muitos mesmo)
    - Simples e fáceis de executar
    - Não mantenha estados
    - Mocks/Spies Stubs

    View Slide

  43. Testes de integração
    - Exigem infra
    - Podem exigir estados
    - Isolar é mais complicado
    - Essenciais para o bom
    funcionamento do app

    View Slide

  44. Unit x Integration

    View Slide

  45. View Slide

  46. View Slide

  47. View Slide

  48. https://pact.io

    View Slide

  49. View Slide

  50. Comunicação

    View Slide

  51. perca o medo de MQs

    View Slide

  52. mas não use mensagens pra tudo

    View Slide

  53. DLQs

    View Slide

  54. Idempotência

    View Slide

  55. Idempotência

    View Slide

  56. Contratos de comunicação - IDLs

    View Slide

  57. Bottom line

    View Slide

  58. Tracing

    View Slide

  59. Tracing

    View Slide

  60. Tracing - APMs

    View Slide

  61. Tracing - APMs

    View Slide

  62. Tracing - APMs

    View Slide

  63. things happen

    View Slide

  64. Outros pontos
    - Persistência
    - Normalização: As coisas precisam fazer sentido
    - Migrations: Porque você não vai acessar o DB de produção
    - URNs: Em múltiplos domínios, é muito difícil saber de onde aquele UUID veio
    - ORMs: Por favor…

    View Slide

  65. URNs
    ba080f31-dcf2-48a7-89a3-d552906cbd79
    aa119d69-f972-464d-aa9e-b21b8ac7816b

    View Slide

  66. URNs
    urn:com.klarna:sistema-us:order:aa119d69-f972-464d-aa9e-b21b8ac7816b
    protocolo
    domínio
    proprietário
    recurso
    identificador

    View Slide

  67. O LinkedIn é um grande utilizador de URNs

    View Slide

  68. URNs
    urn:com.klarna:sis-us:card:ba080f31-dcf2-48a7-89a3-d552906cbd79
    urn:com.klarna:other-us:order:aa119d69-f972-464d-aa9e-b21b8ac7816b

    View Slide

  69. Outros pontos
    - Logging
    - Foque em campos úteis
    - Logs são caros, faça bom uso
    - Sustentação vs Active Development
    - Manter não é o mesmo de criar
    - Dados sensíveis: devem ser censurados
    - Ou criptografados
    - Indexação e busca: Se for para logar sem index, melhor imprimir
    - Correlação: adicione IDs de correlação, similares ao trace-id

    View Slide

  70. A complexidade de um
    sistema é diretamente
    proporcional à falta de
    comunicação

    View Slide

  71. View Slide

  72. refs_
    - https://lsantos.dev/frontin-23-slides
    - https://formacaots.com.br
    - https://lsantos.dev/klarna-careers
    - https://lsantos.dev/yt-apps-ts
    - https://lsantos.dev/yt-large-systems
    - https://lsantos.dev/yt-distributed-systems
    - https://lsantos.dev/talk-global-scale

    View Slide

  73. O curso de TypeScript mais completo do Brasil!
    https://formacaots.com.br
    Cupom:FRONTIN2023

    View Slide

  74. tack_
    lsantos.dev

    View Slide