agora meu povo a gente vai falar sobre distribuíte lock tá pra que serve lock distribuído tá o lance é o seguinte toda vez que a gente está trabalhando com um sistema muito crítico a muitas vezes o nosso maior problema a nossa maior o nosso maior desafio está na concorrência tá o que que isso significa vamos imaginar que a gente tem um e commerce e esse como se tem um único está na concorrência. O que isso significa? Vamos imaginar que a gente tem um e-commerce, e esse e-commerce tem um único produto para venda. Só tem um produto em um estoque. E a gente está no meio de uma Black Friday. Já pensou o cliente A e o cliente B compram esse produto no exato momento? E para eles fazerem a compra, o que eles precisam fazer? Consultar o estoque. Mas na hora que eles consultam o estoque simultaneamente, consta que tem um produto. Mas na hora que eles vão fazer o restante da compra, você vai perceber que eles venderam o único produto para duas pessoas porque porque isso aí foi um problema clássico de concorrência legal como que você pode evitar esses tipos de concorrência muita gente faz o seguinte opa eu vou criar um cachê vinho até local aqui no meu sistema e daí o que acontece? Na hora que os caras acessarem juntos, eu consigo saber se aquele cara já está comprado ou eu posso dar um lote ali e ninguém tem problema, esse problema de concorrência. Até então, funciona. O grande problema é que hoje em dia as nossas aplicações escalam e eu não tenho apenas um sistema. Eu tenho 10 sistemas iguais rodando em servidores diferentes. Ou seja, não adianta apenas uma máquina aqui de uma forma geral localmente tentar resolver esse problema, porque eu tenho as outras máquinas rodando. Entende? resolver esse problema porque eu tenho as outras máquinas rodando entende como que eu consigo resolver esse problema de concorrência através de lock distribuído o lock distribuído vai ser uma forma de bloquear um registro bloquear uma operação né caso duas pessoas na dois sistemas né é duas requisições tem alterar no mesmo tempo. Então você vai bloquear essa requisição, o outro não vai conseguir alterar. Depois que você executou a sua operação, você desbloqueia. Agora, a grande sacada disso aqui ser distribuído é pelo fato de você conseguir fazer isso independente da quantidade de máquinas que estejam rodando. Qual que é a grande vantagem de você conseguir trabalhar com o lock distribuído? Consistência nos dados. Uma das principais vantagens aqui é consistência nos dados. Por quê? Porque no final do dia você garante que você não vai vender um único produto para duas pessoas. Legal? Uma outra coisa aqui é a parte de contenção de recurso o que acontece galera toda vez que você vai fazer uma operação desse tipo tá você vai fazer o que você vai obrigar sei lá um banco de dados a fazer o que é travar linhas de bancos de dados específicas, um monte de requisição fica acessando e vai fazendo com que você gaste mais recurso o tempo todo. Porque não adianta. Você vai fazer essa operação com várias máquinas ao mesmo tempo, você vai gerar um módulo de contenção, vai fritar entre o seu banco de dados, vai deixar a aplicação mais lenta e não vai resolver necessariamente o seu problema. Um outro ponto importante também é que você evita deadlocks. O que isso significa? Imagina o seguinte, eu tenho o cliente A e o cliente B. O cliente A tem que alterar o registro A e o cliente B, ele quer alterar o registro B. Porém, quando ele altera a opção A, ele tem que fazer um update na versão B. Legal? E o outro, quando ele altera a versão B, ele quer alterar, por consequência, o registro da versão A. Porém, o que acontece? Olha só que muito louco. Se você dá um lock no A, no sistema 1, e dá um lock no B, no sistema 2, quando o A tentar alterar o B, ele não vai conseguir, porque o B está bloqueado pelo sistema 2. E quando o sistema 2 tentar alterar o A, ele não consegue porque o sistema A está bloqueado. Então, ambos não vão poder fazer nada e a gente tem a situação da deadlock. Legal? Então, isso é uma coisa que acontece. Legal? Ou seja, você precisa alterar um registro que o outro está bloqueado e o outro precisa alterar o registro que você bloqueou. E daí ninguém consegue avançar e você tem uma deadlock. Legal? E por último, você garante mais eficiência nos recursos. Por quê? Você vai ter um cara centralizador com todos os locks, tá? E esse cara é feito e otimizado para resolver esse tipo de problema quem chega primeiro o lock depois o cara utilizou você vai dar um unlock é basicamente isso mas isso de uma forma externa tá você não vai fazer o lock para cada máquina tá pra cada instância que você está trabalhando o seu sistema sistema de lock distribuído vai ser uma máquina à parte, um servidor à parte, que só vai gerenciar os locks ali para você. Legal? Quais servidores, quais tecnologias eu posso utilizar para fazer os locks? Você pode utilizar o Zookeeper, por exemplo. É uma ferramenta excelente para gerenciamento de nodes, gerenciamento de locks, conseguir fazer consenso, porque os seus locks também podem ter diversos nodes, esses nodes têm que estar replicados, entendeu? Outro cara que é o ETCD, que é o mesmo banco de dados que você tem no Kubernetes, o Redis, que é fantástico, e o cônsul por exemplo da hash corp agora o que você tem que entender é que todas essas tecnologias elas têm prós e contras vou dar um exemplo pra você o zoolkeeper ele é uma ferramenta fantástica pra vocês terem uma idéia hoje o zoolkeeper é o cara que gerencia todos os nodes do Apache Kafka. Porém, o que acontece? O Zookeeper está atrás, por exemplo, de consistência. Por quê? Quando você está com o Distributed Lock, esse servidor seu que você tem para lock não é apenas uma máquina. Você tem que ter diversos nodes para ele aguentar a escala. Legal? diversos nodes para ele aguentar a escala legal agora como eu garanto que o loque que alguém acabou de dar já foi replicado em todas as outros nodes do zookeeper então o zookeeper ele é muito rápido para garantir essa consistência tá é ele tem um protocolo uma espécie de um protocolo próprio para conseguir fazer isso tá por outro lado é quando você quer garantir muita consistência você perde o que velocidade entende então o zookeeper ele não é o cara que tem o maior truque ou seja aguentar a maior quantidade de requisições agora vou dar um exemplo aqui por exemplo do red red um banco de dados que ele consegue gravar os dados físicos e também na memória, mas de forma geral, nesses casos, a gente trabalha só na memória. Então você consegue gravar essas informações de uma forma muito rápida. O grande ponto é o seguinte, o Redis, quando ele está rodando de forma distribuída, o tempo de replicação dessas informações para os outros nodes pode demorar um pouco. E o que acontece? Quando demorar, e se o node master que recebeu a informação caiu, pode ser que você pegue a informação desatualizada até ele fazer um outro consenso para subir um novo master ali. Entendeu? Então a gente tem que tomar muito cuidado com isso apesar de você pode rodar com o Redis de forma mais eficiente, tá? pra correctness, que a gente fala, né? ou seja, pra garantir essa consistência legal? mas quando você roda ele com essa maior consistência talvez rodar o zookeeper sejam melhor ele vai ter mais consistência ainda do que o Red porém o Red ele vai ser mais rápido do que do que o zookeeper normalmente a galera usa mais Red porque porque você tem essa service na Amazon você tem essa service em tudo quanto é lugar já o zooki per eu pelo menos nunca vi o zooki per essa serve então em tese você teria que gerenciar o cluster tá mas de qualquer forma são ótimas ferramentas e vão resolver esse seu problema para trabalhar com o lock distribuído Wesley queria dar uma olhada por curiosidade de código como é que funciona o lock unlock olha só peguei um exemplo bem simples aqui tá em typescript basicamente o que você faz você faz a conexão com o zookeeper depois você fala o que você quer bloquear então vou falar quero bloquear o produto um tal produto id e aí você vai fazer um lock quando eu dou um lock eu tô falando pros o keeper tá a bloquear isso pra mim isso é chamado de lock zone ou seja zona de lock então eu tô falando assim olha a no barra produt id um tá bloqueia isso pra mim quando ele bloquear quando algum outro usuário tentar acessar e falar que quer bloquear aquilo, ele já vai receber um mais certo. Legal? Depois que você utilizou esse produto, fez as alterações, você dá um unlock e você libera essa parada aqui. Uma coisa interessante nesse caso com o Zookeeper é o seguinte, galera. Você consegue trabalhar em formatos de nem spaces então eu posso colocar barra produt barra a e de barra data barra isso barra aquilo você vai querendo todo o mesmo space para criar a sua loc zone então fica bem legal aí pra você conseguir trabalhar ali com o zookeeper se você vê uma implementação de forma geral bem simples e no dia a dia é simples mesmo você pede para alocar se já tiver alocado você vai receber uma excepção entende se não tiver alocado vai alocar você vai atualizar e vai ter que dar um lock aí o próximo a pessoa que tentar acessar vai chegar lá beleza então essa é a idéia básica e pra vocês nesse patente algo bem comum a gente utilizar em grandes aplicações locke distribuído