Kafka, Lamoda et une irrésistible envie d'apprendre





Nikita Galushko, développeur de la division Boutique en ligne Lamoda, lors de sa visite au centre de formation Slurm, a partagé ses impressions sur le cours Kafka, a expliqué comment cette technologie est utilisée et quels problèmes sont résolus dans le département R&D (Recherche et Développement).



«À quelle vitesse atteindrons-nous le canal réseau utilisé par Kafka - dans deux ans ou moins?»


Lamoda est l'un des plus grands magasins en ligne de Russie et de la CEI. Afin que les acheteurs puissent utiliser le site sans problème et profiter d'une expédition et d'une livraison rapides, 340 employés sont engagés dans les systèmes informatiques de Lamoda: développeurs, ingénieurs QA, analystes, spécialistes DevOps, chefs de produit, concepteurs. Voyons comment les rouages ​​tournent dans ce système.



Dis-moi quelque chose à propos de toi. Que faites-vous chez Lamoda et depuis combien de temps y travaillez-vous?



Comme j'aime dire: "J'appuie sur les boutons, et ils me paient de l'argent pour ça." J'appuie sur des boutons depuis environ six ans maintenant. Pendant tout ce temps, j'ai écrit en Go. Je suis chez Lamoda il n'y a pas si longtemps, depuis octobre 2020, mais j'ai déjà réussi à libérer mes tentacules dans de nombreux projets de services.



Je travaille dans le département RnD (Recherche et Développement) - c'est un département où une semaine vous écrivez un service sur Kafka et décidez comment faire une transaction distribuée entre Kafka et PostgreSQL, et la prochaine vous écrivez un générateur de code pour Aerospike. C'est un travail très intéressant.



Dois-je bien comprendre que la R&D est fortement liée à l'analyse?



Oui, nous travaillons en étroite collaboration avec les data scientists. Ils effectuent des analyses, forment et construisent des modèles, puis nous demandent d'intégrer ces modèles dans le fonctionnement d'une application ou d'un site Web. Par exemple, un modèle qui montre aux utilisateurs une liste personnalisée de recommandations ou suggère quelle taille de vêtements ou de chaussures convient le mieux à un client.



Quelles tâches aimez-vous dans votre travail? Qu'est-ce qui vous intéresse dans le département R&D?



C'est probablement la liberté. Vous n'êtes pas limité à un domaine de connaissances, un service ou un petit ensemble de services. En R&D, vous pouvez apporter des modifications au service dans Go, et le lendemain, changer dans Java. Pour certains, cela peut être un inconvénient, car avec cette approche, il est difficile de se concentrer sur un seul service. Mais pour moi, c'est l'occasion de m'essayer dans différents domaines, de voir quelles approches les développeurs ont utilisées pour résoudre différents problèmes, d'apprendre quelque chose de nouveau pour moi-même.



Nous avons récemment commencé à créer un générateur de code pour analyser les résultats d'Aerospike. Puisqu'il donne des données brutes, vous devez constamment les analyser à la main. Et ce sont des erreurs potentielles et une perte de temps précieux: vous avez oublié quelque chose ou n'avez pas vérifié quelque chose, et le résultat n'est pas ce que vous attendez. Par conséquent, nous y avons réfléchi et avons décidé d'écrire notre propre générateur de code. Jusqu'à présent, cela fonctionne en mode test, mais j'espère que bientôt nous l'ouvrirons.



Lamoda fait-il souvent des projets open source?



Lamoda a un projet open source relativement connu appelé Gonkey . Vous pouvez en savoir plus dans notre article .



Gonkey est un ensemble standardisé de solutions qui facilite l'écriture de tests automatiques dans le langage de balisage Yaml. Ceci est pratique car ces tests peuvent être écrits à la fois par les développeurs et les testeurs, augmentant ainsi le pourcentage de couverture des tests.



Maintenant, cet outil ne se développe pas aussi rapidement au sein de l'entreprise que nous le souhaiterions, mais nous prévoyons d'y consacrer plus de temps à l'avenir: fermer les packages qui s'ouvrent sur github, répondre aux questions, améliorer.



Très probablement, pour cela, vous devez disposer d'un large éventail de connaissances, pour étudier deux fois plus que d'habitude. Est-ce vrai?



Je dirais qu'il suffit d'avoir une vision d'ensemble.



Superficiel?



Pas certainement de cette façon. Il existe un développeur en forme de T. Il comprend très bien, même très bien, dans un domaine, mais en même temps il est plus ou moins versé dans un certain nombre d'autres domaines. J'ai déjà dit que maintenant j'écris en Java, mais toujours 99% du code que j'écris en Go. Par conséquent, lorsque vous connaissez très bien la pile de Go et que vous savez en même temps regarder autour de vous, c'est bien non seulement lorsque vous travaillez en R&D, mais en général. Vous pouvez apprendre des idées et des approches d'autres technologies et langages.



Je connais des gens qui ont écrit en Python pendant un certain temps, puis sont passés à Go - ils ont aimé la façon dont ce langage aborde la gestion des erreurs. Maintenant, ils essaient d'apporter la même approche aux projets qui écrivent en Python.



Probablement, chaque développeur qui souhaite développer n'a pas d'autre choix - vous devez mettre à niveau dans différents domaines. Vous ne pourrez pas rester indéfiniment pour comprendre un seul domaine hautement spécialisé. Si vous travaillez n'importe où, vous devez vous développer.



Si je comprends bien, les tâches de R&D sont diverses. Avez-vous dû apprendre quelque chose au cours du processus?



Apprentissage et développement avec moi, depuis que je me suis familiarisé avec la programmation en 10e année du lycée. J'ai du plaisir quand j'apprends quelque chose de nouveau ou quand je parle de quelque chose de nouveau aux autres. Avant Lamoda, je travaillais sur VKontakte et je développais de la même manière, lisais des articles, suivais des cours, regardais les discours des conférences.



Je n'ai pas envie de courir pour lire des livres et de me développer de manière désintéressée - chacun décide par lui-même. Même si vous prenez un exemple d'une de mes œuvres passées: nous avons tout écrit dans Go, et en parallèle j'ai regardé vers Rust. Ce n'était pas encore si populaire à l'époque, et les articles sur le thème "Go versus Rust" de ces temps lointains m'intéressaient beaucoup. En même temps, je n'en avais pas besoin pour travailler.



Si nous parlons de travailler chez Lamoda, qu'avez-vous dû mettre à niveau au cours de la dernière année, à part Kafka?



Travailler avec Kubernetes et écrire des graphiques de barre. Au fait, j'ai suivi un cours sur Kubernetes avec vous, car je n'avais jamais travaillé avec lui auparavant. Il s'agissait généralement de machines virtuelles ou de matériel physique, et tout passait soit par les administrateurs, soit vous aviez vous-même accès pour déployer le package deb. Par conséquent, je devais maîtriser Kubernetes: pas au niveau "via kubectl pour voir l'état du pod-a", mais au niveau de l'écriture correcte du graphique de barre et de la compréhension de son fonctionnement à l'intérieur.



Pendant que nous parlons de cours, parlons de Kafka. Pourquoi avez-vous suivi le cours Kafka?



J'ai vu une bannière sur le site Web: " Cours Kafka à venir ". Et j'ai pensé: "Il faut y aller!"



Comme je l'ai mentionné, j'adore apprendre de nouvelles choses. Vous n'avez pas besoin d'être sept pouces dans le front pour envoyer ou lire un message dans Kafka au niveau minimum. Mais en général, Lamoda Kafka est utilisé depuis longtemps et fermement. Par conséquent, une plongée profonde dans cette technologie était inévitable pour moi.



Qu'est-ce que Kafka pour vous?



Pour moi, il s'agit d'un journal distribué tolérant aux pannes avec une interface d'interaction simple qui peut pomper une quantité incroyablement grande de données à travers lui-même.



Comment Kafka est-il utilisé dans Lamoda?



Il me semble que trouver un service qui n'utilise pas Kafka à Lamoda est très difficile. Nous y avons implémenté un bus événementielEst-ce un tel bus d'événements pour l'ensemble de Lamoda. Quelqu'un écrit certains événements et tout autre participant connecté à ce bus peut les lire et y réagir d'une manière ou d'une autre.



Si nous parlons de nouveaux projets, nous avons récemment lancé un service de collecte de données analytiques à partir des backends xlog (c'est son nom interne). Également via Kafka, car il nécessite un débit élevé de l'ensemble du système.



Kafka est également nécessaire pour travailler avec ClickHouse, qui dispose d'un moteur Kafka. Autrement dit, nous écrivons simplement dans Kafka, et ClickHouse lit et écrit des données sur lui-même. C'est très pratique, car nous travaillons sur l'un des projets où vous devez faire beaucoup d'entrées dans ClickHouse et souvent. Et comme nous le savons, ClickHouse ne sait pas comment faire cela dès la sortie de la boîte - il a besoin d'un proxy approprié. Maintenant, le marché a une solution de Yandex et VKontakte, mais comme Lamoda a déjà une bonne expertise dans Kafka, nous avons décidé de l'utiliser pour communiquer avec ClickHouse.



Nous l'utilisons également activement pour toutes sortes d'analyses.



Comment l'équipe R&D utilise-t-elle Kafka? Si vous dites que Kafka est des journaux pour vous, est-ce que je comprends bien que vous développez des services qui l'utilisent, c'est-à-dire que vous travaillez avec Kafka Streams?



Nous avons notre propre wrapper sur la bibliothèque pour travailler avec Kafka, qui fournit une sorte d'abstraction. Mais en fait, Go a des canaux: les développeurs lisent depuis le canal et y écrivent. Ils peuvent même ne pas se demander si c'est Kafka ou non.



Quels problèmes vous et votre équipe avez-vous rencontrés avec Kafka? Comment avez-vous essayé de les résoudre?



Maintenant, nous avons une question, à quelle vitesse allons-nous atteindre le canal réseau utilisé par Kafka - dans deux ans ou plus tôt? Et derrière, une autre question se pose: quelle compression faut-il activer et pour quels sujets dans Kafka afin de reporter cette histoire?



Classiquement, le même service de collecte de données analytiques est le premier candidat à la compression. Mais nous ne pouvons pas simplement accepter et activer la compression, car il s'agit d'une sorte de compromis entre l'utilisation du processeur par les producteurs et les consommateurs.



J'essaye maintenant de préparer un document avec des tests et des analyses. Au fait, votre cours m'a beaucoup aidé, car il y a une leçon séparée sur la façon de comparer Kafka. Dans ce document, je souhaite indiquer s'il est désormais nécessaire d'activer la compression sur ce service. Si tel est le cas, lequel inclure, car il existe différents algorithmes de compression. Il me semble que c'est le sujet d'amélioration le plus évident.



Existe-t-il actuellement des problèmes de brûlure avec Kafka?



Lorsque nous avons configuré ClickHouse pour qu'il fonctionne avec Kafka, il y avait un problème en raison du fait que les droits de description dans le groupe que nous avons utilisé n'étaient pas définis correctement.



Cela semble moins effrayant qu'un plan pour courir dans la bande passante.



Je vais également vous interroger sur ce que j'ai appris récemment. KIP500 a été libéré de Kafka 2.8 pour abandonner ZooKeeper. Et si je comprends bien, Kafka s'est reposé sur la présence de ZooKeeper, ses limites. Ils promettent que si ZooKeeper est abandonné, le nombre de partitions augmentera à deux millions. Cela résout-il en quelque sorte votre problème?



Si vous répondez directement, alors non, cela ne résout pas, car nous ne sommes pas confrontés au travail de Kafka, mais sur le canal réseau que nous utilisons avant lui. Elle gère facilement la quantité de données que nous lui envoyons - le canal ne change pas de cela.



Si nous parlons du KIP500, alors ils ont fait le premier pas vers l'abandon de ZooKeeper, mais pour l'instant cela ne ressemble pas à une solution fiable: il ne vaut probablement pas la peine d'abandonner brusquement ZooKeeper et de passer à 2,8 pour certains systèmes de production plus ou moins chargés.



Le fait est que les opérations traitent généralement avec Kafka et doivent comprendre comment résoudre les problèmes émergents. Maintenant, ils savent: si quelque chose s'est passé, ils doivent aller faire quelque chose de spécifique dans Kafka, et dans ZooKeeper autre chose. Et quand il n'est pas là, le plan de résolution des problèmes ne fonctionne pas, et vous devrez développer une expertise en la matière.



J'ai bien compris: vous vous heurtez au réseau et la mise à l'échelle horizontale de Kafka n'aide pas, c'est-à-dire est-ce seulement un problème de réseau?



En général, Kafka est conçu de manière à ce que vous vous heurtiez au réseau ou à autre chose, mais pas à ses performances. Je me souviens exactement de ce qui est dit à ce sujet dans le cours, et les enseignants expliquent en détail pourquoi il en est ainsi. Mais nous n'en parlerons pas pour que ceux qui sont intéressés puissent aller voir le cours.



Sur la grande tâche, tout est clair - la bande passante. Et pour résoudre ce problème, vous êtes allé au cours pour lui remonter le moral et apporter quelque chose à l'équipe. Est-ce une coïncidence ou est-ce délibérément arrivé?



Coïncidence, parce que je suis d'abord allé regarder le cours, pas seulement pour apprendre à écrire en Kafka. En effet, pour une réplication bonne et correcte, vous devez définir les bons acks. Le cours vous plonge dans l'intérieur du système et son fonctionnement.



Si nous parlons d'un cours, il n'y a pas de division entre les développeurs et les administrateurs. Avez-vous parcouru tous les sujets ou parcouru l'administrateur?



J'ai parcouru tous les sujets car tout m'intéresse. J'apprécie beaucoup d'apprendre de nouvelles choses. Habituellement, je prends des notes, et après un certain temps je reviens à ces notes, relis, jette quelque chose. Si quelque chose n'est pas clair, je vais réviser une partie du cours et réécrire une partie du synopsis.



Avez-vous fait votre stage? Cela a-t-il été difficile pour vous de les mettre en œuvre, en particulier ceux qui sont administratifs?



J'ai réussi, mais pas encore tout. Non, tout était suffisamment bien planifié, comment et ce qu'il fallait faire et à quel résultat s'attendre. C'était intéressant pour moi.



Tout d'abord, une application Java est utilisée pour certains travaux pratiques. Je n'étais pas seulement intéressé à faire ce travail, mais j'ai passé du temps à apprendre le code en Java qui fonctionne avec Kafka. Vous devez regarder un peu plus loin et plus loin lorsque vous effectuez de telles tâches pratiques.



Autrement dit, vous regardez la technologie.



Oui. Quand je travaillais sur des partitions, il s'agissait de réplication. Et j'ai pensé, que se passerait-il si je le faisais un peu différemment. J'ai pris le temps de jouer et de vérifier ce qui se passe si je désactive un nœud? Et si deux? Et si je fais autre chose? C'est bien qu'il y ait un support pour la pratique, vous n'avez rien à soulever de vous-même. Il n'y a pas besoin de perdre du temps là-dessus.



Dites-nous ce qui a été le plus intéressant pour vous? Qu'avez-vous appris à ce sujet, pourquoi avez-vous été très surpris?



Par exemple, Kafka est en fait une file d'attente en mémoire. Nous sommes habitués au fait que les bases de données n'écrivent pas seulement sur le disque, mais appellent également fsync afin que le système d'exploitation vide les données sur le disque. Parce que le simple fait d'appeler write ne garantit pas que les données seront écrites.



Kafka ne fait pas cela: il appelle simplement write, un appel système, et c'est tout. Il dit simplement: "Vous êtes le système d'exploitation, vous décidez quand le réinitialiser." Et en fait, la fiabilité de Kafka est assurée par la réplication. Je ne savais pas ça. Je pensais que Kafka appelle fsync et persiste honnêtement toutes les données sur le disque. C'est à quel point elle est rusée.



Il était également intéressant d'entendre parler des problèmes de plusieurs centres de données.



Vos tâches de bande passante. Qu'avez-vous réussi à tirer du cours pour relever les défis futurs?



Comment mesurer les performances de Kafka et comment cela fonctionne avec des données compressées. Kafka ne les décompresse pas, mais les écrit sur le disque et les donne aux consommateurs tels quels. Cela montre clairement qu'il est nécessaire de regarder les coûts du processeur non seulement sur le producteur qui écrit dans Kafka, mais aussi sur le consommateur qui lit à partir de celui-ci. Eh bien, et comment le comparer correctement.



Ou peut-être y a-t-il eu quelque chose de difficile dans le cours pour vous? Ou la pratique était-elle particulièrement difficile?



C'était exactement comme ça: j'ai regardé une vidéo plusieurs fois. Exactement révisé sur le rééquilibrage du groupe de consommateurs. Dès le premier visionnage, il n'était pas tout à fait clair comment cela se passait. Je ne parle pas d'un simple rééquilibrage, mais d'un rééquilibrage progressif. Cela a dû être révisé et relu.



Le sujet est complexe en soi. Vous avez regardé la vidéo et elle semble être claire à distance, mais vous voulez comprendre clairement tous les processus, vous devez donc la réviser. Il suffit de s'asseoir avec un crayon pour dessiner - alors vous réalisez que tout semble être devenu clair.



Et en conclusion, je vais demander: qu'est-ce que vous avez dans vos projets de formation et de travail?



J'ai commencé à bloguer. J'ai acheté un domaine et je l'ai proposé gratuitement à DigitalOcean - ils distribuent du contenu statique gratuitement. Bloguer me donne une incitation à apprendre quelque chose, à l'écrire et à le partager avec les autres. Vous comprenez le sujet lorsque vous pouvez le dire à quelqu'un pour qu'il comprenne également.



Et le blog donne juste la compétence de raconter. Je traite maintenant de l'efficacité des indices GIN. Il y aura bientôt un article sur ce sujet, basé sur la conférence GolangConf de l'année dernière.



Vous devez toujours chercher par vous-même: si vous avez la force, alors pourquoi ne pas lire l'article sur le fonctionnement de Go.



All Articles