{"id":38322,"date":"2026-10-14T11:36:17","date_gmt":"2026-10-14T14:36:17","guid":{"rendered":"https:\/\/building.nu.com\/?p=38322"},"modified":"2026-10-14T14:08:54","modified_gmt":"2026-10-14T17:08:54","slug":"feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank","status":"publish","type":"post","link":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/","title":{"rendered":"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Escrito por: <a href=\"mailto:felipe.almeida@nubank.com.br\">Felipe Almeida<\/a>, com contribui\u00e7\u00f5es de <a href=\"mailto:luiz.felix@nubank.com.br\">Luiz Felix<\/a>, <a href=\"mailto:vivian.miranda@nubank.com.br\">V\u00edvian Miranda<\/a>, <a href=\"mailto:lucas.nolasco@nubank.com.br\">Lucas Nolasco<\/a> e <a href=\"mailto:caroline.custodio@nubank.com.br\">Caroline Custodio<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Esta \u00e9 a parte 3 de uma s\u00e9rie de 3 partes sobre Feature Stores para ML em tempo real. Veja a<\/strong> <a href=\"https:\/\/building.nu.com\/feature-stores-for-real-time-ml-why-and-when-to-centralize-feature-logic\/\"><strong>parte 1<\/strong><\/a> <strong>e a<\/strong> <a href=\"http:\/\/building.nubank.com\/feature-stores-for-real-time-ml-part-2-lessons-learned-from-production\/\"><strong>parte 2<\/strong><\/a><strong>.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Breve recapitula\u00e7\u00e3o e introdu\u00e7\u00e3o<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Na <a href=\"https:\/\/building.nu.com\/feature-stores-for-real-time-ml-why-and-when-to-centralize-feature-logic\/\">parte 1<\/a> desta s\u00e9rie, descrevemos o que s\u00e3o feature stores e por que elas fazem sentido quando uma organiza\u00e7\u00e3o orientada a dados atinge um certo n\u00edvel de maturidade, especialmente ao usar sistemas em tempo real habilitados por ML. Na <a href=\"https:\/\/building.nu.com\/feature-stores-for-real-time-ml-part-2-lessons-learned-from-production\/\">parte 2<\/a>, listamos as li\u00e7\u00f5es que aprendemos ao aplicar conceitos de feature store a problemas reais no Nubank.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nas pr\u00f3ximas se\u00e7\u00f5es, vamos apresentar alguns padr\u00f5es arquiteturais concretos que implementamos. Alguns deles s\u00e3o o que poder\u00edamos chamar de uma feature store completa (com defini\u00e7\u00f5es de features comuns para os caminhos de treinamento e de serving, por exemplo), enquanto outros focam em resolver apenas um problema espec\u00edfico.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Features pr\u00e9-computadas a partir de dados em batch, materializadas em uma camada de serving chave-valor<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nesta variante, produzimos um dataset <strong>totalmente desnormalizado<\/strong> (com todas as features de cada entidade combinadas em uma \u00fanica linha) como parte dos nossos jobs noturnos de <em><\/em>ETL\/ELT e o disponibilizamos em uma \u201ccamada de serving\u201d (por exemplo, DynamoDB), indexado pelo ID, para ser usado em tempo de infer\u00eancia. Isso pode ser visto na Figura 1:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"583\" data-attachment-id=\"38326\" data-permalink=\"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/image-90\/\" data-orig-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?fit=2048%2C1165&amp;ssl=1\" data-orig-size=\"2048,1165\" data-comments-opened=\"1\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?fit=1024%2C583&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?resize=1024%2C583&#038;ssl=1\" alt=\"\" class=\"wp-image-38326\" style=\"aspect-ratio:1.75793991416309;width:2048px;height:auto\" srcset=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?resize=1024%2C583&amp;ssl=1 1024w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?resize=300%2C171&amp;ssl=1 300w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?resize=768%2C437&amp;ssl=1 768w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?resize=1536%2C874&amp;ssl=1 1536w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-9.png?w=2048&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><em>Figura 1:<\/em><\/strong> <em>Nesta estrat\u00e9gia, uma etapa extra \u00e9 adicionada aos jobs noturnos de ETL\/ELT: produzir um dataset, indexado pelo ID da entidade (por exemplo, ID do cliente, ID da conta), em que cada coluna \u00e9 o valor de uma feature para aquela entidade. Em seguida, esse snapshot \u00e9 enviado para um armazenamento chave-valor (KV) de baixa lat\u00eancia, como DynamoDB ou Redis. Em tempo de serving, o modelo de ML em tempo real vai&nbsp; recuperar uma \u00fanica linha desse armazenamento, j\u00e1 que ele \u00e9 totalmente desnormalizado. Isso \u00e9 r\u00e1pido e f\u00e1cil.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esse costuma ser o primeiro \u201cpadr\u00e3o\u201d de feature store para o qual muitas empresas convergem, muitas vezes sem saber que se trata de uma feature store. Ele \u00e9 baseado na <a href=\"https:\/\/en.wikipedia.org\/wiki\/Lambda_architecture\"><em>arquitetura lambda<\/em><\/a> (sem a speed layer).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c9 um caso de uso simples, mas bastante poderoso:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u00c9 barato e f\u00e1cil:<\/strong> N\u00e3o s\u00e3o necess\u00e1rias habilidades especializadas de engenharia de machine learning para usar isso em produ\u00e7\u00e3o; quem construiu o dataset de treinamento (por exemplo, cientistas de dados) pode construir o dataset da camada de serving, enquanto os engenheiros que fazem o deploy do modelo s\u00f3 precisam de uma \u00fanica requisi\u00e7\u00e3o para buscar v\u00e1rias features de uma vez.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N\u00e3o haver\u00e1 <strong>training-serving skew \u201cinduzido por l\u00f3gica\u201d<\/strong> se o treinamento e o serving reutilizarem a mesma l\u00f3gica de c\u00e1lculo de features do data lake, mas ainda pode haver skew devido a atrasos ou falhas nas execu\u00e7\u00f5es de ETL.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>A lat\u00eancia de recupera\u00e7\u00e3o \u00e9 muito baixa<\/strong> porque \u00e9 uma simples busca por chave, retornando uma \u00fanica linha.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A principal desvantagem \u00e9 que os <strong>valores das features servidos em tempo de infer\u00eancia estar\u00e3o desatualizados<\/strong>, pois s\u00e3o um snapshot da \u00faltima vez em que os jobs de ETL\/ELT rodaram (e n\u00e3o uma representa\u00e7\u00e3o do mundo como ele \u00e9 <em>agora<\/em>). Portanto, \u00e9 preciso considerar quando cada snapshot de fato teria ficado dispon\u00edvel ao construir o dataset de treinamento, para evitar vazamento de dados (snapshots n\u00e3o ficam dispon\u00edveis instantaneamente; podem levar horas e \u00e0s vezes falham).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como acontece com todas as estrat\u00e9gias de implementa\u00e7\u00e3o de features \u201cshift-left\u201d, isso pode ficar caro, porque voc\u00ea pr\u00e9-computa features para <em>todas<\/em> as entidades (por exemplo, clientes, contas), mesmo que apenas uma minoria delas precise ser escorada em um determinado dia.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Features tabulares on-demand via Flink e Pinot<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Features on-demand s\u00e3o calculadas em tempo de serving, em vez de pr\u00e9-computadas com anteced\u00eancia. Isso \u00e9 \u00fatil quando os modelos precisam das informa\u00e7\u00f5es mais atualizadas e pr\u00e9-computar features para entidades que talvez nunca as usem seria um desperd\u00edcio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Elas podem aumentar a lat\u00eancia se n\u00e3o tomarmos precau\u00e7\u00f5es, mas h\u00e1 vantagens claras:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>S\u00e3o o mais pr\u00f3ximo que conseguimos chegar de features verdadeiramente online quando precisamos calcular agrega\u00e7\u00f5es em tempo de infer\u00eancia<\/li>\n\n\n\n<li>S\u00f3 s\u00e3o calculadas quando realmente s\u00e3o usadas (ao contr\u00e1rio das features pr\u00e9-computadas, que s\u00e3o materializadas para toda a base de clientes, caso venham a ser necess\u00e1rias)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Uma das estrat\u00e9gias que usamos para features on-demand \u00e9 a de <em>escrita dupla (dual-write)<\/em>, na qual microsservi\u00e7os transacionais escrevem eventos tanto no caminho offline (arquivos Parquet no S3) quanto no caminho online (um app Apache Flink e depois o Pinot), como podemos ver na Figura 2 abaixo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"583\" data-attachment-id=\"38323\" data-permalink=\"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/image-89\/\" data-orig-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?fit=2048%2C1165&amp;ssl=1\" data-orig-size=\"2048,1165\" data-comments-opened=\"1\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?fit=1024%2C583&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?resize=1024%2C583&#038;ssl=1\" alt=\"\" class=\"wp-image-38323\" style=\"aspect-ratio:1.75793991416309;width:2048px;height:auto\" srcset=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?resize=1024%2C583&amp;ssl=1 1024w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?resize=300%2C171&amp;ssl=1 300w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?resize=768%2C437&amp;ssl=1 768w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?resize=1536%2C874&amp;ssl=1 1536w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-8.png?w=2048&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><em>Figura 2:<\/em><\/strong> <em>Todo evento comportamental \u00e9 roteado para o caminho offline e para o caminho online. Isso ajuda a reduzir o training-serving skew neste caso, mas a l\u00f3gica de agrega\u00e7\u00e3o ainda \u00e9 diferente no caminho offline (geralmente jobs Spark) e no caminho online (queries SQL no Pinot).<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">No <strong>caminho de escrita<\/strong>, a estrat\u00e9gia de escrita dupla acima tem o objetivo de enviar os mesmos eventos para os armazenamentos offline e online. Isso \u00e9 importante para reduzir o <a href=\"https:\/\/building.nubank.com\/dealing-with-train-serve-skew-in-real-time-ml-models-a-short-guide\/\">training-serving skew<\/a> (mas n\u00e3o para elimin\u00e1-lo, porque ainda pode haver atrasos e eventos faltantes). Al\u00e9m disso, a l\u00f3gica de agrega\u00e7\u00e3o em batch (usada no treinamento) e as queries usadas em tempo de serving s\u00e3o artefatos diferentes. Por esse motivo, o monitoramento de skew continua sendo necess\u00e1rio.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">O <strong>caminho de leitura<\/strong> consome os dados produzidos pelo caminho de escrita (Figura 2). Ele tem dois ramos: um para treinamento e outro para serving.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A l\u00f3gica de tempo de treinamento geralmente \u00e9 escrita como jobs de processamento em batch, pois envolve joins e agrega\u00e7\u00f5es pesadas sobre horizontes de tempo longos. A l\u00f3gica de tempo de serving \u00e9 uma query SQL executada em tempo real em um banco de dados de processamento anal\u00edtico online (OLAP) em tempo real, como o Apache Pinot, como pode ser visto na Figura 3 abaixo. Isso faz parte da nossa stack \u201cAvalanche\u201d, sobre a qual escrevemos <a href=\"https:\/\/building.nu.com\/avalanche-stack-and-real-time-streaming-applications-at-nu\/\">neste post do blog<\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"583\" data-attachment-id=\"38328\" data-permalink=\"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/image-91\/\" data-orig-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?fit=2048%2C1165&amp;ssl=1\" data-orig-size=\"2048,1165\" data-comments-opened=\"1\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?fit=1024%2C583&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?resize=1024%2C583&#038;ssl=1\" alt=\"\" class=\"wp-image-38328\" style=\"aspect-ratio:1.75793991416309;width:2048px;height:auto\" srcset=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?resize=1024%2C583&amp;ssl=1 1024w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?resize=300%2C171&amp;ssl=1 300w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?resize=768%2C437&amp;ssl=1 768w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?resize=1536%2C874&amp;ssl=1 1536w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-10.png?w=2048&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><em>Figura 3:<\/em><\/strong> <em>Em tempo de treinamento, constru\u00edmos o dataset de treinamento a partir de um spine (um dataset com IDs de entidades e timestamps de refer\u00eancia) e do event store, por meio de um job Spark. Em tempo de serving, executamos a agrega\u00e7\u00e3o em tempo real, com uma query SQL comum, em um backend de banco de dados Pinot.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A query SQL enviada ao Pinot \u00e9 uma query de agrega\u00e7\u00e3o. Aqui est\u00e1 um exemplo da query que usar\u00edamos para recuperar o n\u00famero de vezes que um determinado cliente abriu o app nas \u00faltimas 2 horas:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">SELECT<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;customer_identifier,<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;count(DISTINCT event_timestamp) AS app_opened__last_2h__count<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FROM clickstream_table<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WHERE type = &#8216;app_opened&#8217;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;AND customer_identifier = &#8216;{{customer_identifier}}&#8217;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;AND event_timestamp &gt;= AGO(&#8216;PT2H&#8217;)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GROUP BY customer_identifier<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Alguns pontos para tornar isso vi\u00e1vel na nossa escala:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Sem joins:<\/strong> Normalmente n\u00e3o fazemos nenhum join em tempo de serving (apenas agrega\u00e7\u00f5es group-by na mesma tabela). Se precisamos de mais dados na tabela, geralmente os enriquecemos na camada do Flink (para n\u00e3o precisarmos de joins custosos em tempo de query)<\/li>\n\n\n\n<li><strong>TTL agressivo:<\/strong> Devido \u00e0 nossa escala, aplicamos um time to live (TTL) aos eventos no Pinot, para que o tamanho do banco de dados n\u00e3o cres\u00e7a demais.\n<ul class=\"wp-block-list\">\n<li>Portanto, buscamos apenas dados de curt\u00edssimo prazo (por exemplo, os \u00faltimos dias) no Pinot. Se precisamos de features de prazo mais longo (por exemplo, agrega\u00e7\u00f5es do \u00faltimo ano), n\u00f3s as pr\u00e9-computamos a partir de dados em batch, pois \u00e9 mais f\u00e1cil, r\u00e1pido e barato recuper\u00e1-las de um snapshot defasado calculado diariamente.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Evitar mudan\u00e7as de schema:<\/strong> Mudan\u00e7as de schema s\u00e3o um problema. Uma solu\u00e7\u00e3o \u00e9 ter campos string com conte\u00fado JSON, j\u00e1 que a estrutura do JSON pode evoluir sem alterar o schema da tabela (as mudan\u00e7as ainda precisam permanecer retrocompat\u00edveis para os consumidores existentes).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Uma vantagem secund\u00e1ria dessa abordagem \u00e9 que qualquer outro time pode usar os eventos que um time salva: toda a l\u00f3gica da feature est\u00e1 contida na query, ent\u00e3o v\u00e1rios times podem compartilhar o banco de dados Pinot e rodar queries diferentes nele.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Isso n\u00e3o \u00e9 uma feature store completa;<\/strong> usamos essa configura\u00e7\u00e3o apenas para suportar o caminho de serving de features online. O c\u00f3digo de treinamento est\u00e1 em um caminho totalmente diferente, e por isso precisamos continuar monitorando o training-serving skew.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Usando uma arquitetura de materializa\u00e7\u00e3o e serving em dois est\u00e1gios baseada em Flink<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nesta estrat\u00e9gia, os eventos comportamentais fluem por dois apps Flink, um ap\u00f3s o outro (Flink app #1 e Flink app #2, como pode ser visto na Figura 4 abaixo). Isso \u00e9 \u00fatil quando os modelos precisam de features atualizadas, mas calcul\u00e1-las em tempo de serving adicionaria lat\u00eancia demais:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"583\" data-attachment-id=\"38332\" data-permalink=\"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/image-92\/\" data-orig-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?fit=2048%2C1165&amp;ssl=1\" data-orig-size=\"2048,1165\" data-comments-opened=\"1\" data-image-title=\"image\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?fit=1024%2C583&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?resize=1024%2C583&#038;ssl=1\" alt=\"\" class=\"wp-image-38332\" style=\"aspect-ratio:1.75793991416309;width:2048px;height:auto\" srcset=\"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?resize=1024%2C583&amp;ssl=1 1024w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?resize=300%2C171&amp;ssl=1 300w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?resize=768%2C437&amp;ssl=1 768w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?resize=1536%2C874&amp;ssl=1 1536w, https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/image-11.png?w=2048&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size wp-block-paragraph\"><strong><em>Figura 4:<\/em><\/strong> <em>Neste exemplo, todo novo evento \u201cpurchase-requested\u201d \u00e9 transmitido pelo Flink app #1, e uma contagem cont\u00ednua das \u00faltimas 24 horas para cada cliente \u00e9 mantida no Flink app #2 e ent\u00e3o enviada via upsert ao DynamoDB. Sempre que qualquer modelo em tempo real precisa dessa informa\u00e7\u00e3o, basta chamar o DynamoDB passando o ID do cliente e o nome do feature set para recuperar a contagem materializada mais recente daquele cliente.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Flink app #1<\/strong> escuta eventos comportamentais (logs de CDC de bancos de dados transacionais e eventos brutos do Kafka), combina dados de v\u00e1rios shards em um \u00fanico stream, filtra eventos indesejados e normaliza nomes e schemas. Nenhum estado \u00e9 mantido neste primeiro app.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Flink app #2<\/strong> escuta os eventos do primeiro app e mant\u00e9m <em>algum<\/em> estado, guardando todos os eventos de cada cliente, com um TTL de 24 horas. Quando um novo evento entra no app #2, todas as features relacionadas s\u00e3o recalculadas e uma nova linha \u00e9 enviada via upsert para uma tabela do DynamoDB (indexada por um ID de entidade, como o ID do cliente).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Essa estrat\u00e9gia depende da pr\u00e9-computa\u00e7\u00e3o de features, ent\u00e3o sua lat\u00eancia em tempo de serving \u00e9 muito baixa (j\u00e1 que \u00e9 uma simples busca). Assim como no primeiro exemplo deste artigo, o trade-off \u00e9 que a maioria das features ser\u00e1 calculada para clientes que nunca precisar\u00e3o delas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Como no exemplo anterior, essa configura\u00e7\u00e3o cobre apenas o caminho de serving, ent\u00e3o n\u00e3o \u00e9 uma feature store completa. O c\u00f3digo de treinamento roda em Spark, ent\u00e3o pode haver skew induzido por l\u00f3gica, que precisa ser monitorado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pr\u00f3ximos passos<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m de melhorar constantemente nossa configura\u00e7\u00e3o e aprender novas li\u00e7\u00f5es, h\u00e1 pelo menos outras duas frentes que estamos explorando atualmente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Pipelines Feldera:<\/strong> Recentemente, temos experimentado uma ferramenta chamada <a href=\"https:\/\/github.com\/feldera\/feldera\">Feldera<\/a>. Os pipelines do Feldera suportam manuten\u00e7\u00e3o incremental de views, o que significa que features baseadas em agrega\u00e7\u00e3o (sum, count, avg etc.) s\u00e3o atualizadas em tempo real \u00e0 medida que novos eventos chegam, sem recalcular toda a agrega\u00e7\u00e3o do zero a cada vez).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Al\u00e9m disso, o Feldera pode nos permitir unificar a l\u00f3gica de features para treinamento e serving, reduzindo problemas de training-serving skew e aproximando o Nubank de uma feature store em tempo real completa e para toda a empresa.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Features sequenciais:<\/strong> Embora a maioria dos exemplos desta s\u00e9rie envolva features tabulares, tamb\u00e9m temos usado features sequenciais em <a href=\"https:\/\/building.nu.com\/presenting-precog-nubanks-real-time-event-ai\/\">diversos<\/a> <a href=\"https:\/\/building.nu.com\/behavior-modeling-with-sequential-architectures-exploring-lstms-in-machine-learning\/\">casos<\/a> <a href=\"https:\/\/building.nu.com\/unlocking-financial-insights-how-nubank-powers-personalized-experiences-with-foundation-models\/\">de uso<\/a>, desde 2023.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Features sequenciais destravam muito valor, especialmente em redes neurais, mas tamb\u00e9m introduzem complexidade extra e novos modos de falha; descobrir como integr\u00e1-las \u00e0s nossas plataformas de features <strong>em tempo real<\/strong> \u00e9 um desafio em andamento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclus\u00e3o<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Neste post, apresentamos alguns padr\u00f5es arquiteturais que usamos no Nubank para disponibilizar features para modelos de ML em tempo real.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Features em batch<\/strong> s\u00e3o simples e baratas e n\u00e3o devem ser negligenciadas, mesmo quando isso significa que o modelo em tempo real usar\u00e1 informa\u00e7\u00f5es ligeiramente desatualizadas.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Decidir entre <strong>pr\u00e9-computar<\/strong> features ou calcul\u00e1-las <strong>on-demand<\/strong> \u00e9 um dos principais trade-offs ao pensar em feature stores. Casos de uso diferentes pedem abordagens diferentes. Uma boa feature store deve suportar ambas.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Unificar os <strong>caminhos de defini\u00e7\u00e3o de features de treinamento e de serving<\/strong> \u00e9 dif\u00edcil e, embora n\u00e3o resolva completamente o training-serving skew, o mitiga substancialmente.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Isso encerra nossa s\u00e9rie de 3 partes sobre feature stores para ML em tempo real no Nubank. N\u00e3o deixe de ler as partes <a href=\"https:\/\/building.nu.com\/feature-stores-for-real-time-ml-why-and-when-to-centralize-feature-logic\/\">1<\/a> e <a href=\"https:\/\/building.nu.com\/feature-stores-for-real-time-ml-part-2-lessons-learned-from-production\/\">2<\/a>&nbsp; e fique de olho em outros posts sobre o tema, j\u00e1 que \u00e9 algo em que estamos trabalhando ativamente!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Escrito por: Felipe Almeida, com contribui\u00e7\u00f5es de Luiz Felix, V\u00edvian Miranda, Lucas Nolasco e Caroline Custodio. Esta \u00e9 a parte 3 de uma s\u00e9rie de 3 partes sobre Feature Stores para ML em tempo real. Veja a parte 1 e a parte 2. Breve recapitula\u00e7\u00e3o e introdu\u00e7\u00e3o Na parte 1 desta s\u00e9rie, descrevemos o que [&hellip;]<\/p>\n","protected":false},"author":178110103,"featured_media":38302,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_eb_attr":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[2502],"tags":[],"class_list":["post-38322","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-science-machine-learning-pt-br"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank - Building Nubank<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank - Building Nubank\" \/>\n<meta property=\"og:description\" content=\"Escrito por: Felipe Almeida, com contribui\u00e7\u00f5es de Luiz Felix, V\u00edvian Miranda, Lucas Nolasco e Caroline Custodio. Esta \u00e9 a parte 3 de uma s\u00e9rie de 3 partes sobre Feature Stores para ML em tempo real. Veja a parte 1 e a parte 2. Breve recapitula\u00e7\u00e3o e introdu\u00e7\u00e3o Na parte 1 desta s\u00e9rie, descrevemos o que [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/\" \/>\n<meta property=\"og:site_name\" content=\"Building Nubank\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-14T14:36:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-14T17:08:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/building.nu.com\/wp-content\/uploads\/2026\/10\/Captura-de-Tela-2026-10-14-as-11.33.39.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1726\" \/>\n\t<meta property=\"og:image:height\" content=\"742\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Nubank Editorial\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nubank Editorial\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/\"},\"author\":{\"name\":\"Nubank Editorial\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"headline\":\"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank\",\"datePublished\":\"2026-10-14T14:36:17+00:00\",\"dateModified\":\"2026-10-14T17:08:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/\"},\"wordCount\":2112,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1\",\"articleSection\":[\"Data science &amp; Machine Learning\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/\",\"url\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/\",\"name\":\"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank - Building Nubank\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1\",\"datePublished\":\"2026-10-14T14:36:17+00:00\",\"dateModified\":\"2026-10-14T17:08:54+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/building.nu.com\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1\",\"width\":1726,\"height\":742},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#website\",\"url\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/\",\"name\":\"Building Nubank\",\"description\":\"We make the extraordinary happen\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/#\\\/schema\\\/person\\\/462f4f5a8d4ec3ccbc3d661dde00f0a4\",\"name\":\"Nubank Editorial\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g\",\"caption\":\"Nubank Editorial\"},\"url\":\"https:\\\/\\\/building.nu.com\\\/pt-br\\\/author\\\/editorial\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank - Building Nubank","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/","og_locale":"pt_BR","og_type":"article","og_title":"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank - Building Nubank","og_description":"Escrito por: Felipe Almeida, com contribui\u00e7\u00f5es de Luiz Felix, V\u00edvian Miranda, Lucas Nolasco e Caroline Custodio. Esta \u00e9 a parte 3 de uma s\u00e9rie de 3 partes sobre Feature Stores para ML em tempo real. Veja a parte 1 e a parte 2. Breve recapitula\u00e7\u00e3o e introdu\u00e7\u00e3o Na parte 1 desta s\u00e9rie, descrevemos o que [&hellip;]","og_url":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/","og_site_name":"Building Nubank","article_published_time":"2026-10-14T14:36:17+00:00","article_modified_time":"2026-10-14T17:08:54+00:00","og_image":[{"width":1726,"height":742,"url":"https:\/\/building.nu.com\/wp-content\/uploads\/2026\/10\/Captura-de-Tela-2026-10-14-as-11.33.39.png","type":"image\/png"}],"author":"Nubank Editorial","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Nubank Editorial","Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#article","isPartOf":{"@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/"},"author":{"name":"Nubank Editorial","@id":"https:\/\/building.nu.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"headline":"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank","datePublished":"2026-10-14T14:36:17+00:00","dateModified":"2026-10-14T17:08:54+00:00","mainEntityOfPage":{"@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/"},"wordCount":2112,"commentCount":0,"image":{"@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1","articleSection":["Data science &amp; Machine Learning"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/","url":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/","name":"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank - Building Nubank","isPartOf":{"@id":"https:\/\/building.nu.com\/pt-br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#primaryimage"},"image":{"@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1","datePublished":"2026-10-14T14:36:17+00:00","dateModified":"2026-10-14T17:08:54+00:00","author":{"@id":"https:\/\/building.nu.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4"},"breadcrumb":{"@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#primaryimage","url":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1","contentUrl":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1","width":1726,"height":742},{"@type":"BreadcrumbList","@id":"https:\/\/building.nu.com\/pt-br\/feature-stores-em-ml-em-tempo-real-parte-3-exemplos-do-nubank\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/building.nu.com\/pt-br\/"},{"@type":"ListItem","position":2,"name":"Feature stores em ML em tempo real, parte 3:\u00a0 Exemplos do Nubank"}]},{"@type":"WebSite","@id":"https:\/\/building.nu.com\/pt-br\/#website","url":"https:\/\/building.nu.com\/pt-br\/","name":"Building Nubank","description":"We make the extraordinary happen","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/building.nu.com\/pt-br\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/building.nu.com\/pt-br\/#\/schema\/person\/462f4f5a8d4ec3ccbc3d661dde00f0a4","name":"Nubank Editorial","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8c056170dc75ffd365b306a0ac7bea4e51d1cdab52a0c84e6ba0a42f7e2f4633?s=96&d=identicon&r=g","caption":"Nubank Editorial"},"url":"https:\/\/building.nu.com\/pt-br\/author\/editorial\/"}]}},"jetpack_likes_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pbKBB5-9Y6","jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/building.nu.com\/wp-content\/uploads\/2026\/10\/Captura-de-Tela-2026-10-14-as-11.33.39.png?fit=1726%2C742&ssl=1","_links":{"self":[{"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/posts\/38322","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/users\/178110103"}],"replies":[{"embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/comments?post=38322"}],"version-history":[{"count":6,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/posts\/38322\/revisions"}],"predecessor-version":[{"id":38354,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/posts\/38322\/revisions\/38354"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/media\/38302"}],"wp:attachment":[{"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/media?parent=38322"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/categories?post=38322"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/building.nu.com\/pt-br\/wp-json\/wp\/v2\/tags?post=38322"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}