substituí o LB com HAProxy por um construído em C e fiz algumas otimizações no código.
rinha desse ano tem sido bem desafiadora, mas muito enriquecedora ao mesmo tempo! antes de começar não fazia ideia do que era uma busca vetorial. obrigado pela edição e parabéns @zanfranceschi
Relaunching my website with three interactive writings to start off.
I’ve spent years learning and sharing privately through client work, experiments, and constant iteration. Starting today, I’m committing to doing it publicly as much as I can.
More writing coming soon.
Curiosidade sobre Array no JS:
Pode ter três estados:
Monomorfico - rapido
Polimorfico - mediano
Megamorfico - lento
Eles são determinados pelo Inline Cache do V8.
Inline Cache é um dos mecanismos de otimização mais importantes da ferramenta.
Ele guarda informações(cache) que ajudam a encontrar propriedades de um array/objeto na memória.
Como a lang é dinâmica um Array pode ter N Shapes(formas - hidden class/map) e quanto mais ele tiver, mais lento fica o acesso a uma propriedade e mais dificil fica de criar um cache previsivel.
Dito isso pra evitar que seu Array (ou objetos) fiquem em estado Megamórfico priorize imutabilidade.
Como a gente não coda mais, explicite isso pro seu modelo de AI em uma GUIDELINE.
Tem tempo que eu não menciono esse projeto mas desde que eu fiz ele eu tenho muito seguidor novo.
Se você quer melhorar as Promises e as Guidelines da sua codebase quanto a esse tema recomendo:
https://t.co/aOdeMBRz8e
Como lidar com Erros/Exceptrions - O BÁSICO.
Entenda dois conceitos da engenharia:
Fail Safe - Falha mas não interrompe o processo, apenas notifica.
Fail Fast - Falha e interrompe o processo, encerra o fluxo etc.
Como implementar Fail Safe: Coloca Try Catch na função fail Safe e não propaga o erro, encerra ele ali com alguma notificação/warning no catch.
Como implementar Fail Fast: Deixa a função quebrar, na ultima camada do seu sistema você coloca um Middleware(com try catch) que usa um Strategy pra identificar a origem do erro e trata-lo adequadamente no fim do fluxo.
Fail Safe em Promises Sequencias:
Try catch dentro do for loop.
Fail Fast em Promises Sequencias:
Try catch fora do for loop (ou sem try catch)
Fail Safe em Promises Simultâneas: Promise.allSettled
Fail Fast em Promises Simultâneas:
Promise.all
Há um tempo eu fiz um post mostrando que sua operação sincrona ia travar tua API Node.
Esse é um post mais DEEP sobre esse tema.
Sobre o termo "EventLoop Travar":
O V8 executa os frames de funções referenciadas na CallStack.
Enquanto houver pelo menos um frame ativo na CallStack, o V8 vai estar torando código síncrono e o EventLoop vai ficar afk.
Ele só move essas callback pra CallStack quando a mesma está vazia.
Dependendo da função assíncrona que lida com essa callback ela pode ir pra uma fila diferente:
ex:
setTimeout callback → Macrotask
Promise callback → Microtask
Existe uma prioridade entre essas filas:
Microtasks tem prioridade total sobre Macrotasks.
O Event Loop sempre processa TODAS as Microtasks disponiveis antes de pegar uma unica Macrotask.
ex:
Promises executam antes de setTimeout(fn, 0).
Mas quando essas callbacks vão pra MicrotaskQueue?
No caso das Promises, quando o status muda de pending pra resolved/rejected.
Aí tudo que está dentro do seu .then(callback) ou abaixo do seu await (callbacks via sugar syntax) vai direto pra Microtask Queue.
Enfim:
Enquanto o V8 está torando a CallStack processando seu código síncrono JIT (Just in Time) a callback do seu .then nunca vai ser executada.
Ou aquele codigo que vem abaixo do seu await.
E por tal motivo sua API vai parar de responder geral e seu sistema continuará bronze V.
Otimiza o uso de memoria pra trabalhar com streams e arquivos.
Pode reduzir o número de iterações de operações e contribui para programação declarativa.
Melhora o gerenciamento de fluxos de parsing etc, por terem comportamento lazy.
Esse aqui é meu caso de uso favorito:
Um iterator permite uma iteração lazy way, ou seja, processa os elementos 1 a 1 usando next().
Array methods vão processar tudo de uma vez e muitas vezes gerar um array novo.
Basicamente só itera quando você pede tb... Que melhora o uso de memoria. E os helpers são cadeias de comandos aplicados em cada item iterado.
Então tu consegue algo extremamente semantico e eficiente no uso de memoria.
fonte: https://t.co/OvPnIUXzPO