{"id":54431,"date":"2019-12-26T00:00:00","date_gmt":"2019-12-25T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-kafka-stala-bylyu"},"modified":"2020-02-18T14:02:26","modified_gmt":"2020-02-18T11:02:26","slug":"kak-kafka-stala-bylyu","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-kafka-stala-bylyu","title":{"rendered":"Comment Kafka est devenu une r\u00e9alit\u00e9","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Comment Kafka est devenu une r\u00e9alit\u00e9\" src=\"\/wp-content\/uploads\/2019\/12\/e61bf54b10e4e44a5c680185b0c16655.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Salut, Habr !<\/p>\n<p><\/p>\n<p>Je fais partie de l'\u00e9quipe Tinkoff, qui d\u00e9veloppe notre propre centre de notifications. Pour la plupart, je d\u00e9veloppe en Java avec Spring Boot et r\u00e9sous divers probl\u00e8mes techniques qui surviennent dans le projet.<\/p>\n<p><\/p>\n<p>La plupart de nos microservices interagissent de mani\u00e8re asynchrone entre eux via un courtier de messages. Auparavant, nous utilisions IBM MQ comme courtier, qui n'a plus \u00e9t\u00e9 en mesure de g\u00e9rer la charge, mais qui garantissait des livraisons de haute qualit\u00e9.<\/p>\n<p><\/p>\n<p>En remplacement, on nous a propos\u00e9 Apache Kafka, qui a un fort potentiel de scalabilit\u00e9, mais qui n\u00e9cessite malheureusement une approche quasiment sur mesure pour la configuration selon diff\u00e9rents sc\u00e9narios. De plus, le m\u00e9canisme de livraison au moins une fois, qui fonctionne par d\u00e9faut dans Kafka, ne permettait pas de maintenir le niveau de coh\u00e9rence n\u00e9cessaire directement en sortie de bo\u00eete. Ensuite, je vais partager notre exp\u00e9rience de configuration de Kafka, en particulier comment configurer et vivre avec la livraison exactement une fois.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"garantirovannaya-dostavka-i-ne-tolko\">Livraison garantie et plus encore<\/h2>\n<p><\/p>\n<p>Les param\u00e8tres dont il sera question par la suite aideront \u00e0 pr\u00e9venir plusieurs probl\u00e8mes li\u00e9s aux param\u00e8tres de connexion par d\u00e9faut. Mais d'abord, je voudrais attirer l'attention sur un param\u00e8tre qui facilitera le d\u00e9bogage \u00e9ventuel.<\/p>\n<p><\/p>\n<p>Cela aidera <strong>client.id<\/strong> pour le Producer et le Consumer. \u00c0 premi\u00e8re vue, vous pouvez utiliser le nom de l'application comme valeur, et dans la plupart des cas, cela fonctionnera. Cependant, le cas o\u00f9 plusieurs Consumers sont utilis\u00e9s dans l'application et que vous leur attribuez le m\u00eame client.id entra\u00eene le message d'avertissement suivant :<\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.utils.AppInfoParser \u2014 Error registering AppInfo mbean javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=kafka.test-0<\/code><\/pre>\n<p><\/p>\n<p>Si vous souhaitez utiliser JMX dans une application avec Kafka, cela peut poser probl\u00e8me. Pour ce cas, il est pr\u00e9f\u00e9rable d'utiliser comme valeur client.id une combinaison du nom de l'application et, par exemple, du nom du topic. Le r\u00e9sultat de notre configuration peut \u00eatre consult\u00e9 dans la sortie de la commande <strong>kafka-consumer-groups<\/strong> des utilitaires Confluent :<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Comment Kafka est devenu une r\u00e9alit\u00e9\" src=\"\/wp-content\/uploads\/2019\/12\/f807a93f36f262522a613161a549eb91.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Analysons maintenant le sc\u00e9nario de la livraison garantie du message. Le Producer Kafka dispose d'un param\u00e8tre <strong>acks<\/strong>, qui permet de configurer, apr\u00e8s combien de confirmations le leader du cluster doit consid\u00e9rer le message comme \u00e9crit avec succ\u00e8s. Ce param\u00e8tre peut prendre les valeurs suivantes :<\/p>\n<p><\/p>\n<ul>\n<li>0 \u2014 les confirmations ne seront pas prises en compte.<\/li>\n<li>1 \u2014 param\u00e8tre par d\u00e9faut, n\u00e9cessite une confirmation uniquement d'1 r\u00e9plique.<\/li>\n<li>\u22121 \u2014 des acks sont n\u00e9cessaires de toutes les replicas synchronis\u00e9es (configuration du cluster <strong>min.insync.replicas<\/strong>).<\/li>\n<\/ul>\n<p><\/p>\n<p>D'apr\u00e8s les valeurs \u00e9num\u00e9r\u00e9es, un acks \u00e9gal \u00e0 \u22121 offre les garanties les plus fortes qu'un message ne sera pas perdu. <\/p>\n<p><\/p>\n<p>Comme nous le savons tous, les syst\u00e8mes distribu\u00e9s ne sont pas fiables. Pour se prot\u00e9ger contre les pannes temporaires, le Kafka Producer propose le param\u00e8tre <strong>retries<\/strong>, qui permet de sp\u00e9cifier le nombre de tentatives de r\u00e9-envoi dans <strong>delivery.timeout.ms<\/strong>. \u00c9tant donn\u00e9 que le param\u00e8tre retries a comme valeur par d\u00e9faut Integer.MAX_VALUE (2147483647), le nombre de tentatives de r\u00e9-envoi peut \u00eatre ajust\u00e9 en modifiant uniquement delivery.timeout.ms.<\/p>\n<p><\/p>\n<h2 id=\"dvizhemsya-k-exactly-once-delivery\">Passons \u00e0 la livraison exactement une fois<\/h2>\n<p><\/p>\n<p>Les param\u00e8tres \u00e9num\u00e9r\u00e9s permettent \u00e0 notre Producer de livrer des messages avec une forte garantie. Parlons maintenant de la fa\u00e7on de garantir que seule une copie d'un message est \u00e9crite dans un topic Kafka ? Dans le cas le plus simple, il suffit de r\u00e9gler le param\u00e8tre <strong>enable.idempotence<\/strong> sur true. L'idempotence garantit qu'un seul message est \u00e9crit dans une partition d'un topic donn\u00e9. Les conditions pr\u00e9alables \u00e0 l'activation de l'idempotence sont les valeurs <strong>acks = all, retry &gt; 0, max.in.flight.requests.per.connection \u2264 5<\/strong>. Si ces param\u00e8tres ne sont pas d\u00e9finis par le d\u00e9veloppeur, les valeurs mentionn\u00e9es ci-dessus seront automatiquement appliqu\u00e9es.<\/p>\n<p><\/p>\n<p>Lorsque l'idempotence est configur\u00e9e, il est n\u00e9cessaire de s'assurer que les messages identiques arrivent toujours dans les m\u00eames partitions. Cela peut \u00eatre accompli en configurant la cl\u00e9 et le param\u00e8tre partitioner.class sur le Producer. Commen\u00e7ons par la cl\u00e9. Pour chaque envoi, elle doit \u00eatre identique. Cela est facilement r\u00e9alisable en utilisant un identifiant commercial provenant du message original. Le param\u00e8tre partitioner.class a pour valeur par d\u00e9faut \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/apache\/kafka\/blob\/trunk\/clients\/src\/main\/java\/org\/apache\/kafka\/clients\/producer\/internals\/DefaultPartitioner.java\">DefaultPartitioner<\/a><\/noindex>. Avec cette strat\u00e9gie de partitionnement par d\u00e9faut, nous agissons comme suit :<\/p>\n<p><\/p>\n<ul>\n<li>Si la partition est sp\u00e9cifi\u00e9e lors de l'envoi du message, nous l'utilisons.<\/li>\n<li>Si la partition n'est pas sp\u00e9cifi\u00e9e, mais que la cl\u00e9 est pr\u00e9cis\u00e9e \u2014 nous choisissons la partition sur la base du hachage de la cl\u00e9.<\/li>\n<li>Si ni la partition ni la cl\u00e9 ne sont sp\u00e9cifi\u00e9es \u2014 nous choisissons les partitions par ordre (round-robin).<\/li>\n<\/ul>\n<p><\/p>\n<p>De plus, l'utilisation d'une cl\u00e9 et l'envoi idempotent avec le param\u00e8tre <strong>max.in.flight.requests.per.connection = 1<\/strong> vous permet de traiter les messages sur le Consumer de mani\u00e8re organis\u00e9e. Il convient de noter que si votre cluster est configur\u00e9 avec un contr\u00f4le d'acc\u00e8s, vous aurez besoin de droits pour \u00e9crire de mani\u00e8re idempotente dans le topic.<\/p>\n<p><\/p>\n<p>Si vous manqueriez de fonctionnalit\u00e9s d'envoi idempotent par cl\u00e9 ou si la logique du c\u00f4t\u00e9 du Producer n\u00e9cessite de maintenir la coh\u00e9rence des donn\u00e9es entre diff\u00e9rentes partitions, les transactions vous aideront. De plus, gr\u00e2ce \u00e0 la transaction en cha\u00eene, vous pouvez conditionnellement synchroniser l'\u00e9criture dans Kafka, par exemple, avec l'\u00e9criture dans la base de donn\u00e9es. Pour activer l'envoi transactionnel sur le Producer, il doit \u00eatre idempotent, et vous devez \u00e9galement d\u00e9finir <strong>transactional.id<\/strong>. Si votre cluster Kafka est configur\u00e9 avec un contr\u00f4le d'acc\u00e8s, des droits d'\u00e9criture seront n\u00e9cessaires pour l'\u00e9criture transactionnelle, tout comme pour l'idempotente, qui peuvent \u00eatre fournis via un masque en utilisant la valeur stock\u00e9e dans transactional.id.<\/p>\n<p><\/p>\n<p>Formellement, n'importe quelle cha\u00eene peut \u00eatre utilis\u00e9e comme identifiant de transaction, par exemple le nom de l'application. Cependant, si vous ex\u00e9cutez plusieurs instances de la m\u00eame application avec le m\u00eame transactional.id, la premi\u00e8re instance lanc\u00e9e sera arr\u00eat\u00e9e avec une erreur, car Kafka la consid\u00e9rera comme un processus zombie. <\/p>\n<p><\/p>\n<pre><code class=\"java\">org.apache.kafka.common.errors.ProducerFencedException : le Producer a tent\u00e9 d'effectuer une op\u00e9ration avec une ancienne \u00e9poque. Soit il y a un nouveau producer avec le m\u00eame transactionalId, soit la transaction du producer a expir\u00e9 par le courtier.<\/code><\/pre>\n<p><\/p>\n<p>Pour r\u00e9soudre ce probl\u00e8me, nous ajoutons un suffixe au nom de l'application sous la forme du nom d'h\u00f4te, que nous obtenons \u00e0 partir des variables d'environnement. <\/p>\n<p><\/p>\n<p>Le Producer est configur\u00e9, mais les transactions dans Kafka ne g\u00e8rent que la port\u00e9e du message. Quel que soit le statut de la transaction, le message entre imm\u00e9diatement dans le topic, mais poss\u00e8de des attributs syst\u00e8me suppl\u00e9mentaires.<\/p>\n<p><\/p>\n<p>Pour que ces messages ne soient pas lus par le Consumer trop t\u00f4t, il doit d\u00e9finir le param\u00e8tre <strong>isolation.level<\/strong> \u00e0 la valeur read_committed. Ce Consumer pourra lire les messages non transactionnels comme auparavant, et les transactionnels uniquement apr\u00e8s engagement.<br \/>\nSi vous avez configur\u00e9 tous les param\u00e8tres \u00e9num\u00e9r\u00e9s pr\u00e9c\u00e9demment, vous avez configur\u00e9 une livraison exactement une fois. F\u00e9licitations !<\/p>\n<p><\/p>\n<p>Mais il y a une autre nuance. Le transactional.id que nous avons configur\u00e9 ci-dessus est en fait un pr\u00e9fixe de la transaction. Un num\u00e9ro de s\u00e9quence lui est ajout\u00e9 sur le gestionnaire de transactions. L'identifiant obtenu est \u00e9mis \u00e0 <strong>transactional.id.expiration.ms<\/strong>, qui est configur\u00e9 sur un cluster Kafka et a une valeur par d\u00e9faut de \u00ab 7 jours \u00bb. Si l'application ne re\u00e7oit aucun message pendant cette p\u00e9riode, alors lors de la prochaine tentative d'envoi transactionnel, vous obtiendrez <strong>InvalidPidMappingException<\/strong>. Apr\u00e8s cela, le coordinateur de transactions attribuera un nouveau num\u00e9ro de s\u00e9quence pour la prochaine transaction. Cependant, le message peut \u00eatre perdu si l'InvalidPidMappingException n'est pas correctement trait\u00e9. <\/p>\n<p><\/p>\n<h2 id=\"vmesto-itogov\">Au lieu des r\u00e9sultats<\/h2>\n<p><\/p>\n<p>Comme vous pouvez le constater, il ne suffit pas d'envoyer simplement des messages dans Kafka. Vous devez choisir une combinaison de param\u00e8tres et \u00eatre pr\u00eat \u00e0 apporter des modifications rapides. Dans cet article, j'ai essay\u00e9 de montrer en d\u00e9tail la configuration de la livraison exactly once et d\u00e9crit quelques probl\u00e8mes de configuration client.id et transactional.id que nous avons rencontr\u00e9s. Ces param\u00e8tres de Producteur et de Consommateur sont r\u00e9sum\u00e9s ci-dessous.<\/p>\n<p><\/p>\n<p>Producteur :<\/p>\n<p><\/p>\n<ol>\n<li>acks = all<\/li>\n<li>retries &gt; 0<\/li>\n<li>enable.idempotence = true<\/li>\n<li>max.in.flight.requests.per.connection \u2264 5 (1 \u2014 pour un envoi ordonn\u00e9)<\/li>\n<li>transactional.id = ${application-name}-${hostname}<\/li>\n<\/ol>\n<p><\/p>\n<p>Consommateur :<\/p>\n<p><\/p>\n<ol>\n<li>isolation.level = read_committed<\/li>\n<\/ol>\n<p><\/p>\n<p>Pour minimiser les erreurs dans les futures applications, nous avons cr\u00e9\u00e9 notre propre wrapper autour de la configuration de Spring, o\u00f9 certaines des valeurs de ces param\u00e8tres sont d\u00e9j\u00e0 d\u00e9finies.<\/p>\n<p><\/p>\n<p>Voici quelques ressources pour \u00e9tudier par vous-m\u00eame :<\/p>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/cwiki.apache.org\/confluence\/display\/KAFKA\/KIP-98+-+Exactly+Once+Delivery+and+Transactional+Messaging\">KIP-98 \u2014 Exactly Once Delivery et Messaging Transactionnel<\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/#configuration\">Description des param\u00e8tres <\/a><\/noindex><\/li>\n<\/ul>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/tinkoff\/blog\/481784\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439. \u041f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u044f \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring boot \u0438 \u0440\u0435\u0448\u0430\u044e \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0435 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0448\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0447\u0435\u0440\u0435\u0437 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0420\u0430\u043d\u0435\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 IBM MQ, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0441 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-54431","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-kafka-stala-bylyu\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-25T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:26+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Comment Kafka est devenu une r\u00e9alit\u00e9 | ProHoster","description":"Bonjour, Habr ! Je travaille dans l'\u00e9quipe Tinkoff.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-kafka-stala-bylyu","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a Kafka \u0441\u0442\u0430\u043b\u0430 \u0431\u044b\u043b\u044c\u044e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Tinkoff.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-kafka-stala-bylyu","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-25T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:26+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54431","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 11:22:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:06:37","updated":"2026-01-24 11:22:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/54431","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=54431"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/54431\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=54431"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=54431"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=54431"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}