{"id":32632,"date":"2019-10-31T21:48:08","date_gmt":"2019-10-31T18:48:08","guid":{"rendered":"https:\/\/prohoster.info\/blog\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\/"},"modified":"2019-10-31T21:48:08","modified_gmt":"2019-10-31T18:48:08","slug":"ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1, Habr!<\/p>\n<p>Lembramos que, ap\u00f3s o livro sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> lan\u00e7amos um trabalho igualmente interessante sobre a biblioteca <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/new\/product\/kafka-streams-v-deystvii-prilozheniya-i-mikroservisy-dlya-raboty-v-realnom-vremeni\">Kafka Streams API<\/a><\/noindex>. <\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEnquanto a comunidade apenas come\u00e7a a explorar os limites das capacidades desta poderosa ferramenta. Recentemente, foi publicado um artigo que gostar\u00edamos de apresent\u00e1-lo. A partir de sua pr\u00f3pria experi\u00eancia, o autor conta como fazer do Kafka Streams um armazenamento de dados distribu\u00eddo. Boa leitura!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nA biblioteca Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> \u00e9 utilizada em todo o mundo no setor de empresas para processamento de fluxo distribu\u00eddo sobre o Apache Kafka. Um dos aspectos subestimados deste framework \u00e9 que ele permite manter um estado local, gerado a partir do processamento de fluxo.<\/p>\n<p>Neste artigo, contarei como a nossa empresa conseguiu utilizar essa capacidade de maneira vantajosa no desenvolvimento de um produto para seguran\u00e7a de aplica\u00e7\u00f5es em nuvem. Com o Kafka Streams, criamos microsservi\u00e7os com estado compartilhado, cada um dos quais serve como uma fonte resistente a falhas e altamente dispon\u00edvel de informa\u00e7\u00f5es confi\u00e1veis sobre o estado dos objetos no sistema. Para n\u00f3s, isso representa um avan\u00e7o tanto em termos de confiabilidade quanto em termos de facilidade de suporte.<\/p>\n<p>Se voc\u00ea est\u00e1 interessado em uma abordagem alternativa que permita usar um \u00fanico banco de dados central para manter o estado formal de seus objetos \u2013 leia, ser\u00e1 interessante... <\/p>\n<p><b>Por que decidimos que era hora de mudar nossas abordagens em rela\u00e7\u00e3o ao trabalho com estado compartilhado <\/b><\/p>\n<p>Precis\u00e1vamos manter o estado de v\u00e1rios objetos, baseando-nos em relat\u00f3rios de agentes (por exemplo: o site foi atacado?). Antes da transi\u00e7\u00e3o para o Kafka Streams, costum\u00e1vamos depender de um \u00fanico banco de dados central (+ API de servi\u00e7o) para gerenciar o estado. Essa abordagem tem suas desvantagens: em <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">situa\u00e7\u00f5es intensivas em dados<\/a><\/noindex> a manuten\u00e7\u00e3o da consist\u00eancia e sincroniza\u00e7\u00e3o se torna um verdadeiro desafio. O banco de dados pode se tornar um gargalo, ou acabar em <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">um estado de corrida<\/a><\/noindex> e sofrer de imprevisibilidade.<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u00e7\u00e3o 1: um cen\u00e1rio t\u00edpico de divis\u00e3o de estado, encontrado antes da transi\u00e7\u00e3o para <br \/>\nKafka e Kafka Streams: os agentes comunicam suas representa\u00e7\u00f5es atrav\u00e9s da API, o estado atualizado \u00e9 calculado atrav\u00e9s do banco de dados central <\/i><\/p>\n<p><b>Conhe\u00e7a o Kafka Streams \u2013 agora \u00e9 f\u00e1cil criar microsservi\u00e7os com estado compartilhado <\/b><\/p>\n<p>Cerca de um ano atr\u00e1s, decidimos revisar nossos cen\u00e1rios de trabalho com estado compartilhado para resolver alguns problemas. Imediatamente decidimos experimentar o Kafka Streams \u2013 \u00e9 bem conhecido o qu\u00e3o escal\u00e1vel, dispon\u00edvel e resistente a falhas ele \u00e9, al\u00e9m do rico conjunto de funcionalidades de streaming (transforma\u00e7\u00f5es, incluindo aquelas com estado preservado). Era exatamente o que precis\u00e1vamos, sem mencionar o qu\u00e3o madura e confi\u00e1vel a sistema de troca de mensagens se tornou no Kafka.<\/p>\n<p>Cada um dos microservi\u00e7os que criamos com estado preservado foi constru\u00eddo com base em uma inst\u00e2ncia do Kafka Streams com uma topologia bastante simples. Ela consistia em 1) uma fonte 2) um processador com armazenamento persistente de chaves e valores 3) um fluxo:<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u00e7\u00e3o 2: a topologia padr\u00e3o de nossas inst\u00e2ncias de streaming para microservi\u00e7os com estado preservado. Observe que tamb\u00e9m h\u00e1 um armazenamento aqui, onde est\u00e3o os metadados sobre o planejamento. <\/i><\/p>\n<p>Com essa nova abordagem, os agentes comp\u00f5em mensagens que s\u00e3o enviadas ao t\u00f3pico de origem, e os consumidores \u2013 digamos, o servi\u00e7o de notifica\u00e7\u00f5es por e-mail \u2013 recebem o estado compartilhado calculado atrav\u00e9s do fluxo (t\u00f3pico de sa\u00edda).<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u00e7\u00e3o 3: um novo exemplo do fluxo de tarefas para o cen\u00e1rio com microservi\u00e7os compartilhados: 1) um agente gera uma mensagem que chega ao t\u00f3pico de origem do Kafka; 2) o microservi\u00e7o com estado compartilhado (usando Kafka Streams) processa ela e grava o estado calculado no t\u00f3pico final do Kafka; ap\u00f3s isso, 3) os consumidores recebem o novo estado.<\/i><\/p>\n<p><b>Ei, esse armazenamento interno de chaves e valores realmente \u00e9 muito \u00fatil!<\/b><\/p>\n<p>Como mencionado acima, nossa topologia com estado compartilhado cont\u00e9m um armazenamento de chaves e valores. Encontramos v\u00e1rias op\u00e7\u00f5es para sua utiliza\u00e7\u00e3o, e duas delas est\u00e3o descritas abaixo.<\/p>\n<p><i><b>Op\u00e7\u00e3o #1: uso do armazenamento de chaves e valores em c\u00e1lculos.<\/b><\/i><\/p>\n<p>O nosso primeiro armazenamento de chave-valor continha dados auxiliares necess\u00e1rios para nossos c\u00e1lculos. Por exemplo, em alguns casos, o estado compartilhado era determinado pelo princ\u00edpio da \"maioria dos votos\". No armazenamento, pod\u00edamos manter todos os relat\u00f3rios mais recentes dos agentes sobre o estado de um determinado objeto. Assim, ao receber um novo relat\u00f3rio de um dos agentes, pod\u00edamos salv\u00e1-lo, extrair do armazenamento os relat\u00f3rios de todos os outros agentes sobre o mesmo objeto e repetir os c\u00e1lculos.<br \/>\nAbaixo, na Ilustra\u00e7\u00e3o 4, mostramos como abrimos o acesso ao armazenamento de chave-valor para o m\u00e9todo processador, permitindo assim que uma nova mensagem pudesse ser processada.<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u00e7\u00e3o 4: abrindo acesso ao armazenamento de chave-valor para o m\u00e9todo processador (depois disso, em cada cen\u00e1rio que lida com estado compartilhado, \u00e9 necess\u00e1rio implementar o m\u00e9todo <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Op\u00e7\u00e3o #2: cria\u00e7\u00e3o de uma API CRUD sobre Kafka Streams<\/b><\/i><\/p>\n<p>Ap\u00f3s configurar nosso fluxo b\u00e1sico de tarefas, come\u00e7amos a tentar escrever uma API RESTful CRUD para nossos microsservi\u00e7os que lidam com estado compartilhado. Quer\u00edamos que fosse poss\u00edvel extrair o estado de alguns ou todos os objetos, al\u00e9m de definir ou remover o estado de um objeto (isso \u00e9 \u00fatil para a manuten\u00e7\u00e3o do backend).<\/p>\n<p>Para suportar toda a API Get State, sempre que precis\u00e1vamos recomputar o estado durante o processamento, armazen\u00e1vamos temporariamente no armazenamento integrado de chave-valor. Nesse caso, \u00e9 bastante simples implementar essa API usando uma \u00fanica inst\u00e2ncia do Kafka Streams, como mostrado no listagem abaixo:<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u00e7\u00e3o 5: utilizando o armazenamento integrado de chave-valor para obter o estado pr\u00e9-computado de um objeto <\/i><\/p>\n<p>A atualiza\u00e7\u00e3o do estado do objeto atrav\u00e9s da API tamb\u00e9m n\u00e3o \u00e9 dif\u00edcil de implementar. Basicamente, para isso, \u00e9 necess\u00e1rio apenas criar um produtor Kafka e, com ele, fazer uma grava\u00e7\u00e3o que contenha o novo estado. Isso garante que todas as mensagens geradas atrav\u00e9s da API sejam processadas exatamente da mesma forma que aquelas provenientes de outros produtores (por exemplo, agentes).<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u00e7\u00e3o 6: o estado do objeto pode ser definido com um produtor Kafka <\/i><\/p>\n<p><b>Um pequeno complicador: o Kafka possui v\u00e1rias parti\u00e7\u00f5es<\/b><\/p>\n<p>Continuando, quer\u00edamos distribuir a carga relacionada ao processamento e melhorar a disponibilidade, fornecendo para cada cen\u00e1rio um cluster de microsservi\u00e7os com estado compartilhado. A configura\u00e7\u00e3o foi extremamente simples: depois que configuramos todas as inst\u00e2ncias para que funcionassem com o mesmo ID de aplicativo (e com os mesmos servidores de inicializa\u00e7\u00e3o), praticamente todo o resto ocorreu automaticamente. Tamb\u00e9m especificamos que cada t\u00f3pico de origem consistiria em v\u00e1rias parti\u00e7\u00f5es, para que cada inst\u00e2ncia pudesse ser atribu\u00edda a um subconjunto dessas parti\u00e7\u00f5es.<\/p>\n<p>Tamb\u00e9m gostaria de mencionar que, aqui, \u00e9 comum fazer backup do armazenamento de estados, para que, por exemplo, em caso de recupera\u00e7\u00e3o de falhas, esse backup possa ser transferido para outra inst\u00e2ncia. Para cada armazenamento de estados no Kafka Streams, \u00e9 criado um t\u00f3pico replic\u00e1vel com um log de altera\u00e7\u00f5es (onde as atualiza\u00e7\u00f5es locais s\u00e3o rastreadas). Assim, o Kafka constantemente protege o armazenamento dos estados. Portanto, em caso de falha de alguma inst\u00e2ncia do Kafka Streams, o armazenamento de estados pode ser rapidamente restaurado em outra inst\u00e2ncia, para onde as parti\u00e7\u00f5es correspondentes ser\u00e3o transferidas. Nossos testes mostraram que isso \u00e9 feito em quest\u00e3o de segundos, mesmo que existam milh\u00f5es de registros no armazenamento.<\/p>\n<p>Ao passar de um microsservi\u00e7o com estado compartilhado para um cluster de microsservi\u00e7os, n\u00e3o \u00e9 trivial implementar a API Get State. Na nova situa\u00e7\u00e3o, o armazenamento de estados de cada microsservi\u00e7o cont\u00e9m apenas uma parte do todo (os objetos cujas chaves foram mapeadas para uma parti\u00e7\u00e3o espec\u00edfica). Precis\u00e1vamos determinar em qual inst\u00e2ncia estava o estado do objeto que precis\u00e1vamos, e fizemos isso com base nos metadados dos fluxos, conforme mostrado abaixo:<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o apenas processamento: Como transformamos Kafka Streams em um banco de dados distribu\u00eddo e o que aconteceu com isso\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustra\u00e7\u00e3o 7: usando metadados de fluxos, determinamos de qual inst\u00e2ncia solicitar o estado do objeto desejado; essa abordagem foi aplicada com a GET ALL API.<\/i><\/p>\n<p><b>Principais Conclus\u00f5es<\/b><\/p>\n<p>Os armazenamentos de estados no Kafka Streams podem, de fato, servir como um banco de dados distribu\u00eddo. <\/p>\n<ul>\n<li>constantemente replicado no Kafka<\/li>\n<li>Sobre esse sistema, \u00e9 f\u00e1cil construir uma API CRUD. <\/li>\n<li>O processamento de m\u00faltiplas parti\u00e7\u00f5es se torna um pouco mais complicado. <\/li>\n<li>Tamb\u00e9m \u00e9 poss\u00edvel adicionar um ou mais armazenamentos de estado \u00e0 topologia de streaming para armazenar dados auxiliares. Essa op\u00e7\u00e3o pode ser utilizada para:<\/li>\n<li>O armazenamento a longo prazo de dados necess\u00e1rios para c\u00e1lculos durante o processamento de streaming. <\/li>\n<li>O armazenamento a longo prazo de dados que podem ser \u00fateis na pr\u00f3xima inicializa\u00e7\u00e3o da inst\u00e2ncia de streaming. <\/li>\n<li>muitas outras\u2026<\/li>\n<\/ul>\n<p>Gra\u00e7as a essas e outras qualidades, o Kafka Streams \u00e9 uma excelente escolha para suportar o estado global em um sistema distribu\u00eddo como o nosso. O Kafka Streams tem se mostrado bastante confi\u00e1vel em produ\u00e7\u00e3o (desde sua implanta\u00e7\u00e3o, praticamente n\u00e3o perdemos mensagens), e temos certeza de que suas capacidades n\u00e3o se limitam a isso!<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/piter\/blog\/449928\/\">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! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 Kafka Streams API. \u041f\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0449\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0422\u0430\u043a, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u044b\u0448\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u0441 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u0430\u0441 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c. \u041d\u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u0440\u0438\u044f\u0442\u043d\u043e\u0433\u043e \u0447\u0442\u0435\u043d\u0438\u044f! [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24423,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32632","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435\" \/>\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\/pt\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\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\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\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-10-31T18:48:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:48:08+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\udd47N\u00e3o apenas processamento: Como transformamos o Kafka Streams em um banco de dados distribu\u00eddo e o que saiu disso | ProHoster","description":"Ol\u00e1, Habr! Lembramos que, ap\u00f3s o livro sobre Kafka, lan\u00e7amos uma obra igualmente interessante sobre a biblioteca","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\u041d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430: \u041a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u0437 Kafka Streams \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0448\u043b\u043e | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043a\u043d\u0438\u0433\u043e\u0439 \u043e Kafka \u043c\u044b \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0442\u0440\u0443\u0434 \u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","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-10-31T18:48:08+00:00","article:modified_time":"2019-10-31T18:48:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32632","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-21 11:51:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:55:24","updated":"2026-01-21 11:51:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}