Kafka, Lamoda e uma vontade irresistível de aprender





Nikita Galushko, desenvolvedor da divisão Online Shop Lamoda, durante uma visita ao centro de treinamento Slurm, compartilhou suas impressões sobre o curso Kafka, contou como essa tecnologia é utilizada e quais problemas são resolvidos no departamento de P&D (Pesquisa e Desenvolvimento).



"Com que rapidez chegaremos ao canal de rede que Kafka usa - em dois anos ou menos?"


Lamoda é uma das maiores lojas online da Rússia e da CEI. Para que os compradores possam usar o site sem problemas e desfrutar de remessa e entrega rápidas, 340 funcionários estão envolvidos em sistemas de TI na Lamoda: desenvolvedores, engenheiros de QA, analistas, especialistas em DevOps, gerentes de produto, designers. Vamos descobrir como as engrenagens giram neste sistema.



Diz-me algo sobre ti. O que você faz na Lamoda e há quanto tempo trabalha lá?



Como gosto de dizer: "Eu aperto os botões e eles me pagam por isso." Tenho pressionado botões há cerca de seis anos. Todo esse tempo eu escrevi em Go. Estou em Lamoda não faz muito tempo, desde outubro de 2020, mas já consegui lançar meus tentáculos em muitos projetos de serviço.



Eu trabalho no departamento de RnD (Pesquisa e Desenvolvimento) - este é um departamento onde uma semana você escreve um serviço no Kafka e decide como fazer uma transação distribuída entre Kafka e PostgreSQL, e na próxima você escreve um gerador de código para Aerospike. Este é um trabalho muito interessante.



Eu entendi corretamente que a P&D está fortemente ligada à análise?



Sim, trabalhamos em estreita colaboração com cientistas de dados. Eles conduzem análises, treinam e constroem modelos e, em seguida, vêm até nós com uma solicitação para incorporar esses modelos à operação de um aplicativo ou site. Por exemplo, um modelo que mostra aos usuários uma lista personalizada de recomendações ou sugere qual tamanho de roupa ou calçado é mais adequado para um cliente.



Quais tarefas você gosta em seu trabalho? O que é interessante para você no departamento de P&D?



Provavelmente é liberdade. Você não está limitado a nenhum domínio de conhecimento, serviço ou um pequeno conjunto de serviços. Em P&D, você pode fazer alterações no serviço em Go e, no dia seguinte, em Java. Para alguns, isso pode ser uma desvantagem, pois com essa abordagem é difícil se concentrar em um serviço. Mas para mim esta é uma oportunidade de experimentar diferentes áreas, ver quais abordagens os desenvolvedores usaram para resolver diferentes problemas, aprender algo novo para mim.



Recentemente, começamos a fazer um gerador de código para analisar os resultados do Aerospike. Como ele fornece dados brutos, você precisa analisá-los constantemente à mão. E esses são erros potenciais e uma perda de tempo precioso: você esqueceu algo ou não verificou algo e o resultado não é o que você esperava. Portanto, pensamos sobre isso e decidimos escrever nosso próprio gerador de código. Por enquanto, funciona em modo de teste, mas espero que abramos em breve.



Lamoda costuma fazer projetos de código aberto?



Lamoda tem um projeto de código aberto relativamente conhecido chamado Gonkey . Você pode ler mais sobre isso em nosso artigo .



Gonkey é um conjunto padronizado de soluções que torna fácil escrever autotestes na linguagem de marcação Yaml. Isso é conveniente porque esses testes podem ser escritos por desenvolvedores e testadores, aumentando assim a porcentagem de cobertura do teste.



Agora, essa ferramenta não está se desenvolvendo tão rapidamente na empresa como gostaríamos, mas planejamos contribuir com mais tempo com ela no futuro: feche os pacotes que abrem no github, responda às perguntas, melhore.



Provavelmente, para isso, você precisa ter um grande acervo de conhecimentos, para estudar o dobro do normal. É assim?



Eu diria que você só precisa ter uma visão ampla.



Superficial?



Certamente não dessa forma. Existe um desenvolvedor em forma de T. Ele entende muito bem, até mesmo perfeitamente, em uma área, mas ao mesmo tempo ele é mais ou menos versado em uma série de outras áreas. Já disse que agora escrevo em Java, mas ainda 99% do código que escrevo em Go. Portanto, quando você conhece muito bem a pilha de Go e ao mesmo tempo sabe como olhar ao redor, isso é bom não apenas quando se trabalha em P&D, mas em geral. Você pode aprender algumas idéias e abordagens de outras tecnologias e linguagens.



Conheço pessoas que escreveram em Python por um tempo e depois mudaram para Go - elas gostaram de como essa linguagem aborda o tratamento de erros. Agora eles estão tentando trazer a mesma abordagem para projetos que escrevem em Python.



Provavelmente, todo desenvolvedor que deseja desenvolver não tem outra escolha - você precisa atualizar em áreas diferentes. Você não será capaz de ficar sentado para sempre para entender apenas uma área altamente especializada. Se você trabalha em qualquer lugar, precisa se desenvolver.



Pelo que entendi, as tarefas em P&D são diversas. Você teve que aprender algo no processo?



Aprendizagem e desenvolvimento comigo, desde que me familiarizei com programação no 10º ano do liceu. Tenho prazer quando aprendo algo novo ou quando falo para outras pessoas sobre algo novo. Antes do Lamoda, trabalhei no VKontakte e me desenvolvi da mesma forma, li artigos, fiz cursos, assisti a palestras em conferências.



Eu não desejo correr para ler livros e desenvolver abnegadamente - cada um decide por si mesmo. Mesmo se você tomar um exemplo de um dos meus trabalhos anteriores: escrevemos tudo em Go e, em paralelo, olhei para Rust. Ainda não era tão popular na época, e os artigos sobre o tópico "Vá contra a ferrugem" daqueles tempos distantes eram muito interessantes para mim. Ao mesmo tempo, não precisava dele para trabalhar.



Se falarmos em trabalhar na Lamoda, o que você precisou fazer um upgrade no ano passado, além do Kafka?



Trabalhar com Kubernetes e escrever gráficos de comando. A propósito, fiz um curso de Kubernetes com você, porque nunca havia trabalhado com ele antes. Normalmente eram máquinas virtuais ou hardware físico, e tudo passava pelos administradores ou você mesmo tinha acesso para lançar o pacote deb. Portanto, eu tive que dominar o Kubernetes: não no nível "por meio do kubectl para ver o estado do pod-a", mas no nível de escrever corretamente o gráfico do leme e entender como ele funciona internamente.



Já que falamos sobre cursos, vamos falar sobre Kafka. Por que você fez o curso de Kafka?



Vi um banner no site: " Curso de Kafka em breve ." E eu pensei: "Temos que ir!"



Como mencionei, adoro aprender coisas novas. Você não precisa ter dezoito centímetros de altura para enviar ou ler uma mensagem em Kafka no nível mínimo. Mas, em geral, Lamoda Kafka tem sido usado por muito tempo e com firmeza. Portanto, um mergulho profundo nessa tecnologia era inevitável para mim.



O que é Kafka para você?



Para mim, este é um log distribuído e tolerante a falhas com uma interface de interação simples que pode bombear uma quantidade incrivelmente grande de dados através de si mesmo.



Como o Kafka é usado em Lamoda?



Parece-me que é muito difícil encontrar um serviço que de alguma forma não utilize o Kafka em Lamoda. Implementamos ônibus de eventos neleÉ um desses ônibus de eventos para toda a Lamoda. Alguém grava alguns eventos e qualquer outro participante conectado a este ônibus pode lê-los e, de alguma forma, reagir a eles.



Se falamos de novos projetos, lançamos recentemente um serviço para coletar dados analíticos de back-ends de xlog (este é seu nome interno). Também através do Kafka, pois requer alto rendimento de todo o sistema.



O Kafka também é necessário para trabalhar com o ClickHouse, que tem um mecanismo Kafka. Ou seja, apenas escrevemos no Kafka, e o ClickHouse lê e grava dados nele mesmo. Isso é muito conveniente, porque estamos trabalhando em um dos projetos em que você precisa fazer muitas entradas no ClickHouse e com frequência. E, como sabemos, a ClickHouse não sabe fazer isso logo de cara - ela precisa de um proxy adequado. Agora o mercado tem uma solução da Yandex e da VKontakte, mas como a Lamoda já possui uma boa expertise em Kafka, decidimos utilizá-la para nos comunicarmos com a ClickHouse.



Também o usamos ativamente para todos os tipos de análises.



Como a equipe de P&D usa o Kafka? Se você disser que Kafka é logs para você, entendi corretamente que você está desenvolvendo serviços com ele, ou seja, está trabalhando com Kafka Streams?



Temos nosso próprio wrapper sobre a biblioteca para trabalhar com Kafka, que fornece algum tipo de abstração. Mas, na verdade, Go tem canais: os desenvolvedores leem e escrevem no canal. Eles podem nem mesmo pensar se é Kafka ou não.



Que problemas você e sua equipe enfrentaram com Kafka? Como você tentou resolvê-los?



Agora, temos uma pergunta: com que rapidez chegaremos ao canal de rede que Kafka usa - em dois anos ou antes? E por trás disso, surge outra questão: que compressão deve ser habilitada e para quais tópicos do Kafka para adiar esta história?



Convencionalmente, o mesmo serviço de coleta de dados analíticos é o primeiro candidato para compactação. Mas não podemos simplesmente pegar e habilitar a compactação, porque isso é algum tipo de compensação entre o uso da CPU por produtores e consumidores.



Agora estou tentando preparar um documento com testes e análises. A propósito, seu curso me ajudou muito com isso, porque há uma lição separada sobre como fazer o benchmark de Kafka. Neste documento, quero refletir se agora é necessário habilitar a compactação neste serviço. Em caso afirmativo, qual incluir, porque existem diferentes algoritmos de compressão. Parece-me que este é o tópico mais óbvio para melhoria.



Existe algum problema de queima atual com o Kafka?



Quando configuramos o ClickHouse para funcionar com Kafka, houve um problema em que os direitos de descrição no grupo que usamos não foram definidos corretamente.



Parece menos assustador do que um plano para atingir largura de banda.



Também vou perguntar sobre o que aprendi recentemente. O KIP500 foi liberado do Kafka 2.8 para abandonar o ZooKeeper. E, pelo que entendi, Kafka se baseou na presença do ZooKeeper, em suas limitações. Eles prometem que, se o ZooKeeper for abandonado, o número de partições aumentará para dois milhões. Isso de alguma forma resolve o seu problema?



Se responder diretamente, então não, não resolve, porque não estamos esbarrando no trabalho do Kafka, mas no canal da rede que usamos antes dele. Ela lida facilmente com a quantidade de dados que enviamos para ela - o canal não muda a partir disso.



Se falarmos sobre o KIP500, então eles deram o primeiro passo para abandonar o ZooKeeper, mas até agora não parece uma solução confiável: provavelmente não vale a pena abandonar abruptamente o ZooKeeper e mudar para 2.8 para alguns sistemas de produção mais ou menos carregados.



A questão é que os ops geralmente lidam com Kafka e precisam entender como resolver problemas emergentes. Agora eles sabem: se algo aconteceu, eles precisam fazer algo específico no Kafka e no ZooKeeper outra coisa. E quando ele não está, o plano de resolução dos problemas não funciona, e você terá que desenvolver expertise nesse assunto.



Eu entendi bem: você corre para a rede e dimensionamento horizontal do Kafka não ajuda, ou seja, é apenas um problema de rede?



Em geral, Kafka é feito de tal forma que você vai correr para a rede ou outra coisa, mas não o seu desempenho. Lembro-me exatamente do que é dito sobre isso no curso, e os professores explicam em detalhes o porquê. Mas não vamos falar sobre isso para que os interessados ​​possam ir assistir ao curso.



Na grande tarefa, tudo está claro - largura de banda. E para resolver esse problema, você foi ao curso para animá-la e trazer algo para a equipe. É uma coincidência ou aconteceu deliberadamente?



Coincidência, porque originalmente fui assistir ao curso, não só para aprender a escrever em Kafka. Na verdade, para uma replicação boa e correta, você precisa definir os acks corretos. O curso mergulha você no interior do sistema e como ele funciona.



Se estamos falando sobre um curso, não há divisão entre desenvolvedores e administradores. Você passou por todos os tópicos ou percorreu o admin?



Passei por todos os tópicos porque tudo me interessa. Eu adoro aprender coisas novas. Normalmente eu faço anotações e depois de um tempo volto a essas anotações, releio, jogo algo fora. Se algo não estiver claro, vou revisar parte do curso e reescrever parte da sinopse.



Você já fez seu estágio? Foi difícil para você implementá-los, especialmente aqueles que são administradores?



Eu consegui, mas não tudo ainda. Não, estava tudo bem planejado, como e o que precisa ser feito e que resultado esperar. Foi interessante para mim.



Primeiro, um aplicativo Java é usado para algum trabalho prático. Eu estava interessado não apenas em fazer este trabalho, mas também passei algum tempo aprendendo o código em Java que funciona com o Kafka. Você precisa olhar um pouco mais fundo e mais amplo ao passar por tais tarefas práticas.



Ou seja, você está olhando para a tecnologia.



sim. Quando estava trabalhando em partições, tratava-se de replicação. E eu pensei, o que aconteceria se eu fizesse de forma um pouco diferente. Aproveitei o tempo para brincar e verificar o que acontece se eu desligar um nó? E se forem dois? E se eu fizer outra coisa? É bom que haja uma posição para a prática, você não precisa tirar nada de si mesmo. Não há necessidade de perder tempo com isso.



Conte-nos o que foi mais interessante para você? O que você descobriu sobre isso, por que ficou tão surpreso?



Por exemplo, que na verdade Kafka é uma fila na memória. Estamos acostumados com o fato de que os bancos de dados não apenas gravam no disco, mas também chamam fsync para que o sistema operacional libere os dados para o disco. Porque apenas chamar write não garante que os dados serão gravados.



Kafka não faz isso: ele apenas chama write, uma chamada de sistema e é isso. Ele simplesmente diz: "Você é o sistema operacional, você decide quando reiniciá-lo." E, de fato, a confiabilidade do Kafka é garantida por meio da replicação. Eu não sabia disso. Achei que Kafka chamasse fsync e, honestamente, persistisse todos os dados no disco. Ela é tão astuta.



Também foi interessante ouvir sobre os problemas de vários data centers.



Suas tarefas de largura de banda. O que você conseguiu tirar do curso para enfrentar os desafios do futuro?



Como medir o desempenho do Kafka e como ele funciona com dados compactados. O Kafka não os descompacta, mas os grava no disco e os entrega aos consumidores como estão. Isso deixou claro que é necessário olhar para os custos de CPU não apenas para o produtor que escreve em Kafka, mas também para o consumidor que lê a partir dele. Bem, e como compará-lo corretamente.



Ou talvez tenha havido algo difícil no curso para você? Ou a prática era particularmente difícil?



Foi exatamente assim: assisti a um vídeo várias vezes. Exatamente revisado sobre o reequilíbrio do grupo de consumidores. À primeira vista, não ficou totalmente claro como isso acontece. Não estou falando de um simples rebalanceamento, mas de um incremental. Isso teve que ser revisado e relido.



O assunto é complexo em si mesmo. Você assistiu ao vídeo e parece remotamente claro, mas você quer entender claramente todos os processos, então você precisa revisar. Basta sentar com um lápis para desenhar - então você percebe que tudo parece ter ficado claro.



E para terminar pergunto: o que você tem em seus planos de treinamento e trabalho?



Comecei a blogar. Comprei um domínio e aumentei para DigitalOcean gratuitamente - eles distribuem conteúdo estático de graça. O blog me dá um incentivo para aprender algo, escrever e compartilhar com outras pessoas. Você entende o assunto quando pode contá-lo a alguém para que ele também entenda.



E o blog só dá a habilidade de recontar. Agora estou lidando com a eficiência dos índices GIN. Haverá um artigo em breve sobre esse tópico, que é baseado na palestra da GolangConf do ano passado.



Você sempre precisa se olhar: se você tem forças, por que não ler o artigo sobre como funciona o Go.



All Articles