{"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\/es\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo","title":{"rendered":"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00a1Hola, Habr!<\/p>\n<p>Recordamos que, despu\u00e9s del libro sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863410\">Kafka<\/a><\/noindex> hemos publicado una obra igualmente interesante sobre la 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=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/7d16ba31ae06a96339a0755b62454f49.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMientras la comunidad a\u00fan explora los l\u00edmites de las capacidades de esta poderosa herramienta. Recientemente se public\u00f3 un art\u00edculo con el que queremos familiarizarles. En su propia experiencia, el autor narra c\u00f3mo convertir Kafka Streams en un almac\u00e9n de datos distribuido. \u00a1Disfruten la lectura!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nLa biblioteca Apache <noindex><a rel=\"nofollow\" href=\"https:\/\/kafka.apache.org\/documentation\/streams\/\">Kafka Streams<\/a><\/noindex> se utiliza en todo el mundo en empresas para el procesamiento de flujos distribuidos sobre Apache Kafka. Uno de los aspectos infravalorados de este marco es que permite almacenar un estado local, generado a partir del procesamiento de flujos.<\/p>\n<p>En este art\u00edculo, contar\u00e9 c\u00f3mo nuestra empresa logr\u00f3 aprovechar esta posibilidad de manera rentable en el desarrollo de un producto de seguridad para aplicaciones en la nube. Con la ayuda de Kafka Streams, creamos microservicios con estado compartido, cada uno de los cuales sirve como una fuente confiable y altamente disponible de informaci\u00f3n sobre el estado de los objetos en el sistema. Para nosotros, esto representa un avance tanto en t\u00e9rminos de confiabilidad como en la facilidad de mantenimiento.<\/p>\n<p>Si te interesa un enfoque alternativo que permita utilizar una \u00fanica base de datos central para mantener el estado formal de tus objetos, sigue leyendo, ser\u00e1 interesante... <\/p>\n<p><b>Por qu\u00e9 consideramos que lleg\u00f3 el momento de cambiar nuestros enfoques sobre la gesti\u00f3n del estado compartido <\/b><\/p>\n<p>Necesit\u00e1bamos mantener el estado de varios objetos, bas\u00e1ndonos en informes de agentes (por ejemplo: \u00bfel sitio fue atacado?). Antes de cambiar a Kafka Streams, a menudo depend\u00edamos de una \u00fanica base de datos central (+ API de servicio) para gestionar el estado. Este enfoque tiene sus desventajas: en <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/collection\/all\/product\/vysokonagruzhennye-prilozheniya-programmirovanie-masshtabirovanie-podderzhka\">situaciones intensivas en datos<\/a><\/noindex> el mantenimiento de la consistencia y sincronizaci\u00f3n se convierte en un verdadero desaf\u00edo. La base de datos puede convertirse en un cuello de botella, o verse en <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/9850336\/database-race-conditions\">una condici\u00f3n de carrera<\/a><\/noindex> y sufrir impredecibilidad.<\/p>\n<p><img decoding=\"async\" alt=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/7fd4afa4d56578cf327e6391883933f1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustraci\u00f3n 1: un escenario t\u00edpico de separaci\u00f3n de estado que se experiment\u00f3 antes de la transici\u00f3n a <br \/>\nKafka y Kafka Streams: los agentes informan sus perspectivas a trav\u00e9s de una API, el estado actualizado se calcula a trav\u00e9s de una base de datos central <\/i><\/p>\n<p><b>Conozcan Kafka Streams: ahora es f\u00e1cil crear microservicios con estado compartido <\/b><\/p>\n<p>Hace aproximadamente un a\u00f1o, decidimos revisar a fondo nuestros escenarios de trabajo con estado compartido para abordar ciertos problemas. Inmediatamente decidimos probar Kafka Streams, dado lo escalable, altamente disponible y tolerante a fallos que es, y su rico conjunto de funcionalidades de flujo (transformaciones, incluidas, con estado). Justo lo que necesit\u00e1bamos, sin mencionar cu\u00e1n madura y confiable se ha vuelto la sistema de mensajer\u00eda en Kafka.<\/p>\n<p>Cada uno de los microservicios con estado que creamos se construy\u00f3 sobre una instancia de Kafka Streams con una topolog\u00eda bastante simple. Consist\u00eda en 1) una fuente, 2) un procesador con almacenamiento persistente de claves y valores, 3) un sumidero:<\/p>\n<p><img decoding=\"async\" alt=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/b6bfdbb87ef774dd914b0e4e60405ec5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustraci\u00f3n 2: la topolog\u00eda por defecto de nuestras instancias de flujo para microservicios con estado. Tenga en cuenta: aqu\u00ed tambi\u00e9n hay un almacenamiento que contiene metadatos sobre la planificaci\u00f3n. <\/i><\/p>\n<p>Con este nuevo enfoque, los agentes generan mensajes que se env\u00edan al t\u00f3pico de origen, y los consumidores \u2014 digamos, el servicio de notificaciones por correo \u2014 reciben el estado compartido calculado a trav\u00e9s del sumidero (t\u00f3pico de salida).<\/p>\n<p><img decoding=\"async\" alt=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/de60549d9cc1d5c0c473364d5236a339.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustraci\u00f3n 3: un nuevo ejemplo de flujo de tareas para un escenario con microservicios compartidos: 1) el agente genera un mensaje que llega al t\u00f3pico de origen de Kafka; 2) el microservicio con estado compartido (que utiliza Kafka Streams) lo procesa y escribe el estado calculado en el t\u00f3pico final de Kafka; despu\u00e9s, 3) los consumidores reciben el nuevo estado.<\/i><\/p>\n<p><b>\u00a1Hey, y este almacenamiento integrado de claves y valores es realmente muy \u00fatil!<\/b><\/p>\n<p>Como se mencion\u00f3 anteriormente, nuestra topolog\u00eda con estado compartido incluye un almacenamiento de claves y valores. Encontramos varias formas de utilizarlo, y dos de ellas se describen a continuaci\u00f3n.<\/p>\n<p><i><b>Opci\u00f3n #1: uso del almacenamiento de claves y valores durante los c\u00e1lculos.<\/b><\/i><\/p>\n<p>Nuestro primer almac\u00e9n de claves y valores conten\u00eda datos auxiliares que necesit\u00e1bamos para los c\u00e1lculos. Por ejemplo, en algunos casos, el estado compartido se determin\u00f3 por el principio de \"mayor\u00eda de votos\". En el almac\u00e9n pod\u00edamos mantener todos los \u00faltimos informes de los agentes sobre el estado de un determinado objeto. Luego, al recibir un nuevo informe de uno u otro agente, pod\u00edamos guardarlo, extraer del almac\u00e9n los informes de todos los dem\u00e1s agentes sobre el mismo objeto y repetir el c\u00e1lculo.<br \/>\nA continuaci\u00f3n, en la ilustraci\u00f3n 4 se muestra c\u00f3mo abrimos el acceso al almac\u00e9n de claves y valores al m\u00e9todo procesador, de modo que luego se pudiera procesar un nuevo mensaje.<\/p>\n<p><img decoding=\"async\" alt=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/8c11f9aac4c616b1ebf59d2fe5431ea0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustraci\u00f3n 4: abrimos el acceso al almac\u00e9n de claves y valores para el m\u00e9todo procesador (despu\u00e9s de esto, en cada escenario que trabaje con estado compartido, es necesario implementar el m\u00e9todo <code>doProcess<\/code>)<\/i><\/p>\n<p><i><b>Opci\u00f3n #2: crear una API CRUD sobre Kafka Streams<\/b><\/i><\/p>\n<p>Al establecer nuestro flujo b\u00e1sico de tareas, comenzamos a intentar escribir una API RESTful CRUD para nuestros microservicios con estado compartido. Quer\u00edamos poder extraer el estado de algunos o todos los objetos, as\u00ed como establecer o eliminar el estado de un objeto (lo cual es \u00fatil para mantener la parte del servidor).<\/p>\n<p>Para admitir todas las API Get State, cada vez que necesit\u00e1bamos recalcular el estado durante el procesamiento, lo almacen\u00e1bamos temporalmente en un almac\u00e9n de claves y valores incorporado. En tal caso, es bastante sencillo implementar dicha API utilizando una \u00fanica instancia de Kafka Streams, como se muestra en el listado siguiente:<\/p>\n<p><img decoding=\"async\" alt=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/614f601f7b4cf407c2b2a7826e377cbb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustraci\u00f3n 5: utilizaci\u00f3n del almac\u00e9n de claves y valores incorporado para obtener el estado precalculado de un objeto <\/i><\/p>\n<p>Actualizar el estado de un objeto a trav\u00e9s de la API tambi\u00e9n es f\u00e1cil de implementar. En principio, solo es necesario crear un productor de Kafka y, con \u00e9l, hacer una escritura que contenga el nuevo estado. Esto garantiza que todos los mensajes generados a trav\u00e9s de la API se procesen exactamente de la misma manera que los que provienen de otros productores (por ejemplo, agentes).<\/p>\n<p><img decoding=\"async\" alt=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/0b03bbafb3cf5a41164e9df85b766fcf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustraci\u00f3n 6: se puede establecer el estado de un objeto mediante un productor de Kafka <\/i><\/p>\n<p><b>Un peque\u00f1o inconveniente: Kafka tiene muchas particiones<\/b><\/p>\n<p>A continuaci\u00f3n, quer\u00edamos distribuir la carga relacionada con el procesamiento y mejorar la disponibilidad, proporcionando un cl\u00faster de microservicios con un estado compartido para cada escenario. La configuraci\u00f3n fue muy sencilla: despu\u00e9s de configurar todas las instancias para que trabajaran con el mismo ID de aplicaci\u00f3n (y los mismos servidores de arranque inicial), pr\u00e1cticamente todo lo dem\u00e1s se hac\u00eda de forma autom\u00e1tica. Tambi\u00e9n determinamos que cada t\u00f3pico de origen constar\u00eda de varias particiones, para que a cada instancia se le pudiera asignar un subconjunto de estas particiones.<\/p>\n<p>Tambi\u00e9n cabe mencionar que aqu\u00ed es habitual hacer una copia de seguridad del almacenamiento de estados, para que, en caso de recuperaci\u00f3n de fallos, esta copia se pueda mover a otra instancia. Para cada almacenamiento de estados en Kafka Streams se crea un t\u00f3pico replicable con un registro de cambios (donde se rastrean las actualizaciones locales). As\u00ed, Kafka siempre respalda el almacenamiento de estados. Por lo tanto, si una instancia de Kafka Streams falla, el almacenamiento de estados puede ser restaurado r\u00e1pidamente en otra instancia, a la que se trasladar\u00e1n las particiones correspondientes. Nuestros tests mostraron que esto se realiza en cuesti\u00f3n de segundos, incluso si el almacenamiento contiene millones de registros.<\/p>\n<p>Al pasar de un microservicio con estado compartido a un cl\u00faster de microservicios, la implementaci\u00f3n del Get State API se vuelve menos trivial. En la nueva situaci\u00f3n, el almacenamiento de estados de cada microservicio contiene solo una parte del panorama general (los objetos cuyos claves se asignan a una partici\u00f3n espec\u00edfica). Era necesario determinar en qu\u00e9 instancia se encontraba el estado del objeto que necesit\u00e1bamos, y lo hac\u00edamos bas\u00e1ndonos en los metadatos de los flujos, como se muestra a continuaci\u00f3n:<\/p>\n<p><img decoding=\"async\" alt=\"No solo procesamiento: C\u00f3mo convertimos Kafka Streams en una base de datos distribuida y qu\u00e9 result\u00f3 de ello\" src=\"\/wp-content\/uploads\/2019\/04\/7182a396869f2f9692d895fc5084cccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<i>Ilustraci\u00f3n 7: mediante metadatos de flujos, determinamos de qu\u00e9 instancia solicitar el estado del objeto requerido; este enfoque se aplic\u00f3 con el GET ALL API.<\/i><\/p>\n<p><b>Conclusiones Principales<\/b><\/p>\n<p>Los almacenes de estados en Kafka Streams pueden servir de facto como una base de datos distribuida, <\/p>\n<ul>\n<li>constantemente replicada en Kafka.<\/li>\n<li>Sobre este sistema, es f\u00e1cil construir un CRUD API. <\/li>\n<li>El procesamiento de m\u00faltiples particiones es un poco m\u00e1s complicado. <\/li>\n<li>Tambi\u00e9n es posible agregar uno o varios almacenes de estado a la topolog\u00eda de flujo para almacenar datos auxiliares. Esta opci\u00f3n se puede utilizar para:<\/li>\n<li>Almacenamiento a largo plazo de datos necesarios para c\u00e1lculos en el procesamiento de flujos <\/li>\n<li>Almacenamiento a largo plazo de datos que pueden ser \u00fatiles en la siguiente inicializaci\u00f3n de la instancia de flujo <\/li>\n<li>muchas otras cosas\u2026<\/li>\n<\/ul>\n<p>Gracias a estas y otras ventajas, Kafka Streams es ideal para soportar el estado global en un sistema distribuido como el nuestro. Kafka Streams ha demostrado ser muy confiable en producci\u00f3n (desde su implementaci\u00f3n pr\u00e1cticamente no hemos perdido mensajes), y estamos seguros de que sus capacidades no se limitan a esto.<br \/>\n<br \/>Fuente: <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.2 - 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\/es\/blog\/administrirovanie\/ne-tolko-obrabotka-kak-my-sdelali-iz-kafka-streams-raspredelennuyu-bazu-dannyh-i-chto-iz-etogo-vyshlo\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47No solo procesamiento: C\u00f3mo hicimos de Kafka Streams una base de datos distribuida, y qu\u00e9 resultados obtuvimos | ProHoster","description":"\u00a1Hola, Habr! Recordamos que, tras el libro sobre Kafka, hemos lanzado una obra igualmente interesante sobre la biblioteca","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/32632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=32632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/32632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/24423"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=32632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=32632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=32632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}