{"id":348008,"date":"2025-08-16T01:57:20","date_gmt":"2025-08-16T01:57:20","guid":{"rendered":"https:\/\/www.europesays.com\/uk\/348008\/"},"modified":"2025-08-16T01:57:20","modified_gmt":"2025-08-16T01:57:20","slug":"netflix-revamps-tudums-cqrs-architecture-with-raw-hollow-in-memory-object-store","status":"publish","type":"post","link":"https:\/\/www.europesays.com\/uk\/348008\/","title":{"rendered":"Netflix Revamps Tudum\u2019s CQRS Architecture with RAW Hollow In-Memory Object Store"},"content":{"rendered":"<p>&#13;<br \/>\nNetflix <a href=\"https:\/\/netflixtechblog.com\/netflix-tudum-architecture-from-cqrs-with-kafka-to-cqrs-with-raw-hollow-86d141b72e52\" target=\"_blank\" rel=\"noopener\">replaced a CQRS implementation using Kafka and Cassandra with a new solution leveraging RAW Hollow<\/a>, an in-memory object store developed internally. Revamped architecture of Tudum offers much faster content preview during the editorial process and faster page rendering for visitors.&#13;\n<\/p>\n<p>Netflix launched Tudum, its official fan website, in late 2021, to provide a destination for Netflix users interested in additional content associated with the company\u2019s shows. The architecture of the website was initially based on the <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/architecture\/patterns\/cqrs\" target=\"_blank\" rel=\"noopener\">Command Query Responsibility Segregation (CQRS)<\/a> pattern to optimize read performance for serving content.<\/p>\n<p>The write part of the platform was built around the 3rd-party CMS product, and had a dedicated ingestion service for handling content update events, delivered via a webhook. The ingestion service was responsible for converting CMS data into read-optimized page content by applying templates, as well as data validations and transformations. Read-optimized data would then be published to a dedicated Kafka topic.<\/p>\n<p><img decoding=\"async\" alt=\"\" class=\"zoom-image\" src=\"https:\/\/www.infoq.com\/news\/2025\/08\/netflix-tudum-cqrs-raw-hollow\/news\/2025\/08\/netflix-tudum-cqrs-raw-hollow\/en\/resources\/1netflix-tudum-arch-old-1755081110544.jpeg\" style=\"width: 600px; height: 467px;\" rel=\"share\"\/><\/p>\n<p>Initial Tudum data architecture (Source: <a href=\"https:\/\/netflixtechblog.com\/netflix-tudum-architecture-from-cqrs-with-kafka-to-cqrs-with-raw-hollow-86d141b72e52\" target=\"_blank\" rel=\"noopener\">Netflix Engineering Blog<\/a>)<\/p>\n<p>On the query side, the page data service was responsible for consuming messages for the Kafka topic and storing the data in the <a href=\"https:\/\/cassandra.apache.org\/_\/index.html\" target=\"_blank\" rel=\"noopener\">Cassandra<\/a> query database. The service utilized a near cache to improve performance, providing stored page data to the page construction service and other internal services.<\/p>\n<p>The initial architecture benefited from the decoupling of read and write paths, allowing for independent scaling. However, due to the caching refresh cycle, CMS updates were taking many seconds to show up on the website. The issue made it problematic for content editors to preview their modifications and got progressively worse as the amount of content grew, resulting in delays lasting tens of seconds.<\/p>\n<p><a href=\"https:\/\/www.linkedin.com\/in\/eugeneemelyanov\/\" target=\"_blank\" rel=\"noopener\">Eugene Yemelyanau<\/a>, technology evangelist, and <a href=\"https:\/\/www.linkedin.com\/in\/jake-grice\/\" target=\"_blank\" rel=\"noopener\">Jake Grice<\/a>, staff engineer at Netflix, describe the cause for delays in retrieving content for displaying due to caching:<\/p>\n<blockquote><p>&#13;<\/p>\n<p>Regardless of which system modifies the data, the cache is updated with each refresh cycle. If you have 60 keys and a refresh interval of 60 seconds, the near cache will update one key per second. This was problematic for previewing recent modifications, as these changes were only reflected with each cache refresh. As Tudum\u2019s content grew, cache refresh times increased, further extending the delay.<\/p>\n<p>&#13;\n<\/p><\/blockquote>\n<p>Eventually, the team decided to revamp the architecture to eliminate the delays in previewing content updates, ideally. Engineers chose to leverage <a href=\"https:\/\/hollow.how\/\" target=\"_blank\" rel=\"noopener\">RAW Hollow<\/a>, a homegrown in-memory object database. Netflix designed the database to handle small to medium datasets and support strong read-after-write consistency. RAW Hollow allows the entire dataset to reside in the memory of each application process within a cluster, offering low latency and high availability. The database provides eventual consistency by default but supports strong consistency at the individual request level.<\/p>\n<p><img decoding=\"async\" alt=\"\" class=\"zoom-image\" src=\"https:\/\/www.infoq.com\/news\/2025\/08\/netflix-tudum-cqrs-raw-hollow\/news\/2025\/08\/netflix-tudum-cqrs-raw-hollow\/en\/resources\/1netflix-tudum-arch-new-1755081110544.jpeg\" style=\"width: 600px; height: 540px;\" rel=\"share\"\/><\/p>\n<p>Revised Tudum data architecture (Source: <a href=\"https:\/\/netflixtechblog.com\/netflix-tudum-architecture-from-cqrs-with-kafka-to-cqrs-with-raw-hollow-86d141b72e52\" target=\"_blank\" rel=\"noopener\">Netflix Engineering Blog<\/a>)<\/p>\n<p>Tudum engineers replaced Kafka and Cassandra with the RAW Follow cluster, spanning the ingestion and page construction service instances. The team concluded that, for the use case at hand, the CQRS design pattern wasn\u2019t the optimal approach, and using a distributed, in-memory object store suited the situation better. The new solution eliminated cache invalidation problems as the entire dataset could fit into the application\u2019s memory, helped by Hollow\u2019s data compression, reducing the data size to 25% of the uncompressed size in the Apache Iceberg table.<\/p>\n<p>As a result of the architecture revamp and supporting data migration, the platform benefited from a significant reduction in data propagation times and page construction due to reduced request I\/O and round-trip times. Tudum engineers believe that the new architecture offers the best of both worlds for editors and visitors.<\/p>\n","protected":false},"excerpt":{"rendered":"&#13; Netflix replaced a CQRS implementation using Kafka and Cassandra with a new solution leveraging RAW Hollow, an&hellip;\n","protected":false},"author":2,"featured_media":348009,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3939],"tags":[123210,30172,4021,4020,123213,30113,123209,4022,77,123208,123211,123212,123207,16,15],"class_list":{"0":"post-348008","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-arts-and-design","8":"tag-apache-kafka","9":"tag-architecture-design","10":"tag-arts","11":"tag-arts-and-design","12":"tag-cassandra","13":"tag-consistency","14":"tag-cqrs","15":"tag-design","16":"tag-entertainment","17":"tag-event-driven-architecture","18":"tag-in-memory-databases","19":"tag-in-memory-persistence","20":"tag-netflix-tudum-cqrs-raw-hollow","21":"tag-uk","22":"tag-united-kingdom"},"share_on_mastodon":{"url":"https:\/\/pubeurope.com\/@uk\/115035966343439232","error":""},"_links":{"self":[{"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/posts\/348008","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/comments?post=348008"}],"version-history":[{"count":0,"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/posts\/348008\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/media\/348009"}],"wp:attachment":[{"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/media?parent=348008"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/categories?post=348008"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.europesays.com\/uk\/wp-json\/wp\/v2\/tags?post=348008"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}