<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Databases on foojay.io - Friends of OpenJDK</title><link>https://foojayio.github.io/website/today/category/databases/</link><description>Recent content in Databases on foojay.io - Friends of OpenJDK</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 23 Jul 2026 19:20:44 +0000</lastBuildDate><atom:link href="https://foojayio.github.io/website/today/category/databases/index.xml" rel="self" type="application/rss+xml"/><item><title>Getting Started with Exposed: Kotlin ORM Made Simple</title><link>https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</link><pubDate>Mon, 06 Jul 2026 03:39:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;For quite some time, I have been a huge fan of and fascinated by JetBrains products, tools, and libraries because of their masterful craftsmanship in product creation and their pristine focus on building high-quality developer tools.&lt;/p&gt;
&lt;p&gt;Even more excitingly, JetBrains Java Annotated Monthly newsletters have featured most of the technical articles I wrote for Foojay on topics such as Java, Spring, Spring Boot 4, and OpenRewrite.&lt;/p&gt;
&lt;p&gt;Recently, one Kotlin Domain-Specific Language (DSL) library caught my attention. I immediately tried converting my existing Spring Boot 4 application from Java to Kotlin using Exposed, an ORM framework for Kotlin.
&lt;img src="https://foojayio.github.io/website/today/exposed-kotlin-orm-complete-guide/Exposed-1024x683.png" alt="Exposed" loading="lazy"&gt;
 Kotlin SQL Libary&lt;/p&gt;</description></item><item><title>Aggregation Optimization in MongoDB: Unnecessary Unwinds (Part 2)</title><link>https://foojayio.github.io/website/today/aggregation-optimization-in-mongodb-unnecessary-unwinds-part-2/</link><pubDate>Thu, 25 Jun 2026 10:01:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/aggregation-optimization-in-mongodb-unnecessary-unwinds-part-2/</guid><description>&lt;h2 id="h2-0-and-why-mongodb-might-be-a-better-relational-database-than-you-ever-realized"&gt;And why MongoDB might be a better relational database than you ever realized.&lt;/h2&gt;
&lt;figure class="wp-block-image size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" width="700" height="307" src="tue11.png" alt="" class="wp-image-124328" style="aspect-ratio:2.2802192518511397;width:840px;height:auto"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="https://www.mongodb.com/events/mongodb-schema-design-reviews/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=agg-part2-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;Design reviews&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;are one-on-one meetings where MongoDB experts deliver advice on data modeling best practices and application design challenges. In this series, we are going to explore common real-life scenarios where design reviews helped developers achieve meaningful success with MongoDB.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This article was written by Graeme Robinson. Find him on&lt;/em&gt; &lt;a href="https://www.linkedin.com/in/graemecrobinson" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;LinkedIn&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://foojayio.github.io/website/today/aggregation-optimization-in-mongodb-a-case-study-from-the-field-part-1/"&gt;In Part 1 of this series&lt;/a&gt;
, we described a use case based on a recent design review I conducted with a team at a MongoDB customer. The team in question was new to MongoDB, and the approach they had taken to both modeling their data and then subsequently querying it was very &amp;ldquo;RDBMS-like.&amp;rdquo; As a result, query performance was significantly slower than their SLA called for.&lt;/p&gt;</description></item><item><title>BoxLang 1.14.0 : Query Transformers - Take Full Control of Your Query Results</title><link>https://foojayio.github.io/website/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</link><pubDate>Wed, 24 Jun 2026 10:46:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/boxlang-1-14-0-query-transformers-take-full-control-of-your-query-results/BoxLang-release-1.14.0-2-700x394.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;BoxLang 1.14.0 ships a lot of exciting features &amp;ndash; Dynamic Sets, Ranges, Inner Classes, JSONPath navigation &amp;ndash; but one quietly powerful addition will change the way you think about every database call in your application: &lt;strong&gt;Query Transformers&lt;/strong&gt;, and this is just the start, we have plans for a whole lot more cool query features.&lt;/p&gt;
&lt;p&gt;If you have ever executed a query and then immediately written a loop to reshape the result into what you actually needed, this feature is for you.&lt;/p&gt;</description></item><item><title>Building an AI-Powered Operations Assistant with Spring AI and MongoDB Atlas — Part 2: Conversational Memory</title><link>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/</link><pubDate>Wed, 10 Jun 2026 19:23:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-2-conversational-memory/</guid><description>&lt;p&gt;This is the second article in a three-part series. Part 1 covered the RAG foundation &amp;mdash; loading runbooks into a vector store and wiring them to a language model. Part 3 will introduce stateful workflow checkpointing with pause and resume.&lt;/p&gt;
&lt;h2 id="h2-0-the-problem-with-stateless-chat"&gt;The Problem with Stateless Chat&lt;/h2&gt;
&lt;p&gt;In the first part of the series, we successfully created a chat interface where an operator can ask questions and receive answers based on the actual content of the runbooks they have uploaded and embedded in the system. For example, they can ask in the chat, &amp;ldquo;&lt;em&gt;What should I check when my server&amp;rsquo;s CPU usage exceeds 80%?&lt;/em&gt;&amp;rdquo; and the assistant retrieves the relevant sections from the various runbooks and assembles a coherent and concrete response.&lt;/p&gt;</description></item><item><title>Exploring MongoT</title><link>https://foojayio.github.io/website/today/exploring-mongot-atlas-search/</link><pubDate>Thu, 28 May 2026 21:02:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-mongot-atlas-search/</guid><description>&lt;p&gt;Let&amp;rsquo;s explore this fascinating and awesome Java project from MongoDB - MongoT!&lt;/p&gt;
&lt;p&gt;You can check out the source code here:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;git clone https://github.com/mongodb/mongot&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/exploring-mongot-atlas-search/Screenshot-2026-05-08-at-3.17.36-PM-1024x548.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;MongoT is a wrapper around the amazing Java search engine: &lt;a href="https://lucene.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Lucene&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Lucene is a powerful search toolkit built around an inverted token index structure that enables advanced text search capabilities, including ranked results, autocomplete, synonyms, fuzzy matching, highlighting, and faceting &amp;mdash; all with high performance regardless of dataset size. Unlike MongoDB&amp;rsquo;s native query engine, it can efficiently search across multiple indexes simultaneously by intersecting lists of ordinal document IDs in parallel, using optimization techniques like skip-lists, ordinal compression, and document frequency ordering. It also supports indexing of various field types (integers, dates, keywords, etc.) and has expanded into vector search, enabling semantic similarity search by meaning rather than exact text matching.&lt;/p&gt;</description></item><item><title>Implementing Soft Deletes in Java</title><link>https://foojayio.github.io/website/today/implementing-soft-deletes-in-java/</link><pubDate>Thu, 21 May 2026 10:09:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/implementing-soft-deletes-in-java/</guid><description>&lt;h2 id="soft-deletes"&gt;What are soft deletes?&lt;/h2&gt;
&lt;p&gt;Usually, when deleting documents from a database, the entry is permanently gone and can not be recovered or accessed again.&lt;/p&gt;
&lt;p&gt;Sometimes data needs to be made unavailable for regular access without actually being removed from a database. A common example is a user deleting their account on a platform, but retention policies require you to keep all data related to that user for a certain period of time. At the same time, no data regarding that user is accessible on the platform. A soft delete is a treatment for a piece of data that ensures it is ignored by your application while actually still being stored in the database.&lt;/p&gt;</description></item><item><title>Building an AI-Powered Operations Assistant with Spring AI and MongoDB Atlas — Part 1: RAG Foundation</title><link>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</link><pubDate>Thu, 07 May 2026 19:22:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-an-ai-powered-operations-assistant-with-spring-ai-and-mongodb-atlas-part-1-rag-foundation/</guid><description>&lt;p&gt;This is the first article in a three-part series. Part 2 covers short-term and long-term memory; Part 3 introduces stateful workflow checkpointing with pause/resume.&lt;/p&gt;
&lt;h2 id="h2-0-the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s 2 a.m. Suddenly, an alert pops up indicating abnormal CPU usage on the payment services. The on-call engineer opens their laptop, logs into the monitoring dashboards, and begins the hunt. One by one, he searches the runbooks on Confluence, checks the Slack chats, and opens the GitHub wikis and documents shared during the design phase. By the time he finds any useful information, ten minutes have already passed.&lt;/p&gt;</description></item><item><title>UCanAccess: The Modern Pure-Java Bridge to Microsoft Access</title><link>https://foojayio.github.io/website/today/ucanaccess-java-ms-access-jdbc-guide/</link><pubDate>Wed, 06 May 2026 08:44:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/ucanaccess-java-ms-access-jdbc-guide/</guid><description>&lt;p&gt;Microsoft Access databases are everywhere. Decades of &lt;code&gt;.mdb&lt;/code&gt; and &lt;code&gt;.accdb&lt;/code&gt; files silently power spreadsheets, small business applications, and legacy data stores across organizations of all sizes. Yet for Java developers, connecting to these files has historically meant wrestling with native Windows libraries, ODBC bridges, and platform-specific hacks.&lt;/p&gt;
&lt;figure class="aligncenter size-full is-resized"&gt;
 &lt;img decoding="async" src="ucanaccess-logo.svg" alt="UCanAccess Logo" class="wp-image-123938" style="width:320px"&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;UCanAccess&lt;/strong&gt; puts an end to that. It is an open-source, pure-Java JDBC driver that lets you read and write Microsoft Access databases (&lt;code&gt;.mdb&lt;/code&gt; and &lt;code&gt;.accdb&lt;/code&gt;) just like any other SQL database &amp;mdash; no native drivers, no Windows dependency, no friction.&lt;/p&gt;</description></item><item><title>When Should You Use a Cache With MongoDB?</title><link>https://foojayio.github.io/website/today/when-should-you-use-a-cache-with-mongodb/</link><pubDate>Tue, 05 May 2026 15:23:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/when-should-you-use-a-cache-with-mongodb/</guid><description>&lt;p&gt;From time to time, I&amp;rsquo;ll run a &lt;a href="https://www.mongodb.com/events/mongodb-schema-design-reviews/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=cache-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;design review&lt;/a&gt;
 for an application being migrated from a relational database onto MongoDB, where the customer shares an architectural diagram showing a caching layer (typically Redis) sitting between the app server and MongoDB.&lt;/p&gt;
&lt;p&gt;I like to keep the architecture as simple as possible&amp;mdash;after all, each layer brings its own complexity and management costs&amp;mdash;so I&amp;rsquo;ll ask why the caching layer is there. Of course, the answer is always that it&amp;rsquo;s there to speed up data access. This reveals a misunderstanding of both the reason why caching layers were created and what MongoDB provides.&lt;/p&gt;</description></item><item><title>Large-Scale ETL Pipeline Architecture</title><link>https://foojayio.github.io/website/today/large-scale-etl-pipeline-architecture/</link><pubDate>Fri, 01 May 2026 19:23:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/large-scale-etl-pipeline-architecture/</guid><description>&lt;p&gt;Modern data-driven systems. ETL pipelines are no longer simply scheduled background processes that run silently overnight, one after another. They are the backbone of real-time analytics, powering operational dashboards and recommendation systems. They enable machine learning workflows.&lt;/p&gt;
&lt;p&gt;This evolution, while creating enormous benefits, has&amp;mdash;with the increase in data volume and the decrease in latency tolerance&amp;mdash;called into question the traditional sequential ETL approach. A bottleneck for the speed is now required.&lt;/p&gt;</description></item><item><title>Building a Personalized Content Delivery System</title><link>https://foojayio.github.io/website/today/building-a-personalized-content-delivery-system/</link><pubDate>Thu, 23 Apr 2026 15:10:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-personalized-content-delivery-system/</guid><description>&lt;p&gt;Recommendation engines have a reputation for requiring specialized ML infrastructure: matrix factorization pipelines, training jobs, and model serving layers. That is one way to do it, but not the only way. If your data already lives in MongoDB and your application runs on Spring Boot, you can build a practical recommendation system using tools you already have. MongoDB aggregation pipelines handle the scoring math server-side, and Atlas Vector Search adds semantic matching without a separate vector database.&lt;/p&gt;</description></item><item><title>Distributed Cache Invalidation Patterns</title><link>https://foojayio.github.io/website/today/distributed-cache-invalidation-patterns/</link><pubDate>Tue, 21 Apr 2026 13:52:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/distributed-cache-invalidation-patterns/</guid><description>&lt;p&gt;Caching is one of the most powerful tools developers have at their disposal for optimizing application performance. Caching systems can significantly reduce latency and reduce the load on databases or external systems by storing frequently accessed data as close as possible to the application layer. The result? Improved responsiveness and overall system usability.&lt;/p&gt;
&lt;p&gt;In small monolithic applications, cache management is usually very simple. A service retrieves data from a database, stores it in memory, and fulfills subsequent requests by retrieving the data directly from the cache. When the data changes, the cache key is invalidated or updated.&lt;/p&gt;</description></item><item><title>CQRS in Java: Separating Reads and Writes Cleanly</title><link>https://foojayio.github.io/website/today/cqrs-in-java-separating-reads-and-writes-cleanly/</link><pubDate>Thu, 16 Apr 2026 20:25:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/cqrs-in-java-separating-reads-and-writes-cleanly/</guid><description>&lt;h3 id="h3-0-what-you-ll-learn"&gt;What you&amp;rsquo;ll learn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;How the MongoDB Spring repository can be used to abstract MongoDB operations&lt;/li&gt;
&lt;li&gt;Separating Reads and Writes in your application&lt;/li&gt;
&lt;li&gt;How separating these can make schema design changes easier&lt;/li&gt;
&lt;li&gt;Why you should avoid save() and saveAll() functions in Spring&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Command Query Responsibility Segregation (CQRS) pattern is a design method that segregates data access into separate services for reading and writing data. This allows a higher level of maintainability in your applications, especially if the schema or requirements change frequently. This pattern was originally developed with separate read and write sources in mind. However, implementing CQRS for a single data source is an effective way to abstract data from the application and make maintenance easier in the future. In this blog, we will use Spring Boot with MongoDB in order to create a CQRS pattern-based application.&lt;/p&gt;</description></item><item><title>Building a Kotlin App with Spring Boot and MongoDB Search</title><link>https://foojayio.github.io/website/today/building-a-kotlin-app-with-spring-boot-and-mongodb-search/</link><pubDate>Thu, 09 Apr 2026 15:21:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-kotlin-app-with-spring-boot-and-mongodb-search/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/b0dkQYcvBkQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;p&gt;One of my favorite activities is traveling and exploring the world. You know that feeling of discovering a new place and thinking, &amp;ldquo;How have I not been here before?&amp;rdquo; It&amp;rsquo;s with that sensation that I&amp;rsquo;m always motivated to seek out new places to discover. Often, when searching for a place to stay, we&amp;rsquo;re not entirely sure what we&amp;rsquo;re looking for or what experiences we&amp;rsquo;d like to have. For example, we might want to rent a room in a city with a view of a castle. Finding something like that can seem difficult, right? However, there is a way to search for information accurately using MongoDB Search.&lt;/p&gt;</description></item><item><title>Manage HTTP Sessions with Spring Session MongoDB</title><link>https://foojayio.github.io/website/today/building-distributed-http-sessions-with-spring-session-mongodb/</link><pubDate>Tue, 07 Apr 2026 15:19:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-distributed-http-sessions-with-spring-session-mongodb/</guid><description>&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/drivers/java/sync/current/integrations/spring-session/?utm_campaign=devrel&amp;amp;utm_source=third-part-content&amp;amp;utm_medium=cta&amp;amp;utm_content=spring&amp;#43;sessions&amp;#43;mongodb&amp;amp;utm_term=tim.kelly" target="_blank" rel="noopener noreferrer"&gt;Spring Session MongoDB&lt;/a&gt;
 is a library that enables Spring applications to store and manage HTTP session data in MongoDB rather than relying on container-specific session storage. In traditional deployments, session state is often tied to a single application instance, which makes scaling across multiple servers difficult. By integrating &lt;a href="https://spring.io/projects/spring-session" target="_blank" rel="noopener noreferrer"&gt;Spring Session&lt;/a&gt;
 with MongoDB, session data can be persisted beyond application restarts and shared across instances in a cluster, enabling scalable distributed applications with minimal configuration.&lt;/p&gt;</description></item><item><title>Java Faceted Full-Text Search API Using MongoDB Atlas Search</title><link>https://foojayio.github.io/website/today/java-faceted-full-text-search-api-using-mongodb-atlas-search/</link><pubDate>Thu, 02 Apr 2026 16:27:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-faceted-full-text-search-api-using-mongodb-atlas-search/</guid><description>&lt;p&gt;This is going to be a fun, practical tutorial demonstrating how to build a Java faceted full-text search API (like the ones powering sites like Amazon)!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll use an interesting dataset which showcases how you can effectively pair machine learning/AI-generated data with more traditional search to produce fast, cheap, repeatable, and intuitive search engines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: If you (like me!) are less about words and more about code, you can jump straight in. Check it out and run it locally like this:&lt;/p&gt;</description></item><item><title>MongoDB Search Score Breakdown</title><link>https://foojayio.github.io/website/today/mongodb-search-score-breakdown/</link><pubDate>Tue, 31 Mar 2026 15:05:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-search-score-breakdown/</guid><description>&lt;p&gt;Full-text search powers all of our digital lives &amp;mdash; googling for this and that; asking Siri where to find a tasty, nearby dinner; shopping at Amazon; and so on. We receive relevant results, often even in spite of our typos, voice transcription mistakes, or vaguely formed queries. We have grown accustomed to expecting the best results for our searching intentions, right there, at the top.&lt;/p&gt;
&lt;p&gt;But now it&amp;rsquo;s your turn, dear developer, to build the same satisfying user experience into your Atlas-powered application.&lt;/p&gt;</description></item><item><title>Modeling One-to-Many Relationships in Java with MongoDB</title><link>https://foojayio.github.io/website/today/modeling-one-to-many-relationships-in-java-with-mongodb/</link><pubDate>Thu, 26 Mar 2026 15:50:30 +0000</pubDate><guid>https://foojayio.github.io/website/today/modeling-one-to-many-relationships-in-java-with-mongodb/</guid><description>&lt;p&gt;In a relational database, modeling a one-to-many relationship is straightforward: you create two tables and connect them with a foreign key. When you need the data together, you write a JOIN. In MongoDB, you have a choice, and that choice has a direct impact on your application&amp;rsquo;s performance, scalability, and maintainability.&lt;/p&gt;
&lt;p&gt;Consider a common scenario: a BlogPost that has many Comment objects. In Java, this is a natural List&amp;lt;Comment&amp;gt; field on the post. But when it comes time to persist that relationship in MongoDB, you need to decide &lt;em&gt;how&lt;/em&gt; to store it. Should the comments live inside the blog post document? Or should they sit in their own collection, connected by references?&lt;/p&gt;</description></item><item><title>Clean Architecture with Spring Boot and MongoDB</title><link>https://foojayio.github.io/website/today/clean-architecture-with-spring-boot-and-mongodb/</link><pubDate>Tue, 24 Mar 2026 16:43:14 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-architecture-with-spring-boot-and-mongodb/</guid><description>&lt;p&gt;Most Spring Boot tutorials tightly wire everything together. Controllers call services, services call repositories, and MongoDB annotations like &lt;code&gt;@Document&lt;/code&gt; and &lt;code&gt;@Field&lt;/code&gt; sit right next to your business logic. It works until you need to swap the database, test logic in isolation, or reuse domain rules in a different context.&lt;/p&gt;
&lt;p&gt;Clean Architecture enforces one rule: source code dependencies always point inward. Your business logic never imports Spring or MongoDB classes. The database becomes a pluggable detail at the outermost layer, something you can replace without rewriting core application code.&lt;/p&gt;</description></item><item><title>Building Reactive Data Streams with Project Reactor</title><link>https://foojayio.github.io/website/today/building-reactive-data-streams-with-project-reactor/</link><pubDate>Thu, 19 Mar 2026 15:13:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-reactive-data-streams-with-project-reactor/</guid><description>&lt;h2 id="h2-0-creating-non-blocking-streaming-endpoints-for-high-throughput-applications"&gt;Creating Non-Blocking Streaming Endpoints for High-Throughput Applications&lt;/h2&gt;
&lt;p&gt;There are problems that only occur in production. Or rather, we only notice them in production.&lt;/p&gt;
&lt;p&gt;We have created an application that exposes clean APIs, according to all standards. You have modeled the domain elegantly and efficiently: all load tests show reassuring data. CPU usage is reasonable, to say the least. However, there is a problem: when traffic exceeds a threshold, the system slows down. Response time latency becomes inconsistent; threads stack up on top of each other. Response times increase unpredictably, and application customers begin to complain about this situation.&lt;/p&gt;</description></item><item><title>Language Learning Flashcard System - Part 1</title><link>https://foojayio.github.io/website/today/language-learning-flashcard-system-part-1/</link><pubDate>Tue, 17 Mar 2026 16:39:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/language-learning-flashcard-system-part-1/</guid><description>&lt;p&gt;My native language is Spanish. I&amp;rsquo;ve been learning (and butchering) English my whole life. But at some point, I felt confident with English and wanted to learn Japanese. Big mistake. This is a totally different beast: three writing systems (Hiragana ひらがな, Katakana カタカナ and Kanji 漢字), a completely different grammar, no relation whatsoever with European languages&amp;hellip; I needed help. And tools to learn. And one of them is Space Repetition System based apps.&lt;/p&gt;</description></item><item><title>Atlas Online Archive: Efficiently Manage the Data Lifecycle</title><link>https://foojayio.github.io/website/today/atlas-online-archive-efficiently-manage-the-data-lifecycle/</link><pubDate>Thu, 12 Mar 2026 14:55:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/atlas-online-archive-efficiently-manage-the-data-lifecycle/</guid><description>&lt;h2 id="h2-0-problem-statement"&gt;Problem statement&lt;/h2&gt;
&lt;p&gt;In the production environment, in a MongoDB Atlas database, a collection contains massive amounts of data stored, including aged and current data. However, aged data is not frequently accessed through applications, and the data piles up daily in the collection, leading to performance degradation and cost consumption. This results in needing to upgrade the cluster tier size to maintain sufficient resources according to workload, as it would be difficult to continue with the existing tier size.&lt;/p&gt;</description></item><item><title>Role-Based Access Control in Java Applications</title><link>https://foojayio.github.io/website/today/role-based-access-control-in-java-applications/</link><pubDate>Thu, 05 Mar 2026 20:31:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/role-based-access-control-in-java-applications/</guid><description>&lt;p&gt;We often work with Java applications where security begins and ends with authentication. The JWT token is validated, Spring Security is integrated, and an identity provider is added, thinking that this type of configuration is sufficiently secure.&lt;/p&gt;
&lt;p&gt;The real problem is that authentication only answers one question: who are you? In real applications, we also have to answer another question, which is often more complex and more dangerous to get wrong: what are you allowed to do?&lt;/p&gt;</description></item><item><title>Data Enrichment in MongoDB</title><link>https://foojayio.github.io/website/today/data-enrichment-in-mongodb/</link><pubDate>Tue, 03 Mar 2026 16:10:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/data-enrichment-in-mongodb/</guid><description>&lt;p&gt;In a recent design review, a customer was enriching new data as it came in. As the enrichment process was fairly complex, they ran into some issues with concurrency. To solve this, they decided that data should go into a staging collection rather than the main collection that held the data. This did nothing to help with concurrency issues and actually created more work on the database side of things when enrichment was complete.&lt;/p&gt;</description></item><item><title>How to Build a Search Service in Java with MongoDB</title><link>https://foojayio.github.io/website/today/how-to-build-a-search-service-in-java-with-mongodb/</link><pubDate>Fri, 27 Feb 2026 18:28:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-build-a-search-service-in-java-with-mongodb/</guid><description>&lt;p&gt;We need to code our way from the search box to our search index. Performing a search and rendering the results in a presentable fashion, itself, is not a tricky endeavor: Send the user&amp;rsquo;s query to the search server, and translate the response data into some user interface technology. However, there are some important issues that need to be addressed, such as security, error handling, performance, and other concerns that deserve isolation and control.&lt;/p&gt;</description></item><item><title>MongoDB and the Raft Algorithm</title><link>https://foojayio.github.io/website/today/mongodb-and-the-raft-algorithm/</link><pubDate>Tue, 24 Feb 2026 15:47:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-and-the-raft-algorithm/</guid><description>&lt;p&gt;&lt;a href="https://www.mongodb.com/docs/manual/replication/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=mongodb-raft-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&amp;rsquo;s replica&lt;/a&gt;
 set architecture uses distributed consensus to ensure consistency, availability, and fault tolerance across nodes. At the core of this architecture is the &lt;strong&gt;Raft consensus algorithm&lt;/strong&gt;, which breaks the complexities of distributed consensus into manageable operations: leader election, log replication, and commitment. This document explores how MongoDB integrates and optimizes Raft for its high-performance replication needs.{#1c95}&lt;br&gt;
&lt;img src="https://miro.medium.com/v2/resize:fit:700/0*CAtq0SjCCYL4gRBY.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;h3 id="e650"&gt;Raft Roles and MongoDB&amp;rsquo;s Replica Set&lt;/h3&gt;
&lt;p&gt;In Raft, nodes can assume one of three roles: &lt;strong&gt;leader&lt;/strong&gt; , &lt;strong&gt;follower&lt;/strong&gt; , or &lt;strong&gt;candidate&lt;/strong&gt; . MongoDB maps these roles to its architecture seamlessly. The &lt;strong&gt;primary&lt;/strong&gt; node functions as the leader, handling all client write operations and coordinating replication. The &lt;strong&gt;secondaries&lt;/strong&gt; serve as followers, maintaining copies of the primary&amp;rsquo;s data. A node transitions to the &lt;strong&gt;candidate&lt;/strong&gt; role during an election, triggered by leader unavailability.{#5e79}&lt;/p&gt;</description></item><item><title>Ports and Adapters in Java: Keeping Your Core Clean</title><link>https://foojayio.github.io/website/today/ports-and-adapters-in-java-keeping-your-core-clean/</link><pubDate>Thu, 19 Feb 2026 16:13:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/ports-and-adapters-in-java-keeping-your-core-clean/</guid><description>&lt;h2 id="h2-0-introduction"&gt;Introduction&lt;/h2&gt;
&lt;p&gt;If we want to evolve our Java system over time, architecture is more important than the choice of framework. Very often, teams realize too late that what was supposed to be a simple persistence layer at the beginning ended up influencing and overwhelming the entire application design. MongoDB annotations end up in domain models, repository abstractions mirror collections, and business logic becomes an integral part of the infrastructure.&lt;/p&gt;
&lt;p&gt;Hexagonal architecture, also known as Ports and Adapters, offers an architectural model that aims to avoid this problem. It involves the correct attribution of responsibilities to the various application layers. It encourages us to consider external systems (databases, message brokers, HTTP APIs, MCP servers) as details rather than pillars at the center of our design.&lt;/p&gt;</description></item><item><title>Optimizing the MongoDB Java Driver</title><link>https://foojayio.github.io/website/today/optimizing-the-mongodb-java-driver-how-minor-optimizations-led-to-macro-gains/</link><pubDate>Tue, 17 Feb 2026 15:33:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-the-mongodb-java-driver-how-minor-optimizations-led-to-macro-gains/</guid><description>&lt;p&gt;Co-authored by &lt;em&gt;Slav Babanin&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www-cs-faculty.stanford.edu/~knuth/" target="_blank" rel="noopener noreferrer"&gt;Donald Knuth&lt;/a&gt;
{#https://www-cs-faculty.stanford.edu/~knuth/}, widely recognized as the &amp;lsquo;father of the analysis of algorithms,&amp;rsquo; warned against premature optimization&amp;mdash;spending effort on code that appears inefficient but is not on the critical path. He observed that programmers often focus on the wrong 97% of the codebase. Real performance gains come from identifying and optimizing the critical 3%. But, how can you identify the critical 3%? Well, that&amp;rsquo;s where the philosophy of &amp;rsquo;never guess, always measure&amp;rsquo; comes in.&lt;/p&gt;</description></item><item><title>MongoDB Sharding: What to Know Before You Shard a Collection</title><link>https://foojayio.github.io/website/today/mongodb-sharding-what-to-know-before-you-shard/</link><pubDate>Thu, 12 Feb 2026 16:47:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-sharding-what-to-know-before-you-shard/</guid><description>&lt;p&gt;When we think about a system that operates at scale, we are usually talking about an application that needs to serve millions of users. This often happens when an application suddenly becomes popular and usage grows much faster than expected. As more people start using it, the system naturally begins to struggle to keep up with the load.&lt;/p&gt;
&lt;p&gt;More users mean more requests, more data being generated, and more pressure on the database. If nothing is done, bottlenecks start to appear and the overall performance of the system degrades. There are two traditional ways to deal with this problem: vertical scaling and horizontal scaling.&lt;/p&gt;</description></item><item><title>Reactive Java with Project Reactor</title><link>https://foojayio.github.io/website/today/reactive-java-with-project-reactor/</link><pubDate>Tue, 10 Feb 2026 14:32:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/reactive-java-with-project-reactor/</guid><description>&lt;p&gt;&lt;strong&gt;Introduction: Why Reactive Java Still Matters&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Over the past decade, the Java ecosystem has gradually abandoned the idea that increasing the number of threads is the scalable solution to growing load. Cloud-native implementations, containerized workloads, and high-I/O applications have highlighted the inefficiencies of the traditional synchronous thread-per-request model.&lt;/p&gt;
&lt;p&gt;Reactive programming is not a panacea, a miracle solution. Certainly, it does not make applications &amp;ldquo;faster&amp;rdquo; by default. What it offers, when applied correctly, is the ability to predict behavior under load, better resource utilization, and explicit control over data flow. For systems that handle high concurrency, streaming data, or variable traffic patterns, these characteristics are hugely relevant.&lt;/p&gt;</description></item><item><title>MongoDB 8.0 Migration Guide: What You Need to Know Before Upgrading</title><link>https://foojayio.github.io/website/today/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/</link><pubDate>Thu, 05 Feb 2026 14:56:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-8-0-migration-guide-what-you-need-to-know-before-upgrading/</guid><description>&lt;p&gt;Have you ever wondered why updates and upgrades are so essential for any system? Well, it&amp;rsquo;s no secret: They ensure that systems remain relevant and efficient. With MongoDB, it&amp;rsquo;s no different. Whenever we think about updating, we seek efficiency, security, performance, and other benefits that come with updated systems. However, every update introduces changes that need to be carefully managed. In this article, we will cover some of the new features of MongoDB version 8.0 and highlight the key considerations you should take into account before migrating to this new version.&lt;/p&gt;</description></item><item><title>GraphQL for Java Developers: Building a Flexible Data Layer</title><link>https://foojayio.github.io/website/today/graphql-for-java-developers-building-a-flexible-data-layer/</link><pubDate>Tue, 03 Feb 2026 15:43:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/graphql-for-java-developers-building-a-flexible-data-layer/</guid><description>&lt;p&gt;For many years, REST has been the standard architectural style for creating APIs in the Java ecosystem. Frameworks such as Spring MVC and, more recently, Spring WebFlux make it easy to expose HTTP endpoints with the REST paradigm, supported by well-structured service layers. In many cases, this model works well and serves as the basis for numerous enterprise solutions.&lt;/p&gt;
&lt;p&gt;However, as applications grow and frontend requirements become more dynamic, REST-based APIs are beginning to show their limitations. Multiple endpoints that return rigid DTOs often lead to over-fetching, under-fetching, and a proliferation of specialised endpoints created to meet slightly different customer needs. Over time, APIs become more difficult to evolve without introducing radical changes.&lt;/p&gt;</description></item><item><title>Abstracting Data Access in Java With the DAO Pattern</title><link>https://foojayio.github.io/website/today/abstracting-data-access-in-java-with-the-dao-pattern/</link><pubDate>Thu, 29 Jan 2026 16:37:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/abstracting-data-access-in-java-with-the-dao-pattern/</guid><description>&lt;p&gt;The Data Access Object (DAO) pattern is a structural pattern that isolates your application&amp;rsquo;s business logic from persistence operations. By using an abstract API, the DAO pattern hides all the complexity of performing CRUD operations against your database&amp;mdash;whether that&amp;rsquo;s MongoDB, a relational database, or any other storage mechanism.&lt;/p&gt;
&lt;p&gt;This separation is crucial: Your business logic shouldn&amp;rsquo;t care whether you&amp;rsquo;re using MongoDB&amp;rsquo;s flexible document model or a rigid SQL schema. The DAO pattern ensures both layers can evolve independently.&lt;/p&gt;</description></item><item><title>Introduction to Behavior Driving Development with Java and MongoDB</title><link>https://foojayio.github.io/website/today/introduction-to-behavior-driving-development-with-java-and-mongodb/</link><pubDate>Tue, 27 Jan 2026 16:35:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/introduction-to-behavior-driving-development-with-java-and-mongodb/</guid><description>&lt;p&gt;When we face software development, the biggest mistake is about delivering what the client wants. It sounds like a cliché, but after decades, we are still facing this problem. One good way to solve it is to start the test focusing on what the business needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Behavior-driven development&lt;/strong&gt; (BDD) is a software development methodology where the focus is on behavior and the domain terminology or ubiquitous language. It utilizes a shared, natural language to define and test software behaviors from the user&amp;rsquo;s perspective. BDD builds upon test-driven development (TDD) by focusing on scenarios that are relevant to the business. These scenarios are written as plain-language specifications that can be automated as tests, simultaneously serving as living documentation.&lt;/p&gt;</description></item><item><title>MongoDB and WiredTiger: A Journey Through the Storage Engine</title><link>https://foojayio.github.io/website/today/mongodb-and-wiredtiger-a-journey-through-the-storage-engine/</link><pubDate>Thu, 18 Dec 2025 20:26:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-and-wiredtiger-a-journey-through-the-storage-engine/</guid><description>&lt;p&gt;Databases are the backbone of modern applications, and &lt;a href="https://www.mongodb.com/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=mongodb-wiredtiger-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 stands out with its flexibility and scalability. Central to its functionality is the WiredTiger storage engine. WiredTiger, as MongoDB&amp;rsquo;s default engine, seamlessly merges document-level concurrency for high throughput, advanced compression techniques for optimized storage, and an in-memory architecture for rapid data access.{#e668}&lt;/p&gt;
&lt;p&gt;With the addition of write-ahead logging for robust durability and the sophistication of MultiVersion Concurrency Control for snapshot-like data views, WiredTiger harmoniously orchestrates MongoDB&amp;rsquo;s data management.{#6fac}&lt;/p&gt;</description></item><item><title>Inside the Engine: Performance Relay of MongoDB 8.0</title><link>https://foojayio.github.io/website/today/inside-the-engine-the-sub-millisecond-performance-relay-of-mongodb-8-0/</link><pubDate>Tue, 16 Dec 2025 20:16:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/inside-the-engine-the-sub-millisecond-performance-relay-of-mongodb-8-0/</guid><description>&lt;figure class="aligncenter size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" width="720" height="720" src="1_rM-JIRWo49QIKv-vZ4taEQ.webp" alt="" class="wp-image-121981" style="width:308px;height:auto"&gt;
&lt;/figure&gt;
&lt;p&gt;In environments where microseconds dictate competitive advantage, &lt;a href="https://www.mongodb.com/products/updates/version-release/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=mongodb-engine-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB 8.0&lt;/a&gt;
 delivers a meticulously tuned execution pipeline that transforms raw network packets into sub-millisecond query responses at global scale.{#e2e4}&lt;/p&gt;
&lt;p&gt;This reference traces a single trade query through every internal boundary network ingress, scheduling, security, parsing, planning, execution, storage‐engine internals, indexing, replication, sharding, change streams, time‐series buckets, backup, and monitoring illustrating how MongoDB 8.0&amp;rsquo;s per-CPU allocators, active-work profiling, SIMD-vectorized execution, adaptive bucketization, compact resume tokens, and refined journaling coalesce into a seamless, predictable performance engine.{#e2e4}&lt;/p&gt;</description></item><item><title>BoxLang Native Couchbase Module</title><link>https://foojayio.github.io/website/today/boxlang-couchbase-module-enterprise-caching-distributed-locking-and-ai-vector-memory/</link><pubDate>Tue, 16 Dec 2025 08:37:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/boxlang-couchbase-module-enterprise-caching-distributed-locking-and-ai-vector-memory/</guid><description>&lt;p&gt;&lt;strong&gt;Ortus Solutions&lt;/strong&gt; is thrilled to announce the official release of &lt;strong&gt;bx-couchbase v1.0&lt;/strong&gt; , a groundbreaking module that brings native enterprise-grade Couchbase capabilities to the BoxLang language and ecosystem. Designed for modern distributed applications, &lt;strong&gt;bx-couchbase&lt;/strong&gt; unifies high-performance caching, resilient distributed locking, and advanced AI vector memory&amp;mdash;empowering developers to build scalable, intelligent, fault-tolerant systems with unprecedented ease.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="h2-0-couchbase-boxlang-a-high-performance-combination"&gt;&lt;strong&gt;Couchbase + BoxLang: A High-Performance Combination&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Couchbase is more than a database&amp;mdash;it&amp;rsquo;s a distributed NoSQL platform engineered for speed, flexibility, and global scale. With sub-millisecond key-value operations, built-in vector search, and multi-data-center support, it is the ideal foundation for next-generation AI-powered applications.&lt;/p&gt;</description></item><item><title>Building Java Microservices with the Repository Pattern</title><link>https://foojayio.github.io/website/today/building-java-microservices-with-the-repository-pattern/</link><pubDate>Thu, 11 Dec 2025 23:19:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-java-microservices-with-the-repository-pattern/</guid><description>&lt;h3 id="h3-0-what-you-ll-learn"&gt;What you&amp;rsquo;ll learn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;How the MongoDB Spring repository can be used to abstract MongoDB operations&lt;/li&gt;
&lt;li&gt;Ensuring data access is separate from core application logic&lt;/li&gt;
&lt;li&gt;Why you should avoid save() and saveAll() functions in Spring&lt;/li&gt;
&lt;li&gt;Why schema and index design still matters in this case&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The repository pattern is a design method that allows for abstraction between business logic and the data of an application. This allows for retrieving and saving/updating objects without exposing the technical details of how that data is stored in the main application. In this blog, we will use Spring Boot with MongoDB in order to create a repository pattern-based application.&lt;/p&gt;</description></item><item><title>Optimizing MongoDB Queries in Java Applications</title><link>https://foojayio.github.io/website/today/optimizing-mongodb-queries-in-java-applications/</link><pubDate>Tue, 09 Dec 2025 17:45:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-mongodb-queries-in-java-applications/</guid><description>&lt;p&gt;Modern Java applications often struggle with performance bottlenecks that have little to do with the JVM itself. In most cases, the culprit lies deeper in how the application interacts with its database. Slow queries, missing indexes, or inefficient access patterns can quietly degrade user experience, increase latency, and inflate infrastructure costs. MongoDB, known for its flexibility and document-oriented design, can deliver remarkable performance when used correctly. However, that performance can quickly diminish when queries and indexes are not aligned with real-world access patterns.&lt;/p&gt;</description></item><item><title>Building Systems That Know Why They Exist ~ When Data, Logic, and Intent Finally Align</title><link>https://foojayio.github.io/website/today/building-systems-that-know-why-they-exist-when-data-logic-and-intent-finally-align/</link><pubDate>Thu, 04 Dec 2025 19:06:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-systems-that-know-why-they-exist-when-data-logic-and-intent-finally-align/</guid><description>&lt;figure class="aligncenter size-medium"&gt;
 &lt;img fetchpriority="high" decoding="async" width="510" height="510" src="1_fKlXRaOCelfpXA_XhNaitA-510x510.webp" alt="" class="wp-image-121821"&gt;
&lt;/figure&gt;
&lt;p&gt;Every software system begins with intent. A human decision. A statement of what should exist, how it should behave, and why it matters. But somewhere along the way, that intent dies. It&amp;rsquo;s decomposed into documentation, user stories, and scattered logic. It becomes a shadow of itself fragmented across layers of code, processes, and people who no longer remember what it was meant to achieve.{#7cd1}&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve automated infrastructure. We&amp;rsquo;ve scripted configurations. We&amp;rsquo;ve even made AI write code for us. But we&amp;rsquo;ve never automated &lt;strong&gt;understanding&lt;/strong&gt; . Our systems execute brilliantly yet comprehend nothing. They operate without memory of purpose. They run, but they do not know &lt;em&gt;why&lt;/em&gt;.{#657d}&lt;/p&gt;</description></item><item><title>Atlas Searching with the Java Driver</title><link>https://foojayio.github.io/website/today/atlas-searching-with-the-java-driver/</link><pubDate>Tue, 02 Dec 2025 17:28:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/atlas-searching-with-the-java-driver/</guid><description>&lt;p&gt;Dear fellow developer, welcome!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.mongodb.com/atlas/search/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=atlas-search-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;Atlas Search&lt;/a&gt;
 is a full-text search engine embedded in MongoDB Atlas that gives you a seamless, scalable experience for building relevance-based app features. Built on Apache Lucene, Atlas Search eliminates the need to run a separate search system alongside your database. The gateway to Atlas Search is the $search aggregation pipeline stage.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.mongodb.com/docs/atlas/atlas-search/query-syntax/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=atlas-search-foojay&amp;amp;utm_term=tony.kim#std-label-search-agg-pipeline" target="_blank" rel="noopener noreferrer"&gt;$search&lt;/a&gt;
 stage, as one of the newest members of the &lt;a href="https://www.mongodb.com/docs/manual/core/aggregation-pipeline/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=atlas-search-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB aggregation pipeline&lt;/a&gt;
 family, has gotten native, convenient support added to various language drivers. Driver support helps developers build concise and readable code. This article delves into using the Atlas Search support built into the MongoDB Java driver, where we&amp;rsquo;ll see how to use the driver, how to handle `$search` features that don&amp;rsquo;t yet have native driver convenience methods or have been released after the driver was released, and a glimpse into Atlas Search relevancy scoring. Let&amp;rsquo;s get started!&lt;/p&gt;</description></item><item><title>Navigating the Nuances of GraphRAG vs. RAG</title><link>https://foojayio.github.io/website/today/navigating-the-nuances-of-graphrag-vs-rag/</link><pubDate>Thu, 20 Nov 2025 21:28:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/navigating-the-nuances-of-graphrag-vs-rag/</guid><description>&lt;p&gt;While large language models (LLMs) hold immense promise for building AI applications and agentic systems, ensuring they generate reliable and trustworthy outputs remains a persistent challenge. Effective data management&amp;mdash;particularly how data is stored, retrieved, and accessed&amp;mdash;is crucial to overcoming this issue. Retrieval-augmented generation (RAG) has emerged as a widely adopted strategy, grounding LLMs in external knowledge beyond their original training data.&lt;/p&gt;
&lt;p&gt;The standard, or baseline, implementation of RAG typically relies on a vector-based approach. While effective for retrieving contextually relevant documents and references, vector-based RAG faces limitations in other situations, particularly when applications require robust reasoning capabilities and the ability to understand complex relationships between diverse concepts spread across large knowledge bases. This can lead to outputs that disappoint or even mislead end-users.&lt;/p&gt;</description></item><item><title>Service Layer Pattern in Java With Spring Boot</title><link>https://foojayio.github.io/website/today/service-layer-pattern-in-java-with-spring-boot/</link><pubDate>Tue, 18 Nov 2025 14:40:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/service-layer-pattern-in-java-with-spring-boot/</guid><description>&lt;p&gt;In modern software design, it is important to develop code that is clean and maintainable. One way developers do this is using the &lt;strong&gt;Service Layer pattern&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="h2-0-what-you-ll-learn"&gt;What you&amp;rsquo;ll learn&lt;/h2&gt;
&lt;p&gt;In this article, you&amp;rsquo;ll learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What the Service Layer pattern is and why it matters.&lt;/li&gt;
&lt;li&gt;How it fits with the MVC architecture.&lt;/li&gt;
&lt;li&gt;How to implement it in a real Spring Boot application.&lt;/li&gt;
&lt;li&gt;How to add MongoDB with minimal code.&lt;/li&gt;
&lt;li&gt;Best practices and common mistakes to avoid.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="h2-1-what-is-the-service-layer-pattern"&gt;What is the Service Layer pattern?&lt;/h2&gt;
&lt;p&gt;The Service Layer pattern is an architectural pattern that defines an application&amp;rsquo;s boundary with a layer of services that establishes a set of available operations and coordinates the application&amp;rsquo;s response in each operation.&lt;/p&gt;</description></item><item><title>Beyond Keywords: Hybrid Search With Atlas and Vector Search (Part 3)</title><link>https://foojayio.github.io/website/today/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/</link><pubDate>Thu, 13 Nov 2025 13:56:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/beyond-keywords-hybrid-search-with-atlas-and-vector-search-part-3/</guid><description>&lt;p&gt;Bringing together semantic vectors and exact keyword matching with $rankFusion&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve been following along this series, you already know we started by giving our movie search app the ability to understand meaning&amp;mdash;not just keywords&amp;mdash;using semantic search, as discussed in &lt;a href="https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/"&gt;&lt;em&gt;Part 1: Implementing Semantic Search in Java With Spring Data&lt;/em&gt;&lt;/a&gt;
. Then, we made it even smarter by adding filters and optimizing performance with embedding strategies in &lt;a href="https://foojayio.github.io/website/today/beyond-keywords-optimizing-vector-search-with-filters-and-caching-part-2/"&gt;&lt;em&gt;Part 2: Optimizing Vector Search With Filters and Caching&lt;/em&gt;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>The Cost of Not Knowing MongoDB - Part 3: (appV6R0 to appV6R4)</title><link>https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-3-appv6r0-to-appv6r4/</link><pubDate>Tue, 11 Nov 2025 19:31:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-3-appv6r0-to-appv6r4/</guid><description>&lt;p&gt;Welcome to the third and final part of the series &amp;ldquo;The Cost of Not Knowing MongoDB.&amp;rdquo; Building upon the foundational optimizations explored in &lt;a href="https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-1-appv0-to-appv4/"&gt;Part 1&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-2-appv5r0-to-appv5r4/"&gt;Part 2&lt;/a&gt;
, this article delves into advanced MongoDB design patterns that can dramatically transform application performance.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-1-appv0-to-appv4/"&gt;Part 1&lt;/a&gt;
, we improved application performance by concatenating fields, changing data types, and shortening field names. In &lt;a href="https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-2-appv5r0-to-appv5r4/"&gt;Part 2&lt;/a&gt;
, we implemented the Bucket Pattern and Computed Pattern and optimized the aggregation pipeline to achieve even better performance.&lt;/p&gt;</description></item><item><title>Modeling Relationships With Hibernate ORM and MongoDB</title><link>https://foojayio.github.io/website/today/modeling-relationships-with-hibernate-orm-and-mongodb/</link><pubDate>Tue, 04 Nov 2025 17:08:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/modeling-relationships-with-hibernate-orm-and-mongodb/</guid><description>&lt;p&gt;In the&lt;a href="https://foojayio.github.io/website/today/getting-started-with-hibernate-orm-and-mongodb/"&gt;previous article&lt;/a&gt;
&amp;mdash;&lt;em&gt;Getting Started With Hibernate ORM and MongoDB&lt;/em&gt;&amp;mdash;we learned how to configure Hibernate to work with MongoDB, create an entity, and perform basic CRUD operations using the familiar Hibernate API.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t read that first part yet, I recommend starting there before continuing. It covers the project setup, dependencies, and the fundamentals that we&amp;rsquo;ll build upon here.&lt;/p&gt;
&lt;p&gt;In this second part, we&amp;rsquo;ll &lt;strong&gt;extend our application&lt;/strong&gt; to model relationships between entities&amp;mdash;introducing a Review entity and linking it to our existing Book class. This will allow us to explore more advanced capabilities of the MongoDB Hibernate integration, including:&lt;/p&gt;</description></item><item><title>Getting Started With Hibernate ORM and MongoDB</title><link>https://foojayio.github.io/website/today/getting-started-with-hibernate-orm-and-mongodb/</link><pubDate>Tue, 04 Nov 2025 17:06:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/getting-started-with-hibernate-orm-and-mongodb/</guid><description>&lt;p&gt;For years, &lt;a href="https://hibernate.org/" target="_blank" rel="noopener noreferrer"&gt;Hibernate&lt;/a&gt;
 ORM has been one of the most popular frameworks in the Java ecosystem. It was built to simplify data persistence by letting developers work with Java objects instead of SQL statements, a technique known as &lt;em&gt;object-relational mapping (ORM)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Traditionally, Hibernate ORM has been tightly associated with relational databases like PostgreSQL, MySQL, and Oracle. It manages connections, transactions, and entity state behind the scenes, and even provides &lt;strong&gt;Hibernate Query Language (HQL)&lt;/strong&gt; so you can query your data using Java entity names rather than table names.&lt;/p&gt;</description></item><item><title>The Pitfall of Increasing Read Capacity by Reading From Secondary Nodes in a MongoDB Replica Set</title><link>https://foojayio.github.io/website/today/the-pitfall-of-increasing-read-capacity-by-reading-from-secondary-nodes-in-a-mongodb-replica-set/</link><pubDate>Thu, 30 Oct 2025 15:23:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-pitfall-of-increasing-read-capacity-by-reading-from-secondary-nodes-in-a-mongodb-replica-set/</guid><description>&lt;h2 id="h2-0-the-scenario"&gt;The scenario&lt;/h2&gt;
&lt;p&gt;Imagine we are responsible for managing the MongoDB cluster that supports our country&amp;rsquo;s national financial payment system, similar to&lt;a href="https://en.wikipedia.org/wiki/Pix_%28payment_system%29" target="_blank" rel="noopener noreferrer"&gt;Pix&lt;/a&gt;
 in Brazil. Our application was designed to be read-heavy, with one write operation for every 20 read operations.&lt;/p&gt;
&lt;p&gt;With&lt;a href="https://en.wikipedia.org/wiki/Black_Friday_%28shopping%29" target="_blank" rel="noopener noreferrer"&gt;Black Friday&lt;/a&gt;
 approaching, a critical period for our national financial payment system, we have been entrusted with the crucial task of creating a scaling plan for our cluster to handle the increased demand during this shopping spree. Given that our system is read-heavy, we are exploring ways to enhance the read performance and capacity of our cluster.&lt;/p&gt;</description></item><item><title>How MongoDB Decides What to Forget?</title><link>https://foojayio.github.io/website/today/how-mongodb-decides-what-to-forget/</link><pubDate>Tue, 28 Oct 2025 14:00:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-mongodb-decides-what-to-forget/</guid><description>&lt;figure class="aligncenter size-full is-resized"&gt;
 &lt;img fetchpriority="high" decoding="async" width="720" height="720" src="1_2RyMETT6diUSVGKdJPoQgQ.webp" alt="" class="wp-image-121588" style="width:368px;height:auto"&gt;
&lt;/figure&gt;
&lt;p&gt;Inside MongoDB&amp;rsquo;s storage engine, &lt;a href="https://www.mongodb.com/docs/manual/core/wiredtiger/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=mongodb-forget-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;WiredTiger&lt;/a&gt;
, &lt;strong&gt;nothing happens by accident.&lt;/strong&gt;{#4cf7}&lt;/p&gt;
&lt;p&gt;Every page in &lt;a href="https://www.mongodb.com/docs/atlas/sizing-tier-selection/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=mongodb-forget-foojay&amp;amp;utm_term=tony.kim#memory" target="_blank" rel="noopener noreferrer"&gt;memory&lt;/a&gt;
 exists under policy &amp;mdash; governed, measured, and continuously evaluated against the limits of RAM, I/O bandwidth, and checkpoint cadence. Eviction is not cleanup. It&amp;rsquo;s &lt;strong&gt;runtime arbitration between volatility and durability&lt;/strong&gt;.{#ba51}&lt;/p&gt;
&lt;p&gt;When the process starts, WiredTiger allocates a fixed memory region known as the &lt;strong&gt;cache arena&lt;/strong&gt; typically 50% of physical RAM. Within that space live &lt;strong&gt;B-tree pages&lt;/strong&gt; : internal nodes, leaf nodes, and history-store entries. Each page carries operational metadata: &lt;strong&gt;dirty, clean, hazard-protected, in-use, last_access_time, and generation&lt;/strong&gt; . This metadata feeds into a &lt;strong&gt;per-page score&lt;/strong&gt;, which informs the eviction subsystem&amp;rsquo;s next decision.{#61cb}&lt;/p&gt;</description></item><item><title>Beyond Keywords: Optimizing Vector Search with Filters and Caching (Part 2)</title><link>https://foojayio.github.io/website/today/beyond-keywords-optimizing-vector-search-with-filters-and-caching-part-2/</link><pubDate>Thu, 23 Oct 2025 15:44:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/beyond-keywords-optimizing-vector-search-with-filters-and-caching-part-2/</guid><description>&lt;p&gt;Enhancing precision with pre-filters and reducing costs with embedding caching&lt;/p&gt;
&lt;p&gt;Welcome back! If you landed here without reading &lt;a href="https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/"&gt;&lt;em&gt;Part 1: Beyond Keywords: Implementing Semantic Search in Java With Spring Data&lt;/em&gt;&lt;/a&gt;
, I recommend going back and checking it first so the steps in this article make more sense in sequence.&lt;/p&gt;
&lt;p&gt;This is the second part of a &lt;strong&gt;three-part series&lt;/strong&gt; where we&amp;rsquo;re building a movie search application. So far, our app supports &lt;strong&gt;semantic search&lt;/strong&gt; using vector queries with Spring Data and Voyage AI. In this article, we&amp;rsquo;ll take things further:&lt;/p&gt;</description></item><item><title>The Cost of Not Knowing MongoDB - Part 2</title><link>https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-2-appv5r0-to-appv5r4/</link><pubDate>Tue, 21 Oct 2025 14:26:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-2-appv5r0-to-appv5r4/</guid><description>&lt;p&gt;This is the second part of the series &amp;ldquo;The Cost of Not Knowing MongoDB,&amp;rdquo; where we go through many ways we can model our MongoDB schemas for the same application and have different performances. In the &lt;a href="https://www.mongodb.com/developer/products/mongodb/cost-of-not-knowing-mongodb/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=cost-part2-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;first part&lt;/a&gt;
 of the series, we concatenated fields, changed data types, and short-handed field names to improve the application performance. In this second part, as discussed in the &lt;a href="https://www.mongodb.com/developer/products/mongodb/cost-of-not-knowing-mongodb/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=cost-part2-foojay&amp;amp;utm_term=tony.kim#issues-and-improvements:~:text=than%20appV3.-,Issues%20and%20improvements,-Enough%20of%20focusing" target="_blank" rel="noopener noreferrer"&gt;issues and improvement of appV4&lt;/a&gt;
, the performance gains will be achieved by analyzing the application behavior and how it stores and reads its data, leading us to the use of the &lt;a href="https://www.mongodb.com/blog/post/building-with-patterns-the-bucket-pattern/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=cost-part2-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;Bucket Pattern&lt;/a&gt;
 and the &lt;a href="https://www.mongodb.com/blog/post/building-with-patterns-the-computed-pattern/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=cost-part2-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;Computed Pattern&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Beyond Keywords: Implementing Semantic Search in Java With Spring Data (Part 1)</title><link>https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/</link><pubDate>Thu, 16 Oct 2025 13:39:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/beyond-keywords-implementing-semantic-search-in-java-with-spring-data-part-1/</guid><description>&lt;p&gt;Building a semantic movie search app with embeddings and vector queries&lt;/p&gt;
&lt;p&gt;Have you ever tried to search for something such as a product, a song, or a movie but couldn&amp;rsquo;t quite remember its exact name? Maybe you recall only a clue&amp;mdash;a desert pyramid, a short melody, or &amp;ldquo;that ship that hit an iceberg.&amp;rdquo; Keyword search struggles with that. Vector search doesn&amp;rsquo;t: It lets you search by meaning.&lt;/p&gt;
&lt;p&gt;It works by turning text into embeddings, vectors (arrays of numbers) that capture semantic similarity, so results are ranked by what they mean, not just what they say.&lt;/p&gt;</description></item><item><title>The Cost of Not Knowing MongoDB (Part 1)</title><link>https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-1-appv0-to-appv4/</link><pubDate>Tue, 14 Oct 2025 13:43:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-cost-of-not-knowing-mongodb-part-1-appv0-to-appv4/</guid><description>&lt;p&gt;The primary focus of this series is to show how much performance you can gain, and as a consequence, the cost you can save when using &lt;a href="https://www.mongodb.com/lp/cloud/atlas/try4-reg/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=cost-part1-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 properly, following the best practices, studying your application needs, and using it to model your data.&lt;/p&gt;
&lt;p&gt;To show these possible gains, a dummy application will be presented, and many possible implementations of it using MongoDB will be developed and load-tested. There will be implementations for all levels of MongoDB knowledge: beginner, intermediate, senior, and mind-blowing (🤯) .&lt;/p&gt;</description></item><item><title>Keywords Meet Vectors: Hybrid Search on MongoDB</title><link>https://foojayio.github.io/website/today/keywords-meet-vectors-hybrid-search-on-mongodb/</link><pubDate>Thu, 09 Oct 2025 14:49:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/keywords-meet-vectors-hybrid-search-on-mongodb/</guid><description>&lt;p&gt;In the previous issues, I explained how to run a local &lt;a href="https://www.linkedin.com/company/mongodbinc/?lipi=urn%3Ali%3Apage%3Ad_flagship3_pulse_read%3BnV1cKI74RDKmiAI4lr1TaA%3D%3D" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 Atlas cluster using &lt;a href="https://www.linkedin.com/pulse/run-local-atlas-cluster-minutes-locally-arek-borucki-mmiqf/?trackingId=M71jHZpGSQCdFygE5EgAOw%3D%3D" target="_blank" rel="noopener noreferrer"&gt;Atlas CLI&lt;/a&gt;
, what &lt;a href="https://www.linkedin.com/pulse/power-your-ai-application-vector-search-arek-borucki-sjw0f/?trackingId=vjRobV3lSdy1nc4SIgjM%2Fg%3D%3D" target="_blank" rel="noopener noreferrer"&gt;vector search&lt;/a&gt;
 is, and &lt;a href="https://www.linkedin.com/pulse/from-zero-vector-hero-locally-arek-borucki-w5otf/?trackingId=S%2FClUOdjSMGzvkR2ZLIS9Q%3D%3D" target="_blank" rel="noopener noreferrer"&gt;how to use it&lt;/a&gt;
. Now, let&amp;rsquo;s take a closer look at hybrid search.&lt;/p&gt;
&lt;p&gt;Reading time: 4&amp;ndash;5 min&lt;/p&gt;
&lt;h2 id="h2-0-what-is-hybrid-search"&gt;What is hybrid search?&lt;/h2&gt;
&lt;p&gt;Hybrid search in MongoDB brings together &lt;strong&gt;two complementary search techniques&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full text search&lt;/strong&gt; (&lt;a href="https://en.wikipedia.org/wiki/Okapi_BM25" target="_blank" rel="noopener noreferrer"&gt;BM25&lt;/a&gt;
 via &lt;a href="https://www.mongodb.com/docs/atlas/atlas-search/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=hybrid-search-foojay&amp;amp;utm_term=megan.grant" target="_blank" rel="noopener noreferrer"&gt;Atlas Search&lt;/a&gt;
)&amp;mdash;optimized for exact keyword matches, powered by Lucene inside mongot. Perfect when users expect documents that literally contain their query terms.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vector search&lt;/strong&gt; (&lt;a href="https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm" target="_blank" rel="noopener noreferrer"&gt;kNN&lt;/a&gt;
 via &lt;a href="https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-overview/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=hybrid-search-foojay&amp;amp;utm_term=megan.grant" target="_blank" rel="noopener noreferrer"&gt;Atlas Vector Search&lt;/a&gt;
)&amp;mdash;optimized for semantic similarity. It uses dense embeddings from ML models to find conceptually related content, even when no keywords match.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On their own, each method has advantages and limitations. Text search misses context (&amp;ldquo;non-linear crime story&amp;rdquo; won&amp;rsquo;t return Memento). Pure semantic search may return results that are semantically aligned but sometimes not practically useful. Hybrid search combines the strengths of both, ensuring results are contextually relevant and precise.&lt;/p&gt;</description></item><item><title>Working with Geo Location Data in MongoDB</title><link>https://foojayio.github.io/website/today/working-with-geo-location-data/</link><pubDate>Tue, 07 Oct 2025 14:01:53 +0000</pubDate><guid>https://foojayio.github.io/website/today/working-with-geo-location-data/</guid><description>&lt;p&gt;&lt;a href="https://www.mongodb.com/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=geo-mongodb-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 makes it really easy to work with location data (sometimes called Geo Data) by simplifying how to store this type of data and streamlining how you query for it so you can easily create &amp;ldquo;find nearby&amp;rdquo; queries, or plot your location data with ease!&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the basics: modeling your data, indexing it properly, running geo queries, and then displaying results on a map.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model Your Data with GeoJSON&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Agents Meet Databases: The Future of Agentic Architectures</title><link>https://foojayio.github.io/website/today/agents-meet-databases-the-future-of-agentic-architectures/</link><pubDate>Thu, 02 Oct 2025 15:01:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/agents-meet-databases-the-future-of-agentic-architectures/</guid><description>&lt;p&gt;With 2025 hailed as &amp;ldquo;the year of agents&amp;rdquo; by &lt;a href="https://www.barrons.com/articles/nvidia-stock-ceo-ai-agents-8c20ddfb" target="_blank" rel="noopener noreferrer"&gt;NVIDIA CEO Jensen Huang&lt;/a&gt;
 and &lt;a href="https://www.axios.com/2025/01/23/davos-2025-ai-agents" target="_blank" rel="noopener noreferrer"&gt;OpenAI CPO Kevin Weil&lt;/a&gt;
, AI agents are increasingly of interest to organizations across industries. These autonomous systems will often need to interact with databases, where much of the world&amp;rsquo;s valuable data resides. According to &lt;a href="https://www.seagate.com/files/www-content/our-story/trends/files/Seagate-WP-DataAge2025-March-2017.pdf" target="_blank" rel="noopener noreferrer"&gt;IDC&amp;rsquo;s Data Age 2025 report&lt;/a&gt;
, enterprises will manage nearly 60% of the world&amp;rsquo;s data by 2025, most of it organized in databases. As a result, databases will be central to agentic architectures, and the success of agent deployments will depend on how well they connect and interact with them.&lt;/p&gt;</description></item><item><title>Introduction to Data-Driven Testing with Java and MongoDB</title><link>https://foojayio.github.io/website/today/introduction-to-data-driven-testing-with-java-and-mongodb/</link><pubDate>Thu, 25 Sep 2025 13:53:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/introduction-to-data-driven-testing-with-java-and-mongodb/</guid><description>&lt;p&gt;As applications expand, the complexity of the rules they enforce also increases. In many systems, these rules are embedded within the data, primarily in database queries that filter, join, or compute based on real-world conditions. However, the tests for these queries are often shallow, repetitive, or, worse yet, completely absent. When there is an error in the database logic, the application may still compile successfully, but the business can suffer significant consequences.&lt;/p&gt;</description></item><item><title>Power your AI application with Vector Search</title><link>https://foojayio.github.io/website/today/power-your-ai-application-with-vector-search/</link><pubDate>Tue, 23 Sep 2025 16:23:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/power-your-ai-application-with-vector-search/</guid><description>&lt;p&gt;Most major database vendors, like &lt;a href="https://www.mongodb.com/lp/cloud/atlas/try4-reg/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=foojay-vector-search&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 , are adding vector search capabilities to their products. It&amp;rsquo;s becoming a standard feature as demand for AI-powered applications grows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🕒 Reading time: 3-4 min&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🧠 What is vector search needed for?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MongoDB Vector Search enables semantic queries. For example, finding support tickets with similar meanings even if they use different words. It also powers hybrid search by combining exact keyword matches like &amp;ldquo;error 500&amp;rdquo; with semantically similar phrases like &amp;ldquo;server failure&amp;rdquo;. Another use case is personalization, such as recommending articles similar to those a user has read.&lt;/p&gt;</description></item><item><title>From Zero to Vector Hero - Locally! (Vector Search)</title><link>https://foojayio.github.io/website/today/from-zero-to-vector-hero-locally/</link><pubDate>Thu, 18 Sep 2025 15:25:23 +0000</pubDate><guid>https://foojayio.github.io/website/today/from-zero-to-vector-hero-locally/</guid><description>&lt;p&gt;In the previous issue, I explained how to run a local &lt;a href="https://www.mongodb.com/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=vector-search-3&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 Atlas cluster using Atlas CLI - no cloud account required. If you missed it, read it here 👉 Run an Atlas cluster locally in minutes. Now let&amp;rsquo;s see how to use Vector Search in that local environment.&lt;/p&gt;
&lt;p&gt;🕒 Reading time: 3-4 min&lt;/p&gt;
&lt;p&gt;🧠 Explaining the Embedding Workflow&lt;/p&gt;
&lt;p&gt;After launching your local MongoDB Atlas cluster and running the show dbs command in mongosh, you&amp;rsquo;ll see only the default system databases: admin, config, and local. These are used internally by MongoDB and contain no user data or vector embeddings at this point.&lt;/p&gt;</description></item><item><title>Best Practices for Deploying MongoDB in Kubernetes</title><link>https://foojayio.github.io/website/today/best-practices-for-deploying-mongodb-in-kubernetes/</link><pubDate>Tue, 16 Sep 2025 19:01:34 +0000</pubDate><guid>https://foojayio.github.io/website/today/best-practices-for-deploying-mongodb-in-kubernetes/</guid><description>&lt;p&gt;&lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
, also known as K8s, is an open-source system that simplifies the deployment, scaling, and management of containerized applications. You define your application&amp;rsquo;s desired state, such as the number of instances (&lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/" target="_blank" rel="noopener noreferrer"&gt;pods&lt;/a&gt;
) or how they communicate, and Kubernetes works continuously to ensure that state is met. It excels at running stateless workloads, where pods can be replaced at any time without impacting application state or user data. Think of web servers or REST APIs: If a pod crashes, Kubernetes simply spins up a replacement and everything continues as expected.&lt;/p&gt;</description></item><item><title>MongoDB Schemas in Java</title><link>https://foojayio.github.io/website/today/mongodb-schemas-in-java/</link><pubDate>Thu, 11 Sep 2025 13:15:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-schemas-in-java/</guid><description>&lt;p&gt;If (like me!) you prefer to read code rather than a long and boring article, jump straight to the example! TLDR; here&amp;rsquo;s the &lt;a href="https://github.com/luketn/mongodb-schemas-in-java" target="_blank" rel="noopener noreferrer"&gt;code&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;You can clone and run the tests like this:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;git clone https://github.com/luketn/mongodb-schemas-in-java&amp;nbsp;
cd mongodb-schemas-in-java&amp;nbsp;
mvn test&lt;/pre&gt;
&lt;p&gt;And if you want to play with the example API visually (like I do!) and you have a local Mongo or an Atlas Cluster with the &lt;a href="https://www.mongodb.com/docs/guides/atlas/sample-data/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=mongodb-schemas-java&amp;amp;utm_term=megan.grant" target="_blank" rel="noopener noreferrer"&gt;Weather Sample&lt;/a&gt;
 data, run:&lt;/p&gt;</description></item><item><title>Building REST APIs in Java with Spring Boot</title><link>https://foojayio.github.io/website/today/building-rest-apis-in-java-with-spring-boot/</link><pubDate>Tue, 09 Sep 2025 14:51:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-rest-apis-in-java-with-spring-boot/</guid><description>&lt;p&gt;REST has become the default choice for building web services, and for good reason. It&amp;rsquo;s straightforward to implement, easy for clients to consume, and built directly on top of the same principles of the web itself.&lt;/p&gt;
&lt;p&gt;HTTP already gives us well-defined methods (GET, POST, PUT, DELETE), built-in caching, redirect support, secure transport via TLS, and widespread tooling support across platforms. REST doesn&amp;rsquo;t reinvent the web&amp;mdash;it uses it.&lt;/p&gt;
&lt;p&gt;REST is not a protocol or a rigid standard. It&amp;rsquo;s a lightweight architectural approach that encourages scalable, evolvable, and interoperable services. Its creator, Roy Fielding, helped define many of the specs that underpin the web today.&lt;/p&gt;</description></item><item><title>MongoDB Aggregations: Organizing Recipes by Meal Type with $group</title><link>https://foojayio.github.io/website/today/mongodb-aggregations-organizing-recipes-by-meal-type-with-group/</link><pubDate>Thu, 04 Sep 2025 05:31:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-aggregations-organizing-recipes-by-meal-type-with-group/</guid><description>&lt;p&gt;In this series, we&amp;rsquo;re exploring different &lt;a href="https://www.mongodb.com/docs/manual/aggregation/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=recipe-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB aggregation operators&lt;/a&gt;
 by applying them to a recipe collection. I hope you&amp;rsquo;ll follow along with each post!&lt;/p&gt;
&lt;p&gt;MongoDB Aggregations Series&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learnmongo.com/mongodb-aggregations-finding-cooking-times-with-min-and-max/" target="_blank" rel="noopener noreferrer"&gt;MongoDB Aggregations: Finding Cooking Times with $min and $max&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MongoDB Aggregations: Organizing Recipes by Meal Type with $group&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As part of this series, we are imagining you&amp;rsquo;re building a recipe website. For this post, we are adding some new features to our site, including allowing users to browse recipes by meal type&amp;mdash;breakfast, lunch, dinner, etc.&lt;/p&gt;</description></item><item><title>Copy of Queryable Encryption with Spring Data MongoDB: How to Query Encrypted Fields</title><link>https://foojayio.github.io/website/today/queryable-encryption-with-spring-data-mongodb-how-to-query-encrypted-fields/</link><pubDate>Tue, 02 Sep 2025 19:00:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/queryable-encryption-with-spring-data-mongodb-how-to-query-encrypted-fields/</guid><description>&lt;p&gt;Information is one of the most valuable assets in computing and keeping it protected is even more critical. When we talk about data protection, it&amp;rsquo;s not just about preventing breaches or leaks; it&amp;rsquo;s also about complying with privacy regulations and protecting user data.&lt;/p&gt;
&lt;p&gt;MongoDB provides strong encryption capabilities, including in transit, at rest, and in use. The Queryable Encryption feature falls into the &lt;em&gt;in use&lt;/em&gt; category. It allows data to be encrypted on the client side, so that even with access to the database and its credentials, no one can read the protected fields without the proper encryption key. At the same time, it supports querying over encrypted fields, making it possible to filter, match, or retrieve data without compromising confidentiality.&lt;/p&gt;</description></item><item><title>What happens when a Primary fails in a MongoDB replica set?</title><link>https://foojayio.github.io/website/today/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/</link><pubDate>Tue, 26 Aug 2025 15:14:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/what-happens-when-a-primary-fails-in-a-mongodb-replica-set-automatic-failovers/</guid><description>&lt;p&gt;In distributed systems, high availability is not a luxury&amp;mdash;it&amp;rsquo;s a necessity. And one of the very important parts of that is automatic failovers. What are automatic failovers and how do they work? Let&amp;rsquo;s see today!&lt;/p&gt;
&lt;p&gt;These concepts are actually similar in every database, but as &lt;a href="https://www.mongodb.com/cloud/atlas/register/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=shrey-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 is natively built for replica-sets, we will talk about that here, whereas other DB systems need 3rd-party or managed systems to implement the same.&lt;/p&gt;</description></item><item><title>Managing MongoDB Database Changes Using Liquibase Pro</title><link>https://foojayio.github.io/website/today/managing-mongodb-database-changes-using-liquibase-pro/</link><pubDate>Wed, 20 Aug 2025 14:21:51 +0000</pubDate><guid>https://foojayio.github.io/website/today/managing-mongodb-database-changes-using-liquibase-pro/</guid><description>&lt;p&gt;This article explores how Liquibase and MongoDB can be integrated with Git actions to implement source control for database changes.&lt;/p&gt;
&lt;h2 id="h2-0-what-is-liquibase"&gt;What is Liquibase?&lt;/h2&gt;
&lt;p&gt;Liquibase is an open-source tool designed to manage version control for database schema changes. It allows developers to simplify and automate the process of applying database updates across various database platforms.&lt;/p&gt;
&lt;p&gt;By using database-independent formats like XML, YAML, or JSON, Liquibase enables teams to define changes in a consistent and structured way. In a Java project, these updates are organized into files containing &lt;em&gt;changesets&lt;/em&gt;, which outline the specific instructions needed to modify or refactor the database schema.&lt;/p&gt;</description></item><item><title>Domain-Driven Design in Java: A Practical Guide</title><link>https://foojayio.github.io/website/today/domain-driven-design-in-java-a-practical-guide/</link><pubDate>Fri, 15 Aug 2025 09:30:31 +0000</pubDate><guid>https://foojayio.github.io/website/today/domain-driven-design-in-java-a-practical-guide/</guid><description>&lt;p&gt;While waiting for your flight in an airport, have you ever wondered how much behind-the-scenes planning it takes to keep an airport running smoothly? Every day, thousands of flights take off and land, passengers rush through terminals, and staff work tirelessly to make sure everything unfolds without a hitch. What looks like chaos on the surface is actually the result of a highly coordinated system&amp;mdash;a kind of &amp;ldquo;brain&amp;rdquo; that&amp;rsquo;s always working in the background to manage logistics, adapt to surprises, and keep the airport humming along.&lt;/p&gt;</description></item><item><title>Enforcing Governance in MongoDB Atlas with Resource Policies</title><link>https://foojayio.github.io/website/today/enforcing-governance-in-mongodb-atlas-with-resource-policies/</link><pubDate>Wed, 13 Aug 2025 12:52:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/enforcing-governance-in-mongodb-atlas-with-resource-policies/</guid><description>&lt;p&gt;The growing adoption of &lt;a href="https://www.mongodb.com/lp/cloud/atlas/try4-reg/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=samuel-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;MongoDB Atlas&lt;/a&gt;
 as a managed database platform increasingly demands mechanisms that align security, compliance, and governance. In April 2025, MongoDB introduced a critical feature for this purpose: &lt;a href="https://www.mongodb.com/en-us/docs/atlas/atlas-resource-policies/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=samuel-foojay&amp;amp;utm_term=tony.kim" target="_blank" rel="noopener noreferrer"&gt;&lt;strong&gt;Resource Policies&lt;/strong&gt;&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;This article presents the concept and capabilities of Resource Policies, highlights their importance in enterprise environments, and demonstrates how to use them effectively via Terraform &amp;mdash; ensuring that essential configurations rely not only on best practices but also on enforceable and auditable constraints.&lt;/p&gt;</description></item><item><title>Why Mirroring Production in Dev Helps You Avoid Costly Mistakes</title><link>https://foojayio.github.io/website/today/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/</link><pubDate>Mon, 28 Jul 2025 13:31:10 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-mirroring-production-in-dev-helps-you-avoid-costly-mistakes/</guid><description>&lt;p&gt;&lt;strong&gt;Many developers start building their applications with MongoDB using a free M0 cluster or a local environment. While this is common and convenient, it can lead to issues that could easily be avoided by using a more robust setup, such as a development cluster that closely mirrors production. Problems like inefficient queries, missing indexes, or even costly mistakes often go unnoticed in limited environments like M0 or local setups.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll explore why your development environment should closely reflect your production environment, and how using an M10+ cluster with tools like Query Profiler and Performance Advisor can help you catch performance issues early and build with confidence.&lt;/p&gt;</description></item><item><title>MongoDB ACID Transactions With Java</title><link>https://foojayio.github.io/website/today/mongodb-acid-transactions-with-java/</link><pubDate>Wed, 23 Jul 2025 14:39:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-acid-transactions-with-java/</guid><description>&lt;p&gt;A database is constantly under pressure. Real-time applications, exponential growth of data, and multiple operations may hit the system at once. Without coordination, this can lead to race conditions, conflicts, and ultimately, the dreaded inconsistent data! To address this, MongoDB supports &lt;a href="https://learn.mongodb.com/courses/mongodb-transactions?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=java&amp;#43;acid&amp;amp;utm_term=tim.kelly" target="_blank" rel="noopener noreferrer"&gt;transactions&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Transactions let us group multiple operations together so they either all succeed or none take effect, a concept known as &lt;a href="https://www.mongodb.com/docs/manual/reference/glossary/#std-term-atomic-operation?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=java&amp;#43;acid&amp;amp;utm_term=tim.kelly" target="_blank" rel="noopener noreferrer"&gt;atomicity&lt;/a&gt;
. MongoDB&amp;rsquo;s document model already provides atomicity at the single-document level, which covers a lot of use cases. But when you need atomicity across multiple documents or collections, transactions are the answer.&lt;/p&gt;</description></item><item><title>How to Make a RAG Application With LangChain4j</title><link>https://foojayio.github.io/website/today/how-to-make-a-rag-application-with-langchain4j/</link><pubDate>Thu, 17 Jul 2025 20:42:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-make-a-rag-application-with-langchain4j/</guid><description>&lt;p&gt;Retrieval-augmented generation, or RAG, introduces some serious capabilities to your large language models (LLMs). These applications can answer questions about your specific corpus of knowledge, while leveraging all the nuance and sophistication of a traditional LLM.&lt;/p&gt;
&lt;p&gt;This tutorial will take you through the ins and outs of creating a Q&amp;amp;A chatbot using RAG. The application will:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Retrieve data from a MongoDB Atlas database.&lt;/li&gt;
&lt;li&gt;Embed and store documents as vector embeddings.&lt;/li&gt;
&lt;li&gt;Use LangChain4J to query the database and augment LLM prompts with the retrieved data.&lt;/li&gt;
&lt;li&gt;Enable secure, scalable, and efficient AI-powered applications.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to see the completed application, it is available in the &lt;a href="https://github.com/mongodb-developer/langchainrag" target="_blank" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>The Great Data Reimagination: From Static to Agile in the AI Era</title><link>https://foojayio.github.io/website/today/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/</link><pubDate>Tue, 15 Jul 2025 13:44:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-great-data-reimagination-from-static-to-agile-in-the-ai-era/</guid><description>&lt;p&gt;&lt;strong&gt;We&amp;rsquo;re in the middle of a fundamental change in how enterprise software works. In the next decade, your database will become your AI.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just five years ago, choosing the right kind of database to support their applications presented complexity for many developers: relational or NoSQL? Structured or unstructured? Flexible or predictable? They didn&amp;rsquo;t know exactly what their data would look like in six months, but what they did know was that it was certain to change. This led many to make a rebel&amp;rsquo;s choice to reject the rigid structure of &lt;a href="https://thenewstack.io/introduction-to-databases/" target="_blank" rel="noopener noreferrer"&gt;SQL databases&lt;/a&gt;
 for something more fluid and adaptable.&lt;/p&gt;</description></item><item><title>Building a Spring Boot CRUD Application Using MongoDB’s Relational Migrator</title><link>https://foojayio.github.io/website/today/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/</link><pubDate>Tue, 08 Jul 2025 19:05:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-spring-boot-crud-application-using-mongodbs-relational-migrator/</guid><description>&lt;p&gt;Imagine this: You&amp;rsquo;re working with a relational database that&amp;rsquo;s served you well for years, but now your applications demand flexibility, scalability, and faster development cycles. Transitioning from structured tables to MongoDB&amp;rsquo;s dynamic, schema-less JSON documents might be daunting. That&amp;rsquo;s where MongoDB&amp;rsquo;s Relational Migrator becomes your secret weapon.&lt;/p&gt;
&lt;p&gt;The Relational Migrator tool built by MongoDB no longer only supports migrating data from relational databases to MongoDB. Rather, it supports features like code generation and also a query converter that converts a relational database, such as a Postgres query, or queries from views and stored procedures, into a MongoDB query.&lt;/p&gt;</description></item><item><title>Data Modeling for Java Developers: Structuring With PostgreSQL and MongoDB</title><link>https://foojayio.github.io/website/today/data-modeling-for-java-developers-structuring-with-postgresql-and-mongodb/</link><pubDate>Thu, 03 Jul 2025 21:02:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/data-modeling-for-java-developers-structuring-with-postgresql-and-mongodb/</guid><description>&lt;p&gt;&lt;strong&gt;Application and system designs have always been considered the most essential step in application development. All the later steps and technologies to be used depend on how the system has been designed. If you are a Java developer, choosing the right approach can mean distinguishing between a rigid, complex schema and a nimble, scalable solution. If you are a Java developer who works with PostgreSQL or other relational databases, you understand the pain of representing the many-to-many relationships between the tables.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Java Virtual Threads in Action: Optimizing MongoDB Operation</title><link>https://foojayio.github.io/website/today/java-virtual-threads-in-action-optimizing-mongodb-operation/</link><pubDate>Tue, 01 Jul 2025 08:12:24 +0000</pubDate><guid>https://foojayio.github.io/website/today/java-virtual-threads-in-action-optimizing-mongodb-operation/</guid><description>&lt;p&gt;Virtual threads have become one of the most popular resources in Java and are trending inside the language. Indeed, this resource introduced a cheap way to create threads inside the JVM. In this tutorial, we will explain how to use it with MongoDB.&lt;/p&gt;
&lt;p&gt;You can find all the code presented in this tutorial in the &lt;a href="https://github.com/soujava/mongodb-virtual-threads" target="_blank" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;
:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;git clone &lt;a href="https://foojayio.github.io/website/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fe99978abe99978a968b9cd09d9193"&gt;[email&amp;nbsp;protected]&lt;/a&gt;:soujava/mongodb-virtual-threads.git
&lt;/pre&gt;
&lt;h2 id="h2-0-prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;For this tutorial, you&amp;rsquo;ll need:&lt;/p&gt;</description></item><item><title>How to Identify the Underlying Causes of Connection Timeout Errors for MongoDB With Java</title><link>https://foojayio.github.io/website/today/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/</link><pubDate>Thu, 26 Jun 2025 12:13:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-identify-the-underlying-causes-of-connection-timeout-errors-for-mongodb-with-java/</guid><description>&lt;p&gt;Java developers and &lt;a href="https://dzone.com/refcardz/mongodb" target="_blank" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;
 are like Aladdin and the Genie from Arabian Nights. Developers rub the lamp with their wildest NoSQL wishes, and MongoDB swoops in, granting &lt;a href="https://dzone.com/refcardz/getting-started-with-spring-boot-and-microservices" target="_blank" rel="noopener noreferrer"&gt;Spring Boot microservices&lt;/a&gt;
 and REST APIs the magic they need to soar. But every so often, a Jafar-like menace swoops in, forcing our Aladdin (Java devs) to wrestle with sleepless nights. One such villainous foe is the connection timeout, locking APIs in a cave of wonders with no escape, leaving developers yearning for a magic carpet fix.&lt;/p&gt;</description></item><item><title>Clean and Modular Java: A Hexagonal Architecture Approach</title><link>https://foojayio.github.io/website/today/clean-and-modular-java-a-hexagonal-architecture-approach/</link><pubDate>Tue, 24 Jun 2025 08:03:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/clean-and-modular-java-a-hexagonal-architecture-approach/</guid><description>&lt;p&gt;One of the discussions that always leaves me with both doubts and excitement is the one about system architecture. Ever since I started diving deeper into programming, I&amp;rsquo;ve encountered questions like how to separate packages and modules: is it really worth creating so many divisions? I must admit, it&amp;rsquo;s often complicated to understand or make decisions without being fully sure that I&amp;rsquo;m doing the right thing.&lt;/p&gt;
&lt;p&gt;Right from the start, I want to make it clear that this content will definitely spark a lot of discussion around best practices and whether what I&amp;rsquo;m doing is correct &amp;mdash; but, above all, I guarantee it will be fun!&lt;/p&gt;</description></item><item><title>Multi-cloud Strategies With MongoDB Atlas</title><link>https://foojayio.github.io/website/today/multi-cloud-strategies-with-mongodb-atlas/</link><pubDate>Thu, 19 Jun 2025 11:49:29 +0000</pubDate><guid>https://foojayio.github.io/website/today/multi-cloud-strategies-with-mongodb-atlas/</guid><description>&lt;p&gt;&lt;strong&gt;In the technological world, the cloud has become more prevalent. It brings many benefits, including flexibility, scalability, faster innovation, and collaboration. Plus, when it comes to data storage and access with databases, it allows data to be located closer to the user for lower latency and thus, faster performance.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most people have heard of the big cloud providers, such as Azure from Microsoft, Google Cloud, and Amazon Web Services (AWS). But when it comes to a business selecting a cloud provider, how do you choose?&lt;/p&gt;</description></item><item><title>Your Complete Guide to Diagnose Slow Queries in MongoDB</title><link>https://foojayio.github.io/website/today/your-complete-guide-to-diagnose-slow-queries-in-mongodb/</link><pubDate>Tue, 17 Jun 2025 04:06:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/your-complete-guide-to-diagnose-slow-queries-in-mongodb/</guid><description>&lt;p&gt;MongoDB is built to be fast. The real win comes from knowing how to keep it that way, even as your app grows and your data gets more complex.&lt;/p&gt;
&lt;p&gt;This tutorial is for those developers and engineers who want to understand how MongoDB behaves when queries or writes slow down. We&amp;rsquo;re not here to hand you indexing tips or premature advice about schema design. We&amp;rsquo;re here to walk through the actual tools MongoDB gives you to observe, measure, and reason about query performance, before you start optimizing anything.&lt;/p&gt;</description></item><item><title>Performance Best Practise No. 1: Optimize Database Operations</title><link>https://foojayio.github.io/website/today/performance-best-practise-no-1-optimize-database-operations/</link><pubDate>Wed, 11 Jun 2025 13:24:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/performance-best-practise-no-1-optimize-database-operations/</guid><description>&lt;p&gt;Database operations are a very critical part of most applications in regards of performance. There are multiple reasons why database operations can significantly contribute to lower performance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The database often runs on a remote server, slowing down communication with the database and the data transfer&lt;/li&gt;
&lt;li&gt;Establishing individual connections to a database can take a significant portion of time compared to running the whole database query&lt;/li&gt;
&lt;li&gt;Database queries can run for a long time&lt;/li&gt;
&lt;li&gt;Network communication is unstable and may required restarting queries in case of network failures&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can address the above issues and boost Jakarta EE database performance by leveraging the following best practices.&lt;/p&gt;</description></item><item><title>Intro to RAG: Foundations of Retrieval Augmented Generation, part 2</title><link>https://foojayio.github.io/website/today/intro-to-rag-foundations-of-retrieval-augmented-generation-part-2/</link><pubDate>Tue, 10 Jun 2025 21:54:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/intro-to-rag-foundations-of-retrieval-augmented-generation-part-2/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/intro-to-rag-foundations-of-retrieval-augmented-generation-part-1/"&gt;the last post&lt;/a&gt;
, we discussed the basics of Retrieval Augmented Generation (RAG) and how it enhances the capabilities of Large Language Models (LLMs) by integrating them with external knowledge sources. We also introduced the concept of vector embeddings and their role in semantic search.&lt;/p&gt;
&lt;p&gt;In this post, we&amp;rsquo;ll dive deeper into the different layers of RAG, including vector RAG, graph RAG, and agents. We&amp;rsquo;ll explore how these layers can be combined to create more powerful and effective AI systems.&lt;/p&gt;</description></item><item><title>MongoDB Aggregation Framework: A Beginner’s Guide</title><link>https://foojayio.github.io/website/today/mongodb-aggregation-framework-a-beginners-guide/</link><pubDate>Thu, 05 Jun 2025 06:20:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/mongodb-aggregation-framework-a-beginners-guide/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/CbYitR4mR6I?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;p&gt;Finding exactly the data we need isn&amp;rsquo;t always a simple task.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ve probably faced situations where you needed to filter information, group it, and even perform calculations to produce a final result.&lt;/p&gt;
&lt;p&gt;And often, delivering this processed data to the client is essential for the application&amp;rsquo;s success. MongoDB offers two main ways to fetch data:&lt;/p&gt;</description></item><item><title>Testing MongoDB Atlas Search Java Apps Using TestContainers</title><link>https://foojayio.github.io/website/today/testing-mongodb-atlas-search-java-apps-using-testcontainers/</link><pubDate>Thu, 29 May 2025 18:07:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/testing-mongodb-atlas-search-java-apps-using-testcontainers/</guid><description>&lt;p&gt;This will be an exploration of testing MongoDB Atlas Search solutions written in Java using TestContainers and JUnit5. We&amp;rsquo;ll start simple and build up to more advanced uses which load seed data and provide an environment for consistent and easy to maintain tests.&lt;/p&gt;
&lt;p&gt;TLDR; if (like me!) you want to get straight to the code rather than reading lots of tedious words:&lt;/p&gt;
&lt;pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""&gt;git clone https://github.com/luketn/mongodb-atlas-local-testcontainers.git
cd mongodb-atlas-local-testcontainers
mvn test&lt;/pre&gt;
&lt;h2 id="h2-0-what-is-mongodb-atlas-search-anyway"&gt;What is MongoDB Atlas Search, anyway?&lt;/h2&gt;
&lt;p&gt;MongoDB Atlas Search is an extension to the built-in indexing capabilities that are part of MongoDB itself, using the awesome open source indexing and query library &lt;a href="https://lucene.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Lucene&lt;/a&gt;
. MongoDB has built a wrapper around Lucene called &lt;a href="https://www.mongodb.com/docs/atlas/atlas-search/?utm_campaign=devrel&amp;amp;utm_source=third-party-content&amp;amp;utm_medium=cta&amp;amp;utm_content=Testing&amp;#43;MongoDB&amp;#43;Atlas&amp;#43;Search&amp;#43;Java&amp;#43;Apps&amp;#43;Using&amp;#43;TestContainers&amp;amp;utm_term=megan.grant#fts-architecture/" target="_blank" rel="noopener noreferrer"&gt;mongot&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Intro to RAG: Foundations of Retrieval Augmented Generation, part 1</title><link>https://foojayio.github.io/website/today/intro-to-rag-foundations-of-retrieval-augmented-generation-part-1/</link><pubDate>Tue, 27 May 2025 14:42:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/intro-to-rag-foundations-of-retrieval-augmented-generation-part-1/</guid><description>&lt;p&gt;Retrieval Augmented Generation (RAG) may sound complex, but it accurately represents the process of the system. RAG is a method that enhances the capabilities of Large Language Models (LLMs) by integrating them with external knowledge sources.&lt;/p&gt;
&lt;p&gt;Each term represents a piece of the puzzle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrieval - data retrieved from some external source outside the LLM (most often a database, but can include files, webpages, etc)&lt;/li&gt;
&lt;li&gt;Augmented - &amp;ldquo;augmenting&amp;rdquo; (or adding to) an LLM&amp;rsquo;s training data. This could include recent or private information that it did not have access to during its training period. Most often, this is done by adding the data to the prompt (or input) to the LLM.&lt;/li&gt;
&lt;li&gt;Generation - this is where LLMs are exceptional. They generate a response (text, image, video, etc) that is similar to the data being provided in the input. This is generated from probabilities, so cannot guarantee 100% consistency.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of relying solely on the model&amp;rsquo;s internal training data, RAG retrieves relevant information from databases or document collections to ground its responses in factual and up-to-date content. This approach not only improves the accuracy and reliability of the generated outputs but also allows the system to adapt to specific contexts or domains, making it a powerful tool for many personal and professional applications.&lt;/p&gt;</description></item><item><title>Understanding BSON: A Beginner’s Guide to MongoDB’s Data Format</title><link>https://foojayio.github.io/website/today/understanding-bson-a-beginners-guide-to-mongodbs-data-format/</link><pubDate>Thu, 22 May 2025 08:05:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/understanding-bson-a-beginners-guide-to-mongodbs-data-format/</guid><description>&lt;p&gt;&lt;strong&gt;When working with MongoDB, it&amp;rsquo;s easy to think you&amp;rsquo;re dealing with JSON. After all, the queries, documents, and API responses all look like JSON. But MongoDB is not storing JSON. It&amp;rsquo;s storing BSON&amp;mdash;a binary format designed for efficient storage and fast traversal.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BSON (Binary JSON) is more than just a binary version of JSON. It introduces additional data types like ObjectId, Decimal128, and Timestamp, allowing MongoDB to handle more complex data structures and ensure data integrity. While we might rarely interact with raw BSON directly, understanding how MongoDB stores and processes BSON documents can help us write more efficient queries, handle data conversions properly, and debug unexpected behavior.&lt;/p&gt;</description></item><item><title>Building a Real-Time AI Fraud Detection System with Spring Kafka and MongoDB</title><link>https://foojayio.github.io/website/today/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/</link><pubDate>Wed, 14 May 2025 14:30:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb/</guid><description>&lt;p&gt;In this tutorial, we&amp;rsquo;ll build a real-time fraud detection system using MongoDB Atlas Vector Search, Apache Kafka, and AI-generated embeddings. We&amp;rsquo;ll demonstrate how MongoDB Atlas Vector Search can be used to detect anomalies in a stream of financial transactions by analyzing a user&amp;rsquo;s transaction history and identifying suspicious behavior based on LLM-generated embeddings.&lt;/p&gt;
&lt;p&gt;Our solution will monitor MongoDB Change Streams using the Java synchronous driver, triggering vector searches on each new transaction to detect potential fraud. While this approach works well for our demo, and for many use cases, we&amp;rsquo;ll also discuss its limitations. Throughout the tutorial, I&amp;rsquo;ll cover alternative strategies to optimize performance, whether you need higher transaction throughput, faster fraud detection, or a more scalable architecture.&lt;/p&gt;</description></item><item><title>GenAI blood, sweat, and tears: Loading data to Pinecone</title><link>https://foojayio.github.io/website/today/genai-blood-sweat-and-tears-loading-data-to-pinecone/</link><pubDate>Wed, 07 May 2025 22:10:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/genai-blood-sweat-and-tears-loading-data-to-pinecone/</guid><description>&lt;p&gt;As someone who is pretty familiar with relational and graph databases, I wanted to dig a little deeper into vector databases and understand the strengths and quirks they bring to the database table. I put together a conference abstract on vector RAG versus GraphRAG which got picked up, so I went to work building a demo and learning all I could.&lt;/p&gt;
&lt;p&gt;I pivoted a few times along the way, but ended up with a Spring AI application that connects to both Pinecone (vector database) and Neo4j (graph database). There were a few surprises throughout, which I&amp;rsquo;ll be sure to mention. Let&amp;rsquo;s get started!&lt;/p&gt;</description></item><item><title>Semantic Search with Spring Boot &amp; Redis</title><link>https://foojayio.github.io/website/today/semantic-search-with-spring-boot-redis/</link><pubDate>Mon, 05 May 2025 15:35:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/semantic-search-with-spring-boot-redis/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;strong&gt;You&amp;rsquo;re building a semantic search app using Spring Boot and Redis. Instead of matching exact words, semantic search finds meaning using Vector Similarity Search (VSS). It works by turning movie synopses into vectors with embedding models, storing them in Redis (as a vector database), and finding the closest matches to user queries.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/o3XN4dImESE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;A traditional searching system works by matching the words a user types with the words stored in a database or document collection. It usually looks for exact or partial matches without understanding the meaning behind the words.&lt;/p&gt;</description></item><item><title>Breaktime Tech Talks (Ep39): Why embedding models should match + Advice for starting a blog</title><link>https://foojayio.github.io/website/today/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/</link><pubDate>Wed, 16 Apr 2025 05:35:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/breaktime-tech-talks-ep39-why-embedding-models-should-match-advice-for-starting-a-blog/</guid><description>&lt;p&gt;This is episode 39 of the &lt;a href="https://www.youtube.com/playlist?list=PLzZ7iUdr2mwS6qexoz9dsI0NfnU614p1w" target="_blank" rel="noopener noreferrer"&gt;Breaktime Tech Talks podcast&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m at a conference this week presenting on a variety of different topics, but I stopped for just a few minutes to document some recent learnings while I was preparing the code projects for this week&amp;rsquo;s sessions.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll chat about a hands-on experience that helped me understand why embedding models for vectors and search should actually match. Then I came across an article with advice for creating a blog that outlines a lot of the practices I myself follow when I write tech blogs. I hope you enjoy it as well.&lt;/p&gt;</description></item><item><title>Breaktime Tech Talks (Ep37): Vector Database Frustration + Microsoft LazyGraphRAG</title><link>https://foojayio.github.io/website/today/breaktime-tech-talks-ep37-vector-database-frustration-microsoft-lazygraphrag/</link><pubDate>Wed, 19 Mar 2025 12:54:36 +0000</pubDate><guid>https://foojayio.github.io/website/today/breaktime-tech-talks-ep37-vector-database-frustration-microsoft-lazygraphrag/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This is episode 37 of the &lt;a href="https://www.youtube.com/playlist?list=PLzZ7iUdr2mwS6qexoz9dsI0NfnU614p1w" target="_blank" rel="noopener noreferrer"&gt;Breaktime Tech Talks&lt;/a&gt;
.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/hv-FtjIHg_I?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;p&gt;You are listening to the Breaktime Tech Talks podcast, a bite-sized tech podcast for busy developers, where we&amp;rsquo;ll briefly cover technical topics, new snippets, and more in short time blocks. I&amp;rsquo;m your host, Jennifer Reif, an avid developer and problem solver with special interest in data, learning, and all things technology.&lt;/p&gt;</description></item><item><title>Book Review: DuckDB in Action</title><link>https://foojayio.github.io/website/today/book-review-duckdb-in-action/</link><pubDate>Wed, 05 Mar 2025 13:42:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/book-review-duckdb-in-action/</guid><description>&lt;p&gt;Disclaimer: this post includes affiliate links; I may receive compensation if you purchase the book from the different links provided in this post.&lt;/p&gt;
&lt;p&gt;This review is about &lt;a href="https://www.manning.com/books/duckdb-in-action?utm_source=frankel&amp;amp;amp;utm_medium=affiliate&amp;amp;amp;utm_campaign=affiliate&amp;amp;amp;a_aid=frankel" target="_blank" rel="noopener noreferrer"&gt;DuckDB in Action&lt;/a&gt;
 by JoMark Needham, Michael Hunger, and Michael Simons from Manning.&lt;/p&gt;
&lt;p&gt;The book was sent to me by &lt;a href="https://mastodon.social/@rotnroll666" target="_blank" rel="noopener noreferrer"&gt;Michael Simons&lt;/a&gt;
. He asked for my feedback: I changed my reading schedule, took a few months, and here it is.&lt;/p&gt;
&lt;h2 id="h2-0-facts"&gt;Facts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;10 chapters&lt;/li&gt;
&lt;li&gt;288 pages&lt;/li&gt;
&lt;li&gt;$33.59 (eBook)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that MotherDuck, the company behind DuckDB, offers a &lt;a href="https://motherduck.com/duckdb-book-brief/" target="_blank" rel="noopener noreferrer"&gt;free PDF copy&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Sliding Window Counter Rate Limiter (Redis &amp; Java)</title><link>https://foojayio.github.io/website/today/sliding-window-counter-rate-limiter-redis-java/</link><pubDate>Tue, 25 Feb 2025 21:21:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/sliding-window-counter-rate-limiter-redis-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This content is also available on YouTube. &lt;a href="https://youtu.be/Wvm_u0IR69M" target="_blank" rel="noopener noreferrer"&gt;Check it out!&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Sliding Window Counter offers a more efficient way to handle rate limiting compared to the Sliding Window Log. While the Sliding Window Log keeps an exact log of timestamps for each request, allowing precise tracking over a rolling time period, this precision comes at the cost of higher memory usage and computational overhead as the number of requests increases.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Spring Data Neo4j: How to update an entity</title><link>https://foojayio.github.io/website/today/spring-data-neo4j-how-to-update-an-entity/</link><pubDate>Wed, 05 Feb 2025 18:58:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/spring-data-neo4j-how-to-update-an-entity/</guid><description>&lt;p&gt;&lt;strong&gt;After working on a new &lt;a href="https://graphacademy.neo4j.com/courses/app-spring-data/" target="_blank" rel="noopener noreferrer"&gt;online Spring Data Neo4j course&lt;/a&gt;
, I learned a couple more things about updating an entity.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The course required a different set of scenarios than outlined in my &lt;a href="https://jmhreif.com/blog/2023/sdn-cypher-update-entity/" target="_blank" rel="noopener noreferrer"&gt;previous SDN update blog post&lt;/a&gt;
, so I wanted to cover those scenarios, as well.&lt;/p&gt;
&lt;h2 id="_spring_save_method"&gt;Spring save() method&lt;/h2&gt;
&lt;p&gt;First up is the out-of-the-box &lt;code&gt;save()&lt;/code&gt; method that is provided by Spring as a default. This method takes an input of the entity object you want to save to the database.&lt;/p&gt;</description></item><item><title>Token Bucket Rate Limiter (Redis &amp; Java) - Raphael De Lio</title><link>https://foojayio.github.io/website/today/token-bucket-rate-limiter-redis-java/</link><pubDate>Tue, 28 Jan 2025 07:07:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/token-bucket-rate-limiter-redis-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://youtu.be/cfF6nXIpDwE" target="_blank" rel="noopener noreferrer"&gt;This article is also available on YouTube!&lt;/a&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;strong&gt;Token Bucket&lt;/strong&gt; algorithm is a flexible and efficient rate-limiting mechanism.&lt;/p&gt;
&lt;p&gt;It works by filling a bucket with tokens at a fixed rate (e.g., one token per second).&lt;/p&gt;
&lt;p&gt;Each request consumes a token, and if no tokens are available, the request is rejected.&lt;/p&gt;
&lt;p&gt;The bucket has a maximum capacity, so it can handle bursts of traffic as long as the burst doesn&amp;rsquo;t exceed the number of tokens in the bucket.&lt;/p&gt;</description></item><item><title>Fixed Window Counter Rate Limiter (Redis &amp; Java)</title><link>https://foojayio.github.io/website/today/fixed-window-counter-rate-limiter-redis-java/</link><pubDate>Mon, 20 Jan 2025 16:34:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/fixed-window-counter-rate-limiter-redis-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://youtu.be/Ki3WKSNpdRU" target="_blank" rel="noopener noreferrer"&gt;This article is also available on YouTube!&lt;/a&gt;

The &lt;strong&gt;Fixed Window Counter&lt;/strong&gt; is the simplest and most straightforward rate-limiting algorithm. It divides time into fixed intervals (e.g., seconds, minutes, or hours) and counts the number of requests within each interval. If the count exceeds a predefined threshold, the requests are rejected until the next interval begins. Looking for a more precise algorithm? Take a look at the &lt;a href="https://foojayio.github.io/website/today/sliding-window-log-rate-limiter-redis-java/"&gt;Sliding Window Log implementation&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Rate limiting with Redis: An essential guide</title><link>https://foojayio.github.io/website/today/rate-limiting-with-redis-an-essential-guide/</link><pubDate>Mon, 13 Jan 2025 18:23:26 +0000</pubDate><guid>https://foojayio.github.io/website/today/rate-limiting-with-redis-an-essential-guide/</guid><description>&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=YV4ePyW3DO8" target="_blank" rel="noopener noreferrer"&gt;This article is also available on YouTube!&lt;/a&gt;
 Rate limiting &amp;mdash; it&amp;rsquo;s something you&amp;rsquo;ve likely encountered, even if you haven&amp;rsquo;t directly implemented one. For example, have you ever been greeted by a &amp;ldquo;429 Too Many Requests&amp;rdquo; error? That&amp;rsquo;s a rate limiter in action, protecting a resource from overload. Or maybe you&amp;rsquo;ve used a service with explicit request quotas based on your payment tier &amp;mdash; same concept, just more transparent. &lt;img src="https://cdn-images-1.medium.com/max/3412/1*YKz05kbmkzQdws-DUsvhdw.png" alt="ChatGPT warning user that they have reached the limit of messages they can send in 24 hours." loading="lazy"&gt;
 Rate limiting isn&amp;rsquo;t just about setting limits; it serves a variety of purposes. Take Figma, for instance. Their rate limiter, built with Redis, saved them from a spam attack where bad actors sent massive document invitations to random email addresses. Without it, Figma could have faced skyrocketing email delivery costs and damaged reputation. Or look at Stripe: as their platform grew, they realized they couldn&amp;rsquo;t just throw more infrastructure at the problem. They needed a smarter solution to prevent resource monopolization by misconfigured scripts or bad actors. These stories show just how versatile rate limiting is. It prevents abuse, ensures fair access, manages load, cuts costs, and even protects against downtime. But here&amp;rsquo;s the kicker: the hard part isn&amp;rsquo;t knowing &lt;em&gt;why&lt;/em&gt; you need a rate limiter. The real challenge is building one that&amp;rsquo;s both efficient and tailored to your needs.&lt;/p&gt;</description></item><item><title>SQL Best Practices Every Java Engineer Must Know</title><link>https://foojayio.github.io/website/today/sql-best-practices-every-java-engineer-must-know/</link><pubDate>Tue, 01 Oct 2024 17:52:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/sql-best-practices-every-java-engineer-must-know/</guid><description>&lt;p&gt;In the world of software development, best practices for SQL optimization are a critical skill that every Java engineer must master. Efficient database interactions can significantly enhance the performance of your applications, leading to faster response times and a better user experience.&lt;/p&gt;
&lt;p&gt;This comprehensive guide dives into the best practices for SQL query optimization, tailored specifically for Java engineers. From understanding the importance of indexes to mastering joins and leveraging connection pooling, this article covers all the essential techniques you need to write efficient and performant SQL queries and best practices for SQL.&lt;/p&gt;</description></item><item><title>Foojay Podcast #56: Vectors in Java Code, Databases, and LLMs</title><link>https://foojayio.github.io/website/today/foojay-podcast-56/</link><pubDate>Mon, 08 Jul 2024 07:33:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/foojay-podcast-56/</guid><description>&lt;p&gt;In this Foojay podcast, we enter the world of mathematics by discussing Vectors and how they are crucial for AI and machine learning.&lt;/p&gt;
&lt;p&gt;As ChatGPT explains: &lt;strong&gt;&amp;ldquo;A Vector is a mathematical structure that holds numerical values. Vectors are fundamental to the field of Artificial Intelligence, as they allow mathematical operations to be performed efficiently and form the basis of many machine learning algorithms.&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;OK, but&amp;hellip; how are these vectors crucial for the whole Artificial Intelligence evolution?&lt;/p&gt;</description></item><item><title>Exploring Cost-Effective Solutions for Stateful Rest Services</title><link>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</link><pubDate>Mon, 27 May 2024 13:13:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/exploring-cost-effective-solutions-for-stateful-rest-services/</guid><description>&lt;h2 id="h2-0-a-case-study-with-ibm-cloud-code-engine-eclipsestore-and-ibm-cloud-object-storage"&gt;A Case Study with IBM Cloud Code Engine, EclipseStore, and IBM Cloud Object Storage&lt;/h2&gt;
&lt;p&gt;In the dynamic realm of cloud computing, finding cost-effective solutions for stateful rest services that don&amp;rsquo;t necessarily require scaling can be a nuanced challenge.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll take a pragmatic look at a use case leveraging &lt;a href="https://www.ibm.com/products/code-engine" title="IBM Cloud Code Engine" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Code Engine&lt;/a&gt;
, &lt;a href="https://eclipsestore.io/" title="EclipseStore" target="_blank" rel="noopener noreferrer"&gt;EclipseStore&lt;/a&gt;
, and &lt;a href="https://www.ibm.com/products/cloud-object-storage" title="IBM Cloud Object Storage (COS)" target="_blank" rel="noopener noreferrer"&gt;IBM Cloud Object Storage (COS)&lt;/a&gt;
. The goal is to shed light on how this can be a practical and economical alternative, particularly when scalability is not a primary concern.&lt;/p&gt;</description></item><item><title>Minimize costs utilizing the cloud with Spring-Data-Eclipse-Store</title><link>https://foojayio.github.io/website/today/minimize-costs-by-utilizing-cloud-storage-with-spring-data-eclipse-store/</link><pubDate>Tue, 13 Feb 2024 15:26:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/minimize-costs-by-utilizing-cloud-storage-with-spring-data-eclipse-store/</guid><description>&lt;p&gt;Sooner or later any Spring application needs to store data. And of course, the first and easiest move is to utilize &lt;a href="https://spring.io/projects/spring-data-jpa" target="_blank" rel="noopener noreferrer"&gt;Spring Data JPA&lt;/a&gt;
. You can set up your data storage without knowing which relational database you will use in production and simply start coding without worrying about that.&lt;/p&gt;
&lt;p&gt;It is the easiest and most convenient way to store data (in a relational database like PostgreSQL), yet in the cloud environment it is also an expensive way. Pricing at AWS RDS starts at 30$/month with tiny-Instances and always have &lt;strong&gt;fixed monthly costs regardless of its usage&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>MariaDB Java Connector, Benchmark, and Java 21 virtual threads</title><link>https://foojayio.github.io/website/today/benchmark-jdbc-connectors-and-java-21-virtual-threads/</link><pubDate>Tue, 23 Jan 2024 13:03:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/benchmark-jdbc-connectors-and-java-21-virtual-threads/</guid><description>&lt;p&gt;Why should Java and database developers care about Virtual Threads? Developers can write faster and more resource efficient applications without having to refactor synchronous code a.k.a. &amp;ldquo;imperative&amp;rdquo;) JDBC code into asynchronous (a.k.a &amp;ldquo;reactive&amp;rdquo;) code that is hard to create, debug and maintain.&lt;/p&gt;
&lt;p&gt;Writing scalable network code is always difficult. Synchronous APIs can&amp;rsquo;t be scaled beyond a certain point because they can block when performing I/O operations, which in turn block the thread until the operation is ready. For example, if you try to read data from a socket when no data is available, the thread will freeze until data becomes available. Threads are also an expensive resource on the Java platform, so we don&amp;rsquo;t want to force them to wait for I/O operations to complete. To avoid these limitations, we typically use asynchronous or reactive I/O frameworks such as Project Reactor, RxJava, or Vert.x and connectors like R2DBC. These frameworks allow us to write code that doesn&amp;rsquo;t block a thread during an I/O operation, but instead uses a callback or event notification to notify the code when the I/O operation is complete or ready.&lt;/p&gt;</description></item><item><title>Patterns For The Design Of Microservices – Part 2</title><link>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/</link><pubDate>Mon, 30 Oct 2023 08:58:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-2/</guid><description>&lt;p&gt;In the &lt;a href="https://foojayio.github.io/website/today/patterns-for-the-design-of-microservices-part-1/" title="previous article"&gt;previous article&lt;/a&gt;
, we discussed some of the design patterns employed in the creation of microservices. In this subsequent article, we will delve into the remaining patterns that are commonly utilized in the realm of microservices.&lt;/p&gt;
&lt;img fetchpriority="high" decoding="async" class="size-medium wp-image-102866" src="MSPatterns-700x394.png" alt="Microservice Architecture" width="700" height="394"&gt;
&lt;p&gt;Database Patterns&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;There are seven distinct patterns that further categorize the data management.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Database per Service&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared Database&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Saga Pattern&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Command-Query Responsiblity Segregation (CQRS)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API Composition&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain Event&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event Sourcing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the next section, let&amp;rsquo;s discuss each pattern individually.&lt;/p&gt;</description></item><item><title>Reactive Database Access on the JVM</title><link>https://foojayio.github.io/website/today/reactive-database-access-on-the-jvm/</link><pubDate>Mon, 17 Jul 2023 09:18:37 +0000</pubDate><guid>https://foojayio.github.io/website/today/reactive-database-access-on-the-jvm/</guid><description>&lt;p&gt;A couple of years ago, &lt;a href="https://en.wikipedia.org/wiki/Reactive_programming" target="_blank" rel="noopener noreferrer"&gt;Reactive Programming&lt;/a&gt;
 was all the rage, but it had one big issue: reactive stopped as soon as you accessed a SQL database.&lt;/p&gt;
&lt;p&gt;You had a nice reactive chain up to the database, defeating the whole purpose. Given the prevalence of SQL databases in existing and new apps, one couldn&amp;rsquo;t enjoy the full benefits of Reactive Programming but still pay the full price of complexity.&lt;/p&gt;
&lt;p&gt;Since then, the landscape has changed tremendously. Most importantly, it offers many reactive drivers over popular databases: PostgreSQL, MariaDB and MySQL, Microsoft SQL Server, Oracle, you name it!&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 10: Service Discovery with Eureka</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-10-service-discovery-with-eureka/</link><pubDate>Thu, 13 Jul 2023 06:39:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-10-service-discovery-with-eureka/</guid><description>&lt;p&gt;Gaining complexity in a microservices system certainly isn&amp;rsquo;t for the faint of heart (though neither is complexity in monoliths!).&lt;/p&gt;
&lt;p&gt;When there are many services that need to communicate with one another, we might need to coordinate multiple services communicating with multiple other services.&lt;/p&gt;
&lt;p&gt;We also might code for varying environments such as local, development server, or the cloud.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How do services know where to find one another?&lt;/li&gt;
&lt;li&gt;How can we avoid problems when a service is unavailable?&lt;/li&gt;
&lt;li&gt;How do we handle requests when we scale up or down certain parts of our system?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where something like Spring Cloud Netflix Eureka comes into play.&lt;/p&gt;</description></item><item><title>A Dissection of Java JDBC to PostgreSQL, Part 2: Batching</title><link>https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/</link><pubDate>Tue, 04 Jul 2023 13:56:41 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections-part-2-batching/</guid><description>&lt;p&gt;This is the second part of a series where I look into how Java JDBC connections to PostgreSQL are working, to understand how to optimally implement them.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve landed on this article, it might be a good idea to read &lt;a href="https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections/" title="my first article"&gt;my first article&lt;/a&gt;
 as well, which gives an introduction and shares how JDBC communicates with &lt;a href="https://www.yugabyte.com/postgresql/" title="PostgreSQL" target="_blank" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;
 using simple and extended protocols.&lt;/p&gt;
&lt;p&gt;This new article specifically explores batching. Batching for PostgreSQL JDBC is a property of the extended protocol. It uniquely allows you to send multiple statements in a single request.&lt;/p&gt;</description></item><item><title>Neo4j's Online Conference Is Coming In October...</title><link>https://foojayio.github.io/website/today/neo4js-online-conference-is-coming-in-october-and-youre-invited/</link><pubDate>Wed, 07 Jun 2023 08:46:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/neo4js-online-conference-is-coming-in-october-and-youre-invited/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/neo4js-online-conference-is-coming-in-october-and-youre-invited/05.03_Nodes_Banner_1200x628-1-700x366.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;NODES is back for its fifth year on October 26, 2023!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s the biggest graph community gathering dedicated to learning how to integrate graph technologies into ML and dev projects.&lt;/p&gt;
&lt;p&gt;For 24 hours nonstop, speakers from around the world will showcase their implementations, tools, models, and more &amp;ndash; sharing everything they&amp;rsquo;ve learned over this past year.&lt;/p&gt;
&lt;p&gt;Join thousands of fellow developers, data scientists, and data engineers to get firsthand knowledge from peers who will show you the ropes &amp;ndash; for free! So be sure to &lt;a href="https://neo4j.registration.goldcast.io/events/6fb85147-ca27-4310-9dec-cb345c53bd6f" title="save your seat" target="_blank" rel="noopener noreferrer"&gt;save your seat&lt;/a&gt;
!&lt;/p&gt;</description></item><item><title>Managing Data Residency: The Demo</title><link>https://foojayio.github.io/website/today/managing-data-residency-the-demo/</link><pubDate>Mon, 29 May 2023 07:33:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/managing-data-residency-the-demo/</guid><description>&lt;p&gt;I explained the concepts and theory behind Data Residency in a &lt;a href="https://foojayio.github.io/website/today/managing-data-residency-concepts-theory/"&gt;previous post&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s time to get our hands dirty and implement it in a simple demo.&lt;/p&gt;
&lt;h2 id="h2-0-the-sample-architecture"&gt;The sample architecture&lt;/h2&gt;
&lt;p&gt;In the last section of the previous post, I proposed a sample architecture where location-based routing happened at two different stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The API Gateway checks for an existing &lt;code&gt;X-Country&lt;/code&gt; header. Depending on its value, it forwards the request to the computed upstream; If no value is found or no value matches, it forwards it to a default upstream.&lt;/li&gt;
&lt;li&gt;The application uses &lt;a href="https://shardingsphere.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Shardingsphre&lt;/a&gt;
 to route again depending on the data. If the value computed by the API Gateway is correct, the flow stays &amp;ldquo;in its lane&amp;rdquo;; if not, it&amp;rsquo;s routed to the correct database, but with a performance penalty as it&amp;rsquo;s outside its lane.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I simplified some aspects:&lt;/p&gt;</description></item><item><title>A Dissection of Java JDBC to PostgreSQL Connections</title><link>https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections/</link><pubDate>Fri, 12 May 2023 08:52:52 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-dissection-of-java-jdbc-to-postgresql-connections/</guid><description>&lt;p&gt;Many Java applications use a database, and many use JDBC and &lt;a href="https://www.yugabyte.com/postgresql/" title="PostgreSQL" target="_blank" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;The latency of database usage is often important, yet, what exactly happens at the database level is unknown.&lt;/p&gt;
&lt;p&gt;This article explains which options are available, what happens, and why.&lt;/p&gt;
&lt;p&gt;Most importantly, it includes a small Java class that can be used and modified to execute specific database tasks, plus a description of how to use a utility (&lt;a href="https://www.wireshark.org" title="Wireshark" target="_blank" rel="noopener noreferrer"&gt;Wireshark&lt;/a&gt;
) to see what is actually happening.&lt;/p&gt;</description></item><item><title>Creating Scalable OpenAI GPT Applications in Java</title><link>https://foojayio.github.io/website/today/creating-scalable-openai-gpt-applications-in-java/</link><pubDate>Thu, 27 Apr 2023 14:18:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/creating-scalable-openai-gpt-applications-in-java/</guid><description>&lt;p&gt;One of the more notable aspects of ChatGPT is its engine, which not only powers the web-based chatbot but can also be integrated into your Java applications.&lt;/p&gt;
&lt;p&gt;Whether you prefer reading or watching, let&amp;rsquo;s review how to start using the OpenAI GPT engine in your Java projects in a scalable way, by sending prompts to the engine only when necessary:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
			&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/8bpIXrz7xJw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
		&lt;/div&gt;

&lt;br /&gt;
&lt;p&gt;Imagine you want to visit a city and have a specific budget in mind. How should you spend the money and make your trip memorable? This is an excellent question to delegate to the OpenAI engine.&lt;/p&gt;</description></item><item><title>Ingesting Data from Kafka into the QuestDB time-series database</title><link>https://foojayio.github.io/website/today/ingesting-time-series-events-from-kafka-into-questdb/</link><pubDate>Tue, 28 Mar 2023 09:38:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/ingesting-time-series-events-from-kafka-into-questdb/</guid><description>&lt;p&gt;If you are working on a project with fast or streaming data, chances are Apache Kafka is already &lt;a href="https://kafka.apache.org/powered-by#:~:text=Today%2C%20Kafka%20is%20used%20by,80%25%20of%20the%20Fortune%20100." target="_blank" rel="noopener noreferrer"&gt;part of your pipeline&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;But if you want to analyse your data, you will need to ingest from Kafka into some destination.&lt;/p&gt;
&lt;p&gt;For time-series data, QuestDB can be an excellent choice.&lt;/p&gt;
&lt;p&gt;For those of you who are not yet familiar with &lt;a href="https://github.com/questdb/questdb" title="QuestDB" target="_blank" rel="noopener noreferrer"&gt;QuestDB&lt;/a&gt;
, it is an Apache 2.0 licensed database designed for high throughput ingestion and fast SQL queries.&lt;/p&gt;</description></item><item><title>5 Great Reasons to use jOOQ</title><link>https://foojayio.github.io/website/today/5-great-reasons-to-use-jooq/</link><pubDate>Wed, 22 Mar 2023 14:45:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/5-great-reasons-to-use-jooq/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Hi, I&amp;rsquo;m &lt;a href="https://twitter.com/lukaseder" title="Lukas" target="_blank" rel="noopener noreferrer"&gt;Lukas&lt;/a&gt;
. I was invited to talk about the business behind jOOQ on Foojay.io and as a short introduction to &lt;a href="https://www.jooq.org/" title="jOOQ" target="_blank" rel="noopener noreferrer"&gt;jOOQ&lt;/a&gt;
, I&amp;rsquo;d like to highlight 5 great reasons to use it.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Before discussing those reasons:&lt;/p&gt;
&lt;h2 id="h2-0-what-is-jooq"&gt;What is jOOQ&lt;/h2&gt;
&lt;p&gt;jOOQ is an internal &lt;a href="https://en.wikipedia.org/wiki/Domain-specific_language" title="domain-specific language " target="_blank" rel="noopener noreferrer"&gt;domain-specific language&lt;/a&gt;
 (DSL) modelling the SQL language as an API directly in Java.&lt;/p&gt;
&lt;p&gt;This provides compile-time type safety to your query and enables a lot of other interesting features that I&amp;rsquo;ll show later.&lt;/p&gt;</description></item><item><title>How to Best Use Java Records as DTOs in Spring Boot 3</title><link>https://foojayio.github.io/website/today/how-to-best-use-java-records-as-dtos-in-spring-boot-3/</link><pubDate>Thu, 09 Mar 2023 17:06:46 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-best-use-java-records-as-dtos-in-spring-boot-3/</guid><description>&lt;p&gt;With the Spring 6 and Spring Boot 3 releases, &lt;a href="https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga" title="Java 17&amp;#43; became the baseline framework" target="_blank" rel="noopener noreferrer"&gt;Java 17+ became the baseline framework&lt;/a&gt;
 version.&lt;/p&gt;
&lt;p&gt;So now is a great time to start using compact &lt;a href="https://docs.oracle.com/en/java/javase/14/language/records.html" title="Java Records" target="_blank" rel="noopener noreferrer"&gt;Java Records&lt;/a&gt;
 as Data Transfer Objects (&lt;a href="https://en.wikipedia.org/wiki/Data_transfer_object" title="DTOs" target="_blank" rel="noopener noreferrer"&gt;DTOs&lt;/a&gt;
) for various database and API calls.&lt;/p&gt;
&lt;p&gt;Whether you prefer reading or watching, let&amp;rsquo;s review a few approaches for using Java records as DTOs that apply to Spring Boot 3 with Hibernate 6 as the persistence provider.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 9: Docker compose all the things</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</link><pubDate>Sun, 26 Feb 2023 10:02:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-9-docker-compose-all-the-things/</guid><description>&lt;p&gt;Our microservices project contains quite a few pieces now.&lt;/p&gt;
&lt;p&gt;We have two databases, three API services, a user-view service for books, and a service to host our configuration.&lt;/p&gt;
&lt;p&gt;With so many pieces to manage, it would be nice to have something that orchestrates the individual services into a system, such as Docker Compose.&lt;/p&gt;
&lt;p&gt;Back in our &lt;a href="https://foojayio.github.io/website/today/journeys-in-java-level-5-building-an-empire-of-microservices/"&gt;Level 5&lt;/a&gt;
 rendition, we did exactly this for our smaller version of the project.&lt;/p&gt;
&lt;p&gt;Now that we have expanded our services, we need to add those new pieces into the existing Docker Compose management umbrella.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 8: Add MongoDB to Spring Cloud Config</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-8-add-mongodb-to-spring-cloud-config/</link><pubDate>Thu, 09 Feb 2023 16:56:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-8-add-mongodb-to-spring-cloud-config/</guid><description>&lt;p&gt;In &lt;a href="https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/"&gt;our last article&lt;/a&gt;
, we used Spring Cloud Config to provide database credentials to a microservice application connecting to a cloud-hosted Neo4j database. This post will backport this concept to our existing MongoDB database instance and its related microservices.&lt;/p&gt;
&lt;p&gt;We will add our MongoDB credentials to the config server, so that it will be the central place for both our Neo4j and MongoDB database access. However, each service only has access to the credentials that it needs to operate, which provides some level of security through &amp;ldquo;separation of concerns&amp;rdquo; (versus universal access).&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 7: Externalize Microservice Configuration</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/</link><pubDate>Mon, 30 Jan 2023 15:43:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-7-externalize-microservice-configuration/</guid><description>&lt;p&gt;Our decided next step for this project takes us in a new direction by adding externalized configuration for our applications.&lt;/p&gt;
&lt;p&gt;We already saw how to do something similar with &lt;a href="https://jmhreif.com/blog/microservices-level5/" target="_blank" rel="noopener noreferrer"&gt;MongoDB database credentials in Docker Compose&lt;/a&gt;
 to access a local database container, but what do we do when the database is hosted on public cloud or contains sensitive data?&lt;/p&gt;
&lt;p&gt;We probably don&amp;rsquo;t want to publish our credentials anywhere or even prevent accidental publishing.&lt;/p&gt;</description></item><item><title>How Java Litters Beyond the Heap: Solid-State Drives</title><link>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-3-solid-state-drives/</link><pubDate>Fri, 27 Jan 2023 10:54:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-3-solid-state-drives/</guid><description>&lt;p&gt;A Java application dutifully executes your logic, leaving behind footprints in the Java heap in the form of dead objects.&lt;/p&gt;
&lt;p&gt;A garbage collector will then step in and clean out the memory for the new data. This cycle repeats until the app is stopped. This is well known.&lt;/p&gt;
&lt;p&gt;But, the Java heap is one of many places where your app can generate garbage.&lt;/p&gt;
&lt;p&gt;The application can also litter other parts of the software stack. It&amp;rsquo;s not done deliberately, but because some stack components also take advantage of garbage collection.&lt;/p&gt;</description></item><item><title>How Java Litters Beyond the Heap: Distributed Databases</title><link>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-2-distributed-databases/</link><pubDate>Tue, 20 Dec 2022 11:40:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-part-2-distributed-databases/</guid><description>&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s create a simple Java application using a distributed database for the user data and see how the database generates litter in response to application requests.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While the Java Virtual Machine executes our code at runtime, it generates garbage in the heap, which is dutifully collected by the garbage collector. This is a known fact.&lt;/p&gt;
&lt;p&gt;However, at the same time, Java apps don&amp;rsquo;t live in isolation and frequently communicate with services, databases, and other components. Some of those components also generate and collect garbage, while fulfilling the Java app&amp;rsquo;s requests. This is less known.&lt;/p&gt;</description></item><item><title>How Java Litters Beyond the Heap: Relational Databases</title><link>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-relational-databases/</link><pubDate>Tue, 29 Nov 2022 19:08:04 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-java-litters-beyond-the-heap-relational-databases/</guid><description>&lt;p&gt;As Java developers, we&amp;rsquo;re no strangers to the concept of garbage collection. Our apps generate garbage all the time, and that garbage is meticulously cleaned out by CMS, G1, Azul C4, and other types of collectors.&lt;/p&gt;
&lt;p&gt;However, the story doesn&amp;rsquo;t end with the Java heap. In fact, it is just the beginning.&lt;/p&gt;
&lt;p&gt;In this article, we will create a simple Java application that uses a relational database for the user data and solid-state drives (SSDs) as a storage device. From here, we&amp;rsquo;ll explore how the application generates garbage at the database and SSD levels, while executing the application logic.&lt;/p&gt;</description></item><item><title>A Poor Man's API</title><link>https://foojayio.github.io/website/today/poor-mans-api/</link><pubDate>Tue, 29 Nov 2022 09:13:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/poor-mans-api/</guid><description>&lt;p&gt;Creating a full-fledged API requires resources, both time and money.&lt;/p&gt;
&lt;p&gt;You need to think about the model, the design, the REST principles, etc., without writing a single line of code.&lt;/p&gt;
&lt;p&gt;Most of the time, you don&amp;rsquo;t know whether it&amp;rsquo;s worth it: you&amp;rsquo;d like to offer a Minimum Viable Product and iterate from there.&lt;/p&gt;
&lt;p&gt;I want to show how you can achieve it without writing a single line of code.&lt;/p&gt;
&lt;h2 id="h2-0-the-solution"&gt;The solution&lt;/h2&gt;
&lt;p&gt;The main requirement of the solution is to use the &lt;a href="https://www.postgresql.org/" target="_blank" rel="noopener noreferrer"&gt;PostgreSQL database&lt;/a&gt;
. It&amp;rsquo;s a well-established Open Source SQL database.&lt;/p&gt;</description></item><item><title>Unified Event-Driven Architecture for the Cloud Native Enterprise</title><link>https://foojayio.github.io/website/today/unified-event-driven-architecture-for-the-cloud-native-enterprise/</link><pubDate>Thu, 06 Oct 2022 19:58:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/unified-event-driven-architecture-for-the-cloud-native-enterprise/</guid><description>&lt;p&gt;CTOs and enterprise architects have long recognized the importance of event-driven architectures (EDA). While once considered purely a technology concern, the foresight of organizations that have invested in EDA has become readily apparent as the world has shifted around us. In the past decade, we&amp;rsquo;ve witnessed changes in nearly every aspect of our technological worlds, and the vast majority of those have been affected in some way by a move toward event-driven, real-time processing.&lt;/p&gt;</description></item><item><title>Reclaiming Persistent Volumes in Kubernetes</title><link>https://foojayio.github.io/website/today/reclaiming-persistent-volumes-in-kubernetes/</link><pubDate>Wed, 28 Sep 2022 09:55:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/reclaiming-persistent-volumes-in-kubernetes/</guid><description>&lt;p&gt;&lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
 is a widely used open-source container management platform for running stateless, containerized applications at scale. In recent years, Kubernetes has been extended to also support stateful workloads, including databases and key-value stores.{#43de}&lt;/p&gt;
&lt;p&gt;There are three important API resources when it comes to managing stateful applications in Kubernetes:{#8e8a}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/" target="_blank" rel="noopener noreferrer"&gt;StatefulSet&lt;/a&gt;
 (STS)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/storage/persistent-volumes/" target="_blank" rel="noopener noreferrer"&gt;PersistentVolume&lt;/a&gt;
 (PV)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/storage/storage-classes/" target="_blank" rel="noopener noreferrer"&gt;PersistentVolumeClaim&lt;/a&gt;
 (PVC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;STSs schedule stateful pods, which can claim PVs through PVCs and mount them as volumes. Once a PV is claimed by an STS replica, Kubernetes will make sure that the volume stays with the replica, even if the pod gets rescheduled.{#e855}&lt;/p&gt;</description></item><item><title>How the world caught up with Apache Cassandra</title><link>https://foojayio.github.io/website/today/how-the-world-caught-up-with-apache-cassandra/</link><pubDate>Thu, 15 Sep 2022 16:50:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-the-world-caught-up-with-apache-cassandra/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/how-the-world-caught-up-with-apache-cassandra/hero-techcrunch.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;The O&amp;rsquo;Reilly book, &lt;em&gt;Cassandra: The Definitive Guide,&lt;/em&gt; features a quote from Ray Kurzweil, the noted inventor and futurist: {#speakable-summary}&lt;/p&gt;
&lt;p&gt;&amp;ldquo;An invention has to make sense in the world in which it is finished, not the world in which it is started.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This quote has a prophetic ring to it, especially considering my co-author Eben Hewitt included it in the 2010 first edition of this book we wrote, back when Apache Cassandra, the open-source, distributed, and highly scalable NoSQL database, was just on its 0.7 release.&lt;/p&gt;</description></item><item><title>Baeldung Series Part 2: Build a Dashboard With Cassandra, Astra and CQL – Mapping Event Data</title><link>https://foojayio.github.io/website/today/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/</link><pubDate>Tue, 13 Sep 2022 17:46:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/baeldung-series-part-2-build-a-dashboard-with-cassandra-astra-and-cql-mapping-event-data/</guid><description>&lt;h2 id="h2-0-1-introduction"&gt;&lt;strong&gt;1. Introduction&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;In our &lt;a href="https://www.baeldung.com/cassandra-astra-rest-dashboard-updates" target="_blank" rel="noopener noreferrer"&gt;previous article&lt;/a&gt;
, we looked at augmenting our dashboard to store and display individual events from the Avengers using &lt;a href="https://astra.dev/3DnYCl8" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra&lt;/a&gt;
, a serverless DBaaS powered by &lt;a href="https://cassandra.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 using &lt;a href="https://stargate.io/?utm_medium=referral&amp;amp;utm_source=baeldung&amp;amp;utm_campaign=series-1-of-3&amp;amp;utm_content=avengers-dash-series-1" target="_blank" rel="noopener noreferrer"&gt;Stargate&lt;/a&gt;
 to offer additional APIs for working with it.&lt;/p&gt;
&lt;p&gt;In this article, we will be making use of the exact same data in a different way. &lt;strong&gt;We are going to allow the user to select which of the Avengers to display, the time period of interest, and then display these events on an interactive map.&lt;/strong&gt; Unlike in the previous article, this will allow the user to see the data interacting with each other in both geography and time.&lt;/p&gt;</description></item><item><title>Multi-cluster Cassandra with Google Kubernetes Engine (Pt. 2)</title><link>https://foojayio.github.io/website/today/multi-cluster-cassandra-deployment-with-google-kubernetes-engine-pt-2/</link><pubDate>Thu, 08 Sep 2022 17:20:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/multi-cluster-cassandra-deployment-with-google-kubernetes-engine-pt-2/</guid><description>&lt;p&gt;This is the second in a series of posts examining patterns for using K8ssandra to create Cassandra clusters with different deployment topologies.&lt;/p&gt;
&lt;p&gt;In the &lt;a href="https://k8ssandra.io/blog/tutorials/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes/" target="_blank" rel="noopener noreferrer"&gt;first article&lt;/a&gt;
 in this series, we looked at how you could create a Cassandra cluster with two datacenters in a single cloud region, using separate Kubernetes namespaces in order to isolate workloads. For example, you might want to create a secondary Cassandra datacenter to isolate a read-heavy analytics workload from the datacenter supporting your main application.&lt;/p&gt;</description></item><item><title>Running your Database on OpenShift and CodeReady Containers</title><link>https://foojayio.github.io/website/today/running-your-database-on-openshift-and-codeready-containers/</link><pubDate>Tue, 06 Sep 2022 09:43:57 +0000</pubDate><guid>https://foojayio.github.io/website/today/running-your-database-on-openshift-and-codeready-containers/</guid><description>&lt;p&gt;Let&amp;rsquo;s take an introductory run-through of setting up your database on OpenShift, using your own hardware and RedHat&amp;rsquo;s CodeReady Containers.&lt;/p&gt;
&lt;p&gt;CodeReady Containers is a great way to run OpenShift K8s locally, ideal for development and testing. The steps in this blog post will require a machine, laptop or desktop, of decent capability; preferably quad CPUs and 16GB+ RAM.&lt;/p&gt;
&lt;h2 id="h2-0-download-and-install-redhat-s-codeready-containers"&gt;Download and Install RedHat&amp;rsquo;s CodeReady Containers&lt;/h2&gt;
&lt;p&gt;Download and install RedHat&amp;rsquo;s CodeReady Containers as described in &lt;a href="https://developers.redhat.com/blog/2019/09/05/red-hat-openshift-4-on-your-laptop-introducing-red-hat-codeready-containers" target="_blank" rel="noopener noreferrer"&gt;Red Hat OpenShift 4 on your laptop: Introducing Red Hat CodeReady Containers&lt;/a&gt;
&lt;/p&gt;</description></item><item><title>Faster Integration Tests with Reusable Testcontainers</title><link>https://foojayio.github.io/website/today/faster-integration-tests-with-reusable-testcontainers/</link><pubDate>Wed, 17 Aug 2022 11:05:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/faster-integration-tests-with-reusable-testcontainers/</guid><description>&lt;p&gt;In my job, I often need integration tests against a &lt;a href="https://neo4j.com" target="_blank" rel="noopener noreferrer"&gt;Neo4j&lt;/a&gt;
 database. My software is written in Java, and so is Neo4j. Neo4j is embeddable, too. So, in theory, I could just depend on the embedded version, open a connection, test my stuff and call it a day. It would not be a different engine, it would be - at least from a query-engine and planer perspective - the same thing, in contrast to using an embedded SQL database as a drop-in for PostgresQL for example.&lt;/p&gt;</description></item><item><title>Deploy a Multi-Datacenter Cassandra Cluster in Kubernetes</title><link>https://foojayio.github.io/website/today/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/</link><pubDate>Wed, 10 Aug 2022 08:27:59 +0000</pubDate><guid>https://foojayio.github.io/website/today/deploy-a-multi-datacenter-apache-cassandra-cluster-in-kubernetes-pt-1/</guid><description>&lt;p&gt;The &lt;a href="https://k8ssandra.io/get-started/" target="_blank" rel="noopener noreferrer"&gt;Get Started&lt;/a&gt;
 examples on the K8ssandra site are primarily concerned with spinning up a single Apache Cassandra datacenter in a single Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;However, there are many situations that can benefit from other deployment options.&lt;/p&gt;
&lt;p&gt;In this series of articles, we&amp;rsquo;ll examine different deployment patterns and show how to implement them using K8ssandra.&lt;/p&gt;
&lt;h2 id="h-flexible-topologies-with-cassandra"&gt;Flexible topologies with Cassandra&lt;/h2&gt;
&lt;p&gt;From its earliest days, Cassandra has included the ability to assign nodes to datacenters and racks. A rack was originally conceived as mapping to a single rack of servers connected to shared resources, like power, network, and cooling.&lt;/p&gt;</description></item><item><title>Native GraphQL API with Neo4j AuraDB on Heroku</title><link>https://foojayio.github.io/website/today/native-graphql-api-with-neo4j-auradb-on-heroku/</link><pubDate>Mon, 08 Aug 2022 07:29:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/native-graphql-api-with-neo4j-auradb-on-heroku/</guid><description>&lt;p&gt;In my first article on Foojay, I would like to present one of many possible approaches to create a GraphQL API. I work at &lt;a href="https://neo4j.com/" target="_blank" rel="noopener noreferrer"&gt;Neo4j&lt;/a&gt;
, so it should not be a big suprise that I will use the Graph database with the same name as a backend for the application.&lt;/p&gt;
&lt;p&gt;In this post I will cover a couple of things and I&amp;rsquo;ll start with a simple use case. Conceptually we will look at the &amp;ldquo;Schema-First&amp;rdquo; vs &amp;ldquo;Object-First&amp;rdquo; discussions and why - at least in my opinion - GraphQL can be seen much more like an object mapping concept than a query language itself. You will learn that while Neo4j is a Graph database, it does not have a built-in GraphQL layer. It does however a great query language called &lt;a href="https://neo4j.com/docs/cypher-manual/current/" target="_blank" rel="noopener noreferrer"&gt;&amp;ldquo;Cypher&amp;rdquo;&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Five Data Models for IoT: Managing the Latest IoT Events Based on a State in Apache Cassandra</title><link>https://foojayio.github.io/website/today/five-data-models-for-iot-managing-the-latest-iot-events-based-on-a-state-in-apache-cassandra/</link><pubDate>Thu, 28 Jul 2022 17:36:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/five-data-models-for-iot-managing-the-latest-iot-events-based-on-a-state-in-apache-cassandra/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/five-data-models-for-iot-managing-the-latest-iot-events-based-on-a-state-in-apache-cassandra/shutterstock_1111260050-350x233-1.jpg" alt="" loading="lazy"&gt;
 © Shutterstock / everything possible&lt;/p&gt;
&lt;p&gt;Apache Cassandra is a rock-solid choice for managing IoT and time series data at scale. The most popular use case of storing, querying and analyzing time series generated by IoT devices in Cassandra is well-understood and documented. In general, a time series is stored and queried based on its source IoT device. However, there exists another class of IoT applications that require quick access to the most recent data generated by a collection of IoT devices based on a known state. The question that such applications need to answer is: Which IoT devices or sensors are currently reporting a specific state? In this blog post, we focus on this question and provide five possible data modeling solutions to efficiently answer it in Cassandra.&lt;/p&gt;</description></item><item><title>NoSQL Use Cases: When to Use a Non-Relational Database</title><link>https://foojayio.github.io/website/today/nosql-use-cases-when-to-use-a-non-relational-database/</link><pubDate>Thu, 28 Jul 2022 07:32:07 +0000</pubDate><guid>https://foojayio.github.io/website/today/nosql-use-cases-when-to-use-a-non-relational-database/</guid><description>&lt;p&gt;For decades, many companies have relied on relational databases to store, protect, and access their data.{#d8cf}&lt;/p&gt;
&lt;p&gt;SQL databases, in particular, worked well for a long time and still do for many use cases. But, today, there is a wide range of situations where SQL databases can no longer satisfy the needs of modern enterprises, especially those that have made the move to the cloud.{#d8cf}&lt;/p&gt;
&lt;p&gt;Increasingly, these companies are turning to NoSQL databases to meet their goals.{#d8cf}&lt;/p&gt;</description></item><item><title>Kubernetes and the Data Centre: Is Full Scale Migration Possible?</title><link>https://foojayio.github.io/website/today/kubernetes-and-the-data-centre-is-full-scale-migration-possible/</link><pubDate>Thu, 21 Jul 2022 13:48:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/kubernetes-and-the-data-centre-is-full-scale-migration-possible/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/kubernetes-and-the-data-centre-is-full-scale-migration-possible/kubernetes-genric-169jpeg_51633.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Data centres used to be exactly that - the centres of our data worlds, where all information, files and records would be kept and controlled.&lt;/p&gt;
&lt;p&gt;Today, that is no longer the case. More companies are moving to cloud services, whether this is dialling down on their traditional on-premises environments or never setting them up in the first place.&lt;/p&gt;
&lt;p&gt;This is not to say that data centres will be wholly abandoned for cloud, but the mix will continue to evolve and be very different to today. Gartner &lt;a href="https://www.gartner.com/smarterwithgartner/the-everywhere-enterprise-a-gartner-qa-with-david-cappuccio/" target="_blank" rel="noopener noreferrer"&gt;predicts&lt;/a&gt;
 that by 2025, 85% of infrastructure strategies will take a more hybrid approach, integrating on-premises, colocation, cloud and edge delivery options, compared with 20% in 2020.&lt;/p&gt;</description></item><item><title>Why a Cloud-Native Database Must Run on K8s</title><link>https://foojayio.github.io/website/today/why-a-cloud-native-database-must-run-on-k8s/</link><pubDate>Tue, 19 Jul 2022 17:44:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-a-cloud-native-database-must-run-on-k8s/</guid><description>&lt;p&gt;We&amp;rsquo;ve been talking about migrating workloads to the cloud for a long time, but a look at the application portfolios of many IT organizations demonstrates that there&amp;rsquo;s still a lot of work to be done. In many cases, challenges with persisting and moving data in clouds continue to be the key limiting factor slowing cloud adoption, despite the fact that databases in the cloud have been available for years.&lt;/p&gt;
&lt;p&gt;For this reason, there has been a surge of recent interest in data infrastructure that is designed to take maximum advantage of the benefits that cloud computing provides. A &lt;a href="https://k8ssandra.io/blog/2021/03/23/the-search-for-a-cloud-native-database/" target="_blank" rel="noopener noreferrer"&gt;cloud-native database&lt;/a&gt;
 is one that achieves the goals of scalability, elasticity, resiliency, observability and automation; the &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 project is a great example. It packages Apache &lt;a href="https://containerjournal.com/?s=Cassandra" target="_blank" rel="noopener noreferrer"&gt;Cassandra&lt;/a&gt;
 and supporting tools into a production-ready Kubernetes deployment.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 6: Build a Neo4j Microservice</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-6-build-a-neo4j-microservice/</link><pubDate>Wed, 13 Jul 2022 15:13:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-6-build-a-neo4j-microservice/</guid><description>&lt;p&gt;For our next adventure in Java microservices, we want to expand our system for book review data.&lt;/p&gt;
&lt;p&gt;While books and authors are well-suited for a document database such as MongoDB, once you add reviews to the mix, the importance of the relationships makes this project better suited for a graph database.&lt;/p&gt;
&lt;p&gt;This way, we can utilize relationships between the different entities to improve analysis based on the structure of the connections.&lt;/p&gt;</description></item><item><title>The End of the Beginning for Apache Cassandra</title><link>https://foojayio.github.io/website/today/the-end-of-the-beginning-for-apache-cassandra/</link><pubDate>Tue, 12 Jul 2022 17:43:39 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-end-of-the-beginning-for-apache-cassandra/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/the-end-of-the-beginning-for-apache-cassandra/1_xslbFHC3hRapwGV_wj17vg-1024x663.jpeg" alt="" loading="lazy"&gt;
 Image: &lt;a href="https://pixabay.com/photos/prairie-river-stream-curved-sunset-679014/" target="_blank" rel="noopener noreferrer"&gt;Pixabay&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Editor&amp;rsquo;s note: This story originally ran on July 27, 2021, the day that Apache Cassandra 4.0 was released.&lt;/em&gt;{#4bbb}&lt;/p&gt;
&lt;p&gt;Today is a big day for those of us in the &lt;a href="https://cassandra.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 community. After a long uphill climb, Apache Cassandra 4.0 has &lt;a href="https://thenewstack.io/apache-cassandra-4-0-comes-in-ready-for-production/" target="_blank" rel="noopener noreferrer"&gt;finally shipped&lt;/a&gt;
. I say finally, because it has at times seemed like an elusive goal. I&amp;rsquo;ve been involved in the Cassandra project for almost 10 years now and I have seen a lot of ups and downs.{#d6a4}&lt;/p&gt;</description></item><item><title>MicroStream - Part 5: Caching, Integrations and Clustering</title><link>https://foojayio.github.io/website/today/microstream-part-5-caching-integrations-and-clustering/</link><pubDate>Wed, 06 Jul 2022 07:11:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/microstream-part-5-caching-integrations-and-clustering/</guid><description>&lt;p&gt;&lt;strong&gt;In this last article of the series, we cover a few other MicroStream features: caching, clustering, and the integrations into other frameworks.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We have now covered three main aspects of MicroStream:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We have seen how you can &lt;a href="https://foojayio.github.io/website/today/microstream-part-2-configure-the-storage-manager/"&gt;configure the StorageManager&lt;/a&gt;
 to define where data is stored.&lt;/li&gt;
&lt;li&gt;We have discussed the &lt;a href="https://foojayio.github.io/website/today/microstream-part-3-storing-data/"&gt;strategy&lt;/a&gt;
 that you should follow to make sure the changes are also reflected in the storage so that we do not lose data.&lt;/li&gt;
&lt;li&gt;We described the &lt;a href="https://foojayio.github.io/website/today/microstream-part-4-serialisation-engine/"&gt;serialisation framework of MicroStream&lt;/a&gt;
 that stores the objects in a binary format so that it survives a process restart.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this last article of the series, we cover a few other features of MicroStream: caching, integrations into other products, and we discuss a major upcoming feature.&lt;/p&gt;</description></item><item><title>MicroStream Next-Generation Serialisation Engine</title><link>https://foojayio.github.io/website/today/microstream-part-4-serialisation-engine/</link><pubDate>Wed, 29 Jun 2022 08:07:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/microstream-part-4-serialisation-engine/</guid><description>&lt;p&gt;&lt;strong&gt;In this fourth part we go deeper into the Serialisation engine that is within MicroStream to store the Object graph in a binary format.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the previous articles (&lt;a href="https://foojayio.github.io/website/today/microstream-part-1-what-is-it/"&gt;part 1&lt;/a&gt;
, &lt;a href="https://foojayio.github.io/website/today/microstream-part-2-configure-the-storage-manager/"&gt;part 2&lt;/a&gt;
 and &lt;a href="https://foojayio.github.io/website/today/microstream-part-3-storing-data/"&gt;part 3&lt;/a&gt;
), we have already mentioned that MicroStream stores Java instances in storage in a binary way with a new, from the ground up created, serialisation framework.&lt;/p&gt;
&lt;p&gt;In this article, we go a bit more in detail about the next generation Java serialisation that we have built to achieve the MicroStream Java Object database and how you can use it outside the functionality of storing the root object that makes up your database.&lt;/p&gt;</description></item><item><title>K8ssandra ramps up security features to match Kubernetes’ best practices</title><link>https://foojayio.github.io/website/today/k8ssandra-ramps-up-security-features-to-match-kubernetes-best-practices/</link><pubDate>Thu, 23 Jun 2022 19:54:58 +0000</pubDate><guid>https://foojayio.github.io/website/today/k8ssandra-ramps-up-security-features-to-match-kubernetes-best-practices/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/k8ssandra-ramps-up-security-features-to-match-kubernetes-best-practices/1_qz4yqblkLUoJDL3t8xrsSg-1024x478.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;New security features are coming to the open-source data platform: K8ssandra. The goal? To align even more with the security best practices of Kubernetes. Here&amp;rsquo;s an introduction to the platform&amp;rsquo;s security mission and an update on current initiatives.&lt;/em&gt;{#e3b8}&lt;/p&gt;
&lt;p&gt;The security defaults applied by &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 are about to get even more aligned with&lt;a href="https://kubernetes.io/docs/concepts/security/overview/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&amp;rsquo; security practices&lt;/a&gt;
. In an upcoming release of K8ssandra, pod and container security configurations give users full customization capabilities and default values out of the box.{#c373}&lt;/p&gt;</description></item><item><title>MicroStream: How to store your data?</title><link>https://foojayio.github.io/website/today/microstream-part-3-storing-data/</link><pubDate>Wed, 22 Jun 2022 11:10:55 +0000</pubDate><guid>https://foojayio.github.io/website/today/microstream-part-3-storing-data/</guid><description>&lt;p&gt;&lt;strong&gt;In the third article of the MicroStream series, we go into the details what you need to do so that data is stored externally to survive the process restart.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the previous articles in this series, we introduced the &lt;a href="https://foojayio.github.io/website/today/microstream-part-1-what-is-it/"&gt;main features of the framework&lt;/a&gt;
 and how you can &lt;a href="https://foojayio.github.io/website/today/microstream-part-2-configure-the-storage-manager/"&gt;configure the &lt;em&gt;StorageManager&lt;/em&gt;&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Java instances in memory are your database but the &lt;em&gt;StorageManager&lt;/em&gt; makes sure that the data are persisted so that they are read the next time the runtime is started again.&lt;/p&gt;</description></item><item><title>Data Modeling in Cassandra and Astra DB</title><link>https://foojayio.github.io/website/today/data-modeling-in-cassandra-and-astra-db/</link><pubDate>Thu, 16 Jun 2022 19:22:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/data-modeling-in-cassandra-and-astra-db/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/data-modeling-in-cassandra-and-astra-db/0_90M63PeIIyDG3hj9-1024x581.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;What does it take to build an efficient and sound data model for &lt;a href="https://cassandra.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
® and &lt;a href="https://astra.dev/3z6AFNd" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra DB&lt;/a&gt;
? Where would one start? Are there any data modeling rules to follow? Can it be done consistently time and time again? The answers to these and many other questions can be found in the Cassandra data modeling methodology.{#3856}&lt;/p&gt;
&lt;p&gt;In this post, we present a high-level overview of the data modeling methodology for Cassandra and &lt;a href="https://astra.dev/3z6AFNd" target="_blank" rel="noopener noreferrer"&gt;Astra DB&lt;/a&gt;
, and share over half a dozen complete data modeling examples from various real-life domains. We apply the methodology to create Cassandra and Astra DB data models for IoT, messaging data, digital library, investment portfolio, time series, shopping cart, and order management. We even provide our datasets and queries for you to try.{#4bd9}&lt;/p&gt;</description></item><item><title>MicroStream: Configure the StorageManager</title><link>https://foojayio.github.io/website/today/microstream-part-2-configure-the-storage-manager/</link><pubDate>Wed, 15 Jun 2022 08:04:11 +0000</pubDate><guid>https://foojayio.github.io/website/today/microstream-part-2-configure-the-storage-manager/</guid><description>&lt;p&gt;&lt;strong&gt;In this second article in the series, we cover how to get started configuring the StorageManager of MicroStream!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As we have discussed in the &lt;a href="https://foojayio.github.io/website/today/microstream-part-1-what-is-it/" title="introduction article"&gt;introduction article&lt;/a&gt;
 of this series, MicroStream provides you with a solution to use Java instances in memory as your database.&lt;/p&gt;
&lt;p&gt;You can access the data through getters, the Stream API, or any other method provided on the Java Objects.&lt;/p&gt;
&lt;p&gt;This means ultrafast, no mapping required, and no external system for your data.&lt;/p&gt;</description></item><item><title>Tombstones and Ghost Data Don’t Have to Be Scary!</title><link>https://foojayio.github.io/website/today/tombstones-and-ghost-data-dont-have-to-be-scary/</link><pubDate>Thu, 09 Jun 2022 20:36:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/tombstones-and-ghost-data-dont-have-to-be-scary/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/tombstones-and-ghost-data-dont-have-to-be-scary/1_g5MhVmTyqdCWG_-LkItmNg-1024x679.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Working with tombstones can be one of the more frustrating aspects of Apache Cassandra®. Problems with tombstones can happen when a large number of deletes occur within a short period of time, resulting in slower queries and disk bloat. This article will discuss tombstones, including the purpose they serve, and strategies/methods on how to avoid them.&lt;/strong&gt;&lt;/em&gt;{#2508}&lt;/p&gt;
&lt;p&gt;&lt;a href="https://cassandra.apache.org/doc/4.0/cassandra/operating/compaction/index.html#why-tombstones" target="_blank" rel="noopener noreferrer"&gt;Tombstones&lt;/a&gt;
 in &lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
&lt;em&gt;®&lt;/em&gt; are written markers that are created whenever a value is deleted. Their purpose is to indicate that any prior values have been deleted. When a read occurs, it pulls data from the sorted string table (SSTable) files on a node that may contain the data. All prior values for the requested key are returned, ordered by write-time.{#d711}&lt;/p&gt;</description></item><item><title>Managing Distributed Applications in Kubernetes Using Cilium and Istio with Helm and Operator for Deployment</title><link>https://foojayio.github.io/website/today/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/</link><pubDate>Tue, 07 Jun 2022 14:51:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/managing-distributed-applications-in-kubernetes-using-cilium-and-istio-with-helm-and-operator-for-deployment/1_i26lEM7Wl5JA7FIMlhtKNA-1024x576.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post will show you the benefits of managing your distributed applications with Kubernetes in cross-cloud, multi-cloud, and hybrid cloud scenarios using Cilium and Istio with Helm and Operator for deployment.&lt;/em&gt;{#6864}&lt;/p&gt;
&lt;p&gt;In our recent post on &lt;a href="https://thenewstack.io/taking-your-database-beyond-a-single-kubernetes-cluster/" target="_blank" rel="noopener noreferrer"&gt;The New Stack&lt;/a&gt;
, we showed you how you can leverage &lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
 (K8s) and &lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
TM to manage distributed applications at scale, with thousands of nodes across both on-premises and in the cloud. In that example, we used &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 and &lt;a href="https://cloud.google.com/" target="_blank" rel="noopener noreferrer"&gt;Google Cloud Platform&lt;/a&gt;
 (GCP) to illustrate some of the challenges you might expect to encounter as you grow into a multi-cloud environment, upgrade to another K8s version, or begin working with different distributions and complimentary tooling. In this post, we&amp;rsquo;ll explore a few alternative approaches to using K8s to help you more easily manage distributed applications.{#fec3}&lt;/p&gt;</description></item><item><title>MicroStream: High-Performance Java-Native-Persistence framework</title><link>https://foojayio.github.io/website/today/microstream-part-1-what-is-it/</link><pubDate>Mon, 06 Jun 2022 08:03:02 +0000</pubDate><guid>https://foojayio.github.io/website/today/microstream-part-1-what-is-it/</guid><description>&lt;p&gt;Within every application, data plays a very important role.&lt;/p&gt;
&lt;p&gt;In every industry, you have data, such as customer or product information, analysis results, patient data, or account data is a vital part of the business and the applications that support your business processes.&lt;/p&gt;
&lt;p&gt;Data must be in memory to be processed by your application, but must be stored outside of it because the application&amp;rsquo;s memory is temporary.&lt;/p&gt;
&lt;p&gt;Information is lost when the process ends unless we have stored it somewhere else in a sustainable way.&lt;/p&gt;</description></item><item><title>How DataStax Tracked Down a Linux Kernel Bug with Fallout</title><link>https://foojayio.github.io/website/today/how-datastax-tracked-down-a-linux-kernel-bug-with-fallout/</link><pubDate>Thu, 02 Jun 2022 15:32:08 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-datastax-tracked-down-a-linux-kernel-bug-with-fallout/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/how-datastax-tracked-down-a-linux-kernel-bug-with-fallout/1_N_gqb3PrkKgMbJHSmYeOaw-1024x750.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sometimes as a developer, you run into a bug buried deep within the layers of your software stack. Chasing down the root cause requires not only curiosity, patience, and a healthy dose of tenacity but a willingness to try different tools and approaches. This post describes our challenges and ultimate success in tracking down a Linux kernel bug using Fallout.&lt;/em&gt;{#ee66}&lt;/p&gt;
&lt;p&gt;Bugs come in all shapes and sizes and it&amp;rsquo;s not always clear at the beginning of a debugging session which one you&amp;rsquo;re currently chasing. Some bugs can be fixed up in a matter of minutes while others take weeks to nail down. And the really tricky ones require you to dig through multiple layers of your software stack, stressing the limits of your patience.{#8aae}&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 5: Building an Empire of Microservices</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-5-building-an-empire-of-microservices/</link><pubDate>Thu, 02 Jun 2022 05:08:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-5-building-an-empire-of-microservices/</guid><description>&lt;p&gt;We continue building our microservices system by adding a coordination layer to handle spinning multiple services up and down.&lt;/p&gt;
&lt;p&gt;In previous articles, we grew from two Spring Boot applications to three applications + a database container.&lt;/p&gt;
&lt;p&gt;As we continue to scale and broaden our system, we will need something to coordinate service and ensure consistent communication (avoid human error).&lt;/p&gt;
&lt;p&gt;We will do this through &lt;a href="https://docs.docker.com/compose/" target="_blank" rel="noopener noreferrer"&gt;&lt;code&gt;docker-compose&lt;/code&gt;&lt;/a&gt;
, an orchestration tool that manages containerized applications.&lt;/p&gt;</description></item><item><title>Optimizing Distributed Joins: The Case of Google Cloud Spanner and DataStax Astra DB</title><link>https://foojayio.github.io/website/today/optimizing-distributed-joins-the-case-of-google-cloud-spanner-and-datastax-astra-db/</link><pubDate>Tue, 31 May 2022 16:25:25 +0000</pubDate><guid>https://foojayio.github.io/website/today/optimizing-distributed-joins-the-case-of-google-cloud-spanner-and-datastax-astra-db/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/optimizing-distributed-joins-the-case-of-google-cloud-spanner-and-datastax-astra-db/0_6VGah2hwaLIBjW7R-1024x576.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In this post, learn how relational and NoSQL databases, Google Cloud Spanner and DataStax Astra DB, optimize distributed joins for real-time applications.&lt;/em&gt;{#c63a}&lt;/p&gt;
&lt;p&gt;Distributed joins are commonly considered to be too expensive to use for real-time transaction processing. That is because, besides joining data, they also frequently require moving or shuffling data between nodes in a cluster, which can significantly affect query response times and database throughput. However, there are certain optimizations that can completely eliminate the need to move data to enable faster joins. In this article, we first review the four types of distributed joins, including shuffle join, broadcast join, co-located join, and pre-computed join. We then demonstrate how leading fully managed Relational and NoSQL databases, namely &lt;a href="https://cloud.google.com/spanner" target="_blank" rel="noopener noreferrer"&gt;Google Cloud Spanner&lt;/a&gt;
 and &lt;a href="https://auth.cloud.datastax.com/auth/realms/CloudUsers/protocol/openid-connect/registrations?client_id=auth-proxy&amp;amp;response_type=code&amp;amp;scope=openid&amp;#43;profile&amp;#43;email&amp;amp;redirect_uri=https://astra.datastax.com/welcome" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra DB&lt;/a&gt;
, support optimized joins that are suitable for real-time applications.{#bea1}&lt;/p&gt;</description></item><item><title>Why Developers Should Use Apache Pulsar</title><link>https://foojayio.github.io/website/today/why-developers-should-use-apache-pulsar/</link><pubDate>Thu, 19 May 2022 15:10:49 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-developers-should-use-apache-pulsar/</guid><description>&lt;p&gt;Apache Pulsar is an open source streaming platform that addresses some important limitations in Kafka, particularly for cloud-native applications.&lt;br&gt;
&lt;img src="https://foojayio.github.io/website/today/why-developers-should-use-apache-pulsar/data_explosion_proliferation_transmission_data_streams_volume_velocity_by_spainter_vfx_gettyimages-896319676_cso_2400x1600-100852889-large-1024x683.jpg" alt="" loading="lazy"&gt;
 SPainter VFX / Getty Images&lt;/p&gt;
&lt;p&gt;If you are building applications today, you are probably familiar with the microservices model: Rather than building big monolithic applications, we break services down into isolated components that we can independently update or change over time.&lt;/p&gt;
&lt;p&gt;Microservices deployments then can use a message bus to decouple and manage the communication between services, which makes it easier to replay requests, handle errors, and deal with load spikes and rapid increases in requests while maintaining the serialized order.&lt;/p&gt;</description></item><item><title>Bring Streaming to Apache Cassandra with Apache Pulsar</title><link>https://foojayio.github.io/website/today/bring-streaming-to-apache-cassandra-with-apache-pulsar/</link><pubDate>Thu, 05 May 2022 18:10:42 +0000</pubDate><guid>https://foojayio.github.io/website/today/bring-streaming-to-apache-cassandra-with-apache-pulsar/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/bring-streaming-to-apache-cassandra-with-apache-pulsar/1_4VRCkVXi6RRfK4pwrJkPjw-1024x506.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Twitch, YouTube, Instagram, Facebook &amp;mdash; virtually every major brand nowadays uses live streaming to connect and engage their audience.{#2544}&lt;/p&gt;
&lt;p&gt;For enterprises and developers &lt;a href="https://datastax.medium.com/build-your-first-app-with-javascript-node-js-and-datastax-astra-db-573abc238583" target="_blank" rel="noopener noreferrer"&gt;building cloud-native applications&lt;/a&gt;
, this growing trend creates a need for streaming technologies that can reliably handle the rush of massive amounts of data, while also being flexible and easy to manage for developers.{#2544}&lt;/p&gt;
&lt;p&gt;One such technology is &lt;a href="https://pulsar.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Pulsar&lt;/a&gt;
&lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;®&lt;/a&gt;
 &amp;mdash; an open-source, distributed messaging and streaming platform that&amp;rsquo;s easy to deploy, simple to scale, and packed with developer-friendly APIs.{#8b5a}&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 4: Building an Empire of Microservices</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-4-building-an-empire-of-microservices/</link><pubDate>Wed, 27 Apr 2022 07:22:03 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-4-building-an-empire-of-microservices/</guid><description>&lt;p&gt;This article is the fourth iteration in a series of posts about building microservices in Java.&lt;/p&gt;
&lt;p&gt;The initial post started with a single string message passed between two locally-running applications, and we are gradually adding services and functionality along the way.&lt;/p&gt;
&lt;p&gt;In this level 4 instalment, we will add a new service that will manage book authors. It will call a database containing a data domain of books and retrieve authors and their information. This will entail creating a new, separate service from our previously written service1 and service2.&lt;/p&gt;</description></item><item><title>SQL vs. NoSQL: Pros &amp; Cons</title><link>https://foojayio.github.io/website/today/sql-vs-nosql-pros-cons-2/</link><pubDate>Thu, 21 Apr 2022 09:28:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/sql-vs-nosql-pros-cons-2/</guid><description>&lt;p&gt;What&amp;rsquo;s the best way to store, protect and access your data?{#abb7}&lt;/p&gt;
&lt;p&gt;This is a fundamental, yet critical decision.{#abb7}&lt;/p&gt;
&lt;p&gt;After all, data is the cornerstone of success for just about every modern organization.{#abb7}&lt;/p&gt;
&lt;p&gt;For most companies, the choice comes down to SQL and NoSQL databases. Each has unique strengths and weaknesses.{#abb7}&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SQL databases have been a proven option since the 1970s. They are made up of highly structured tables, consisting of rows and columns, related to one other through common attributes. Every column is required to have a value for its corresponding row.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;ul&gt;
&lt;li&gt;NoSQL (&amp;ldquo;not only SQL&amp;rdquo; or &amp;ldquo;non-SQL&amp;rdquo;) databases came along later to break the relational table straitjacket, with the ability to store and access all data types, structured and unstructured, together.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;They&amp;rsquo;re extremely flexible and easy for developers to work with and modify. &lt;a href="https://www.datastax.com/what-is/nosql" target="_blank" rel="noopener noreferrer"&gt;Learn more about SQL and NoSQL databases and their basic differences&lt;/a&gt;
.{#3ad0}&lt;/p&gt;</description></item><item><title>Have you upgraded to Cassandra 4.0 yet?</title><link>https://foojayio.github.io/website/today/have-you-upgraded-to-cassandra-4-0/</link><pubDate>Fri, 11 Mar 2022 08:35:20 +0000</pubDate><guid>https://foojayio.github.io/website/today/have-you-upgraded-to-cassandra-4-0/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/have-you-upgraded-to-cassandra-4-0/shutterstock_140530141-350x233-1.jpg" alt="" loading="lazy"&gt;
 © Shutterstock / Phototribe&lt;/p&gt;
&lt;p&gt;Alongside stability, Apache Cassandra 4.0 stands out for its ability to scale operations faster, its new auditing capabilities, and the way it embraces privacy by design. In this article, we&amp;rsquo;ll cover the new features and walk you through the steps required to upgrade to Cassandra 4.0.&lt;/p&gt;
&lt;p&gt;The general availability of Apache Cassandra 4.0 marks the most stable release in the project&amp;rsquo;s history.&lt;/p&gt;
&lt;p&gt;Even with the 4.0 beta 1 release back in July 2020, Project Management Committee (PMC) members were confident the latest version of the distributed NoSQL database would be ready to go to work with Apache Cassandra Committer; PMC member Sankalp Kohli at the time indicated that &amp;ldquo;users will be able to use the release knowing it is production-ready on day one.&amp;rdquo;&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 3: Building an Empire of Microservices</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-3-building-an-empire-of-microservices/</link><pubDate>Fri, 04 Mar 2022 16:23:40 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-3-building-an-empire-of-microservices/</guid><description>&lt;p&gt;We are still in the beginning stages of building microservices with Java, but we have already seen how to send and receive communications between two Spring Boot applications. In the &lt;a href="https://jmhreif.com/blog/microservices-level1/" target="_blank" rel="noopener noreferrer"&gt;first blog post&lt;/a&gt;
 of this series, our two applications transmitted a message string of &lt;code&gt;&amp;quot;Hello, World!&amp;quot;&lt;/code&gt;. In the &lt;a href="https://jmhreif.com/blog/microservices-level2/" target="_blank" rel="noopener noreferrer"&gt;second blog post&lt;/a&gt;
, we took it one step further by embedding a MongoDB database into our &lt;code&gt;service1&lt;/code&gt;, added a data domain (books) with four pre-populated entries, and transmitted the &lt;code&gt;Book&lt;/code&gt; information between the two applications.&lt;/p&gt;</description></item><item><title>The Serverless Database You Really Want</title><link>https://foojayio.github.io/website/today/the-serverless-database-you-really-want/</link><pubDate>Thu, 03 Mar 2022 20:43:05 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-serverless-database-you-really-want/</guid><description>&lt;p&gt;The dreaded part of every site reliability engineer&amp;rsquo;s (SRE) job eventually: capacity planning. You know, the dance between all the stakeholders when deploying your applications. Did engineering really simulate the right load and do we understand how the application scales? Did product managers accurately estimate the amount of usage? Did we make architectural decisions that will keep us from meeting our SLA goals? And then the question that everyone will have to answer eventually: how much is this going to cost? This forces SREs to assume the roles of engineer, accountant and fortune teller.&lt;/p&gt;</description></item><item><title>Why Pulsar Beats Kafka for a Scalable, Distributed Data Architecture</title><link>https://foojayio.github.io/website/today/why-pulsar-beats-kafka-for-a-scalable-distributed-data-architecture/</link><pubDate>Thu, 03 Mar 2022 14:10:45 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-pulsar-beats-kafka-for-a-scalable-distributed-data-architecture/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/why-pulsar-beats-kafka-for-a-scalable-distributed-data-architecture/shutterstock_1009002379-350x233-1.jpg" alt="" loading="lazy"&gt;
 © Shutterstock / Jurik Peter&lt;/p&gt;
&lt;p&gt;The leading open source event streaming platforms are Apache Kafka and Apache Pulsar. For enterprise architects and application developers, choosing the right event streaming approach is critical, as these technologies will help their apps scale up around data to support operations in production.&lt;/p&gt;
&lt;p&gt;Everyone wants results faster. We want applications that know what we want, even before we know ourselves. We want systems that constantly check for fraud or security issues to protect our data. We want applications that are smart enough to react and change plans when faced with the unexpected. And we want those services to be continuously available.&lt;/p&gt;</description></item><item><title>Save Hours on your Setup of K8ssandra with the New Config Builder</title><link>https://foojayio.github.io/website/today/save-hours-on-your-setup-of-k8ssandra-with-the-new-config-builder/</link><pubDate>Thu, 24 Feb 2022 19:36:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/save-hours-on-your-setup-of-k8ssandra-with-the-new-config-builder/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;Setting up K8ssandra in your workflow just got a whole lot easier. With the new Config Builder you can be running Apache Cassandra® on Kubernetes in a matter of minutes.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The purpose of K8ssandra is to make it easy to run Apache Cassandra® on Kubernetes. We recently took another big step in that direction by releasing the &lt;a href="https://dtsx.io/3pIiPcR" target="_blank" rel="noopener noreferrer"&gt;K8ssandra config builder&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Even if you&amp;rsquo;ve created thousands of nodes or integrated K8ssandra in your stack, you&amp;rsquo;ll probably want to give the config builder a try. Walk through the interactive wizard defining the shape of your cluster, resource requirements, and toggle features to fit your needs. This is great for smoothing out the on-ramp for a production ready environment of K8ssandra.&lt;/p&gt;</description></item><item><title>Why we decided to build a K8ssandra Operator - Part 4</title><link>https://foojayio.github.io/website/today/why-we-decided-to-build-a-k8ssandra-operator-part-4/</link><pubDate>Tue, 22 Feb 2022 17:04:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-we-decided-to-build-a-k8ssandra-operator-part-4/</guid><description>&lt;p&gt;In the &lt;a href="https://k8ssandra.io/blog/other/why_k8ssandra_operator_part_1/" target="_blank" rel="noopener noreferrer"&gt;first&lt;/a&gt;
, &lt;a href="https://k8ssandra.io/blog/articles/why-k8ssandra-operator-part-2/" target="_blank" rel="noopener noreferrer"&gt;second&lt;/a&gt;
, and &lt;a href="https://k8ssandra.io/blog/articles/why-we-decided-to-build-a-k8ssandra-operator-part-3/" target="_blank" rel="noopener noreferrer"&gt;third&lt;/a&gt;
 posts in this series, we&amp;rsquo;ve shared conversations with K8ssandra core team members on our journey to build a Kubernetes operator for K8ssandra. We&amp;rsquo;ve discussed the virtues of the Helm package manager versus Kubernetes operators for deploying and managing infrastructure in Kubernetes and some of our implementation choices for the operator.&lt;/p&gt;
&lt;p&gt;In this final post of the series, we pick up from the previous post with a discussion of how we decided to structure our projects in GitHub, how we test the K8ssandra operator, and our hopes for how the operator will expand the K8ssandra developer community.&lt;/p&gt;</description></item><item><title>The Critical Role Streaming Plays in a Data Stack</title><link>https://foojayio.github.io/website/today/the-critical-role-streaming-plays-in-a-data-stack/</link><pubDate>Fri, 18 Feb 2022 17:20:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-critical-role-streaming-plays-in-a-data-stack/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/the-critical-role-streaming-plays-in-a-data-stack/streaming-data-Depositphotos_5_tn-300x210-1.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;Why Apache Pulsar is the right choice for multi-datacenter, geo-distributed deployments.&lt;/p&gt;
&lt;p&gt;Building applications today requires companies and teams to be familiar with data flows (including streaming data flows) and how to transform them into compelling user experiences. Data fuels companies&amp;rsquo; ability to understand their customers, move faster than competitors, and provide compelling products that the market wants. According to &lt;a href="https://www.datastax.com/resources/report/the-state-of-the-data-race-2021" target="_blank" rel="noopener noreferrer"&gt;research&lt;/a&gt;
 by DataStax and Clearpath Strategies, almost all companies (96%) now have a formal strategy for how they will work with data, but only 38% think they&amp;rsquo;re doing a good job using data in their applications.&lt;/p&gt;</description></item><item><title>Journeys in Java, Level 2: Building an Empire of Microservices</title><link>https://foojayio.github.io/website/today/journeys-in-java-level-2-building-an-empire-of-microservices/</link><pubDate>Wed, 16 Feb 2022 15:29:33 +0000</pubDate><guid>https://foojayio.github.io/website/today/journeys-in-java-level-2-building-an-empire-of-microservices/</guid><description>&lt;p&gt;&lt;strong&gt;Let&amp;rsquo;s dive into the world of microservices find out the complexities, best practices, and troubles. I will share all my learnings, as well!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://jmhreif.com/blog/microservices-level1/" target="_blank" rel="noopener noreferrer"&gt;last blog post&lt;/a&gt;
, we began building microservices in Java with two Spring Boot applications, passing a &amp;ldquo;Hello, World!&amp;rdquo; string from one application to the other. We focused on reduced complexity, minimum previous knowledge, and few components. Next, we can slowly add pieces that simulate microservices projects in the real world.&lt;/p&gt;</description></item><item><title>Cassandra Database Migration to Kubernetes with Zero Downtime</title><link>https://foojayio.github.io/website/today/cassandra-database-migration-to-kubernetes-with-zero-downtime/</link><pubDate>Tue, 15 Feb 2022 15:22:15 +0000</pubDate><guid>https://foojayio.github.io/website/today/cassandra-database-migration-to-kubernetes-with-zero-downtime/</guid><description>&lt;p&gt;K8ssandra is a cloud-native distribution of the Apache Cassandra® database that runs on Kubernetes, with a suite of tools to ease and automate operational tasks. In this post, we&amp;rsquo;ll walk you through a database migration from a Cassandra cluster running in AWS EC2 to a K8ssandra cluster running in Kubernetes on AWS EKS, with zero downtime.&lt;/p&gt;
&lt;p&gt;As an Apache Cassandra user, your expectation should be that migrating to K8ssandra would happen without downtime. To make that happen with &amp;ldquo;classic&amp;rdquo; clusters running on virtual machines or bare metal instances, you will use the datacenter (DC) switch technique which is commonly used in the Cassandra community to transfer clusters to different hardware or environments. The good news is that it&amp;rsquo;s not very different for clusters running in Kubernetes as most Container Network Interfaces (CNI) will provide routable pod IPs.&lt;/p&gt;</description></item><item><title>Building Reactive Java Applications with Spring Framework</title><link>https://foojayio.github.io/website/today/building-reactive-java-applications-with-spring-framework/</link><pubDate>Tue, 15 Feb 2022 14:09:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-reactive-java-applications-with-spring-framework/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/building-reactive-java-applications-with-spring-framework/1_bAqotS_F1PipZLOHx_Tcww-1024x403.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In one of our many free tutorials on&lt;/em&gt; &lt;a href="https://www.youtube.com/c/DataStaxDevs/videos" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;DataStax Developers YouTube channel&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;, we walked you through&lt;/em&gt; &lt;a href="https://www.youtube.com/watch?v=1aRbndIcXV4" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;how to build a reactive implementation of Spring PetClinic&lt;/em&gt;&lt;/a&gt;
in &lt;em&gt;Apache Cassandra® using Spring WebFlux. The full series is&lt;/em&gt; &lt;a href="https://github.com/datastaxdevs/workshop-spring-reactive" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;available on YouTube&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;.&lt;/em&gt;{#08a7}&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a Java developer who uses the Spring ecosystem, you&amp;rsquo;ve probably seen the &lt;a href="https://github.com/datastaxdevs/workshop-spring-reactive" target="_blank" rel="noopener noreferrer"&gt;Spring Pet Clinic&lt;/a&gt;
. In this workshop, we will walk you through a new reactive implementation of the Pet Clinic backend that uses Spring WebFlux and Apache &lt;a href="https://www.datastax.com/what-is/cassandra" target="_blank" rel="noopener noreferrer"&gt;Cassandra&lt;/a&gt;
® (via &lt;a href="https://astra.dev/3lSpuQp" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra DB&lt;/a&gt;
).{#47b5}&lt;/p&gt;</description></item><item><title>Building Scalable Streaming Applications with DataStax Astra Streaming</title><link>https://foojayio.github.io/website/today/building-scalable-streaming-applications-with-datastax-astra-streaming/</link><pubDate>Wed, 09 Feb 2022 19:09:28 +0000</pubDate><guid>https://foojayio.github.io/website/today/building-scalable-streaming-applications-with-datastax-astra-streaming/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/building-scalable-streaming-applications-with-datastax-astra-streaming/0_Yj9vaj0to8ZAf9NJ-1-1024x682.jpeg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This post introduces developers to&lt;/em&gt; &lt;a href="https://astra.dev/3SZLxE1" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;DataStax Astra Streaming&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;with a step-by-step tutorial that illustrates how it can be used to easily build scalable, streaming applications.&lt;/em&gt;{#39ae}&lt;/p&gt;
&lt;p&gt;&lt;a href="https://astra.dev/3SZLxE1" target="_blank" rel="noopener noreferrer"&gt;Astra Streaming&lt;/a&gt;
 enables developers to build streaming applications on top of an elastically scalable, multi-cloud messaging and event streaming platform powered by &lt;a href="https://pulsar.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Pulsar&lt;/a&gt;
. &lt;a href="https://astra.dev/3SZLxE1" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra Streaming&lt;/a&gt;
 is currently in beta, and we&amp;rsquo;ll be releasing a full demo soon. In the meantime, this article will walk you through a short demo that will provide a great starting point for familiarizing yourself with this powerful new streaming service.{#a6cf}&lt;/p&gt;</description></item><item><title>SQL vs. NoSQL: Pros &amp; Cons</title><link>https://foojayio.github.io/website/today/sql-vs-nosql-pros-cons/</link><pubDate>Wed, 09 Feb 2022 09:26:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/sql-vs-nosql-pros-cons/</guid><description>&lt;p&gt;What&amp;rsquo;s the best way to store, protect and access your data? This is a fundamental, yet critical decision. After all, data is the cornerstone of success for just about every modern organization. For most companies, the choice comes down to SQL and NoSQL databases. Each has unique strengths and weaknesses.&lt;/p&gt;
&lt;p&gt;SQL databases have been a proven option since the 1970s. They are made up of highly structured tables, consisting of rows and columns, related to one other through common attributes. Every column is required to have a value for its corresponding row. NoSQL (&amp;ldquo;not only SQL&amp;rdquo; or &amp;ldquo;non-SQL&amp;rdquo;) databases came along later to break the relational table straitjacket, with the ability to store and access all data types, structured and unstructured, together. They&amp;rsquo;re extremely flexible and easy for developers to work with and modify. &lt;a href="https://www.datastax.com/nosql" target="_blank" rel="noopener noreferrer"&gt;Learn more about SQL and NoSQL databases and their basic differences&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Deploying to Multiple Kubernetes Clusters with the K8ssandra Operator</title><link>https://foojayio.github.io/website/today/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator/</link><pubDate>Fri, 04 Feb 2022 22:10:56 +0000</pubDate><guid>https://foojayio.github.io/website/today/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator/0_cYkNr7XdB-MsJiu5-1024x674.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;We built the new K8ssandra Operator to simplify deploying multiple Apache Cassandra data centers in different regions and across multiple Kubernetes (K8s) clusters. We&amp;rsquo;re not at the finish line just yet, but we&amp;rsquo;ve hit the first major milestone. Now, it&amp;rsquo;s easier than ever to run Apache Cassandra® across multiple K8s clusters in multiple regions with the K8ssandraCluster!&lt;/p&gt;
&lt;p&gt;The K8ssandraCluster is a new custom resource for K8ssandra that covers all the bases necessary for installing a production-ready, multi-cluster K8ssandra deployment. Head over to the &lt;a href="https://medium.com/building-the-open-data-stack/deploying-to-multiple-kubernetes-clusters-with-the-k8ssandra-operator-f7562bee1841" target="_blank" rel="noopener noreferrer"&gt;DataStax Tech blog&lt;/a&gt;
 to learn more about how to specify your remote clusters with the K8ssandraCluster, its deployment architecture, and what&amp;rsquo;s coming next in our continued development of the K8ssandra operator.&lt;/p&gt;</description></item><item><title>Backing up K8ssandra with MinIO</title><link>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio-2/</link><pubDate>Thu, 03 Feb 2022 22:50:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio-2/</guid><description>&lt;p&gt;K8ssandra includes Medusa for Apache Cassandra® to handle backup and restore for your Cassandra nodes. Recently Medusa was upgraded to introduce support for all S3 compatible backends, including &lt;a href="https://min.io/" target="_blank" rel="noopener noreferrer"&gt;MinIO&lt;/a&gt;
, the popular k8s-native object storage suite. Let&amp;rsquo;s see how to set up K8ssandra and MinIO to backup Cassandra in just a few steps.&lt;/p&gt;
&lt;h2 id="deploy-minio"&gt;Deploy MinIO&lt;/h2&gt;
&lt;p&gt;Similar to K8ssandra, MinIO can be simply deployed through Helm.&lt;/p&gt;
&lt;p&gt;First, add the MinIO repository to your local list:&lt;/p&gt;</description></item><item><title>Unboxing K8ssandra: The Data Layer For Your Kubernetes-Powered Applications</title><link>https://foojayio.github.io/website/today/unboxing-k8ssandra-the-data-layer-for-your-kubernetes-powered-applications/</link><pubDate>Tue, 01 Feb 2022 17:51:35 +0000</pubDate><guid>https://foojayio.github.io/website/today/unboxing-k8ssandra-the-data-layer-for-your-kubernetes-powered-applications/</guid><description>&lt;h4 id="a-complimentary-live-webinar-sponsored-by-datastax"&gt;A Complimentary Live Webinar, Sponsored by DataStax&lt;/h4&gt;
&lt;p&gt;Kubernetes made it easy to deploy and scale out your cloud-native applications. With &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
, you can now scale application data with the same simplicity and high availability. Join us as we unbox K8ssandra a cloud native data layer for Kubernetes and explore how you can deploy it alongside your applications.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.k8ssandra.io/install/" target="_blank" rel="noopener noreferrer"&gt;Install k8ssandra&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authenticate with &lt;a href="https://stargate.io/" target="_blank" rel="noopener noreferrer"&gt;Stargate&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Query your data via a convenient API (REST, document, or graphql)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not familiar with Cassandra? &lt;a href="https://astra.dev/3f8QkAl" target="_blank" rel="noopener noreferrer"&gt;Astra DB&lt;/a&gt;
 is a great (free) place to learn without any of the infrastructure setup, or management headaches.&lt;/p&gt;</description></item><item><title>Taking Your Database Beyond a Single Kubernetes Cluster</title><link>https://foojayio.github.io/website/today/taking-your-database-beyond-a-single-kubernetes-cluster/</link><pubDate>Wed, 19 Jan 2022 10:31:47 +0000</pubDate><guid>https://foojayio.github.io/website/today/taking-your-database-beyond-a-single-kubernetes-cluster/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/taking-your-database-beyond-a-single-kubernetes-cluster/0_ntxtNVffHhl99weW-1-1024x535.jpg" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;By &lt;a href="https://www.linkedin.com/in/bradfordcp/" target="_blank" rel="noopener noreferrer"&gt;Christopher Bradford&lt;/a&gt;
 and &lt;a href="https://www.linkedin.com/in/ty-morton-2b55b82/" target="_blank" rel="noopener noreferrer"&gt;Ty Morton&lt;/a&gt;
{#31db}&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Global applications need a data layer that is as distributed as the users they serve. &lt;a href="https://cassandra.apache.org/_/index.html" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 has risen to this challenge, handling data needs for the likes of Apple, Netflix and Sony. Traditionally, managing data layers for a distributed application was handled with dedicated teams to manage the deployment and operations of thousands of nodes &amp;mdash; both on-premises and in the cloud.&lt;/p&gt;</description></item><item><title>Kubernetes and Apache Cassandra: What Works (and What Doesn’t)</title><link>https://foojayio.github.io/website/today/kubernetes-and-apache-cassandra-what-works-and-what-doesnt/</link><pubDate>Fri, 14 Jan 2022 16:30:50 +0000</pubDate><guid>https://foojayio.github.io/website/today/kubernetes-and-apache-cassandra-what-works-and-what-doesnt/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/kubernetes-and-apache-cassandra-what-works-and-what-doesnt/K15a-AdobeStock_459893049-1536x922-1-1024x615.jpeg" alt="" loading="lazy"&gt;
 &amp;ldquo;I need it now and I need it reliable&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ndash; ANYONE WHO HASN&amp;rsquo;T DEPLOYED APPLICATION INFRASTRUCTURE&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you&amp;rsquo;re on the receiving end of this statement, we understand you here in the &lt;a href="https://dtsx.io/3uZHFqS" target="_blank" rel="noopener noreferrer"&gt;K8ssandra community&lt;/a&gt;
. Although we do have reason for hope. Recent &lt;a href="https://dok.community/dokc-2021-report/" target="_blank" rel="noopener noreferrer"&gt;surveys&lt;/a&gt;
 have shown that &lt;a href="https://kubernetes.io/" target="_blank" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;
 (K8s) is growing in popularity, not only because it&amp;rsquo;s powerful technology, but because it actually delivers on reducing the toil of deployment.&lt;/p&gt;</description></item><item><title>How to Put a Database in Kubernetes?</title><link>https://foojayio.github.io/website/today/how-to-put-a-database-in-kubernetes/</link><pubDate>Thu, 13 Jan 2022 09:18:38 +0000</pubDate><guid>https://foojayio.github.io/website/today/how-to-put-a-database-in-kubernetes/</guid><description>&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/how-to-put-a-database-in-kubernetes/0_aX8FjIfXNHJhbSWU.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Learn the key steps of deploying databases and stateful workloads in Kubernetes and meet the cloud-native technologies, like K8ssandra, that can streamline Apache Cassandra for K8s.&lt;/strong&gt;{#95cc}&lt;/p&gt;
&lt;p&gt;The idea of running a stateful workload in Kubernetes (K8s) can be intimidating, especially if you haven&amp;rsquo;t done it before. How do you deploy a database? Where is the actual storage? How is the storage mapped to the database or the application using it?{#6cde}&lt;/p&gt;</description></item><item><title>Requirements for Running K8ssandra for Development</title><link>https://foojayio.github.io/website/today/requirements-for-running-k8ssandra-for-development/</link><pubDate>Thu, 06 Jan 2022 12:15:27 +0000</pubDate><guid>https://foojayio.github.io/website/today/requirements-for-running-k8ssandra-for-development/</guid><description>&lt;br /&gt;
&lt;p&gt;The K8ssandra &lt;a href="https://k8ssandra.io/get-started/" target="_blank" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;
 is a excellent guide for doing a full installation of K8ssandra on a dev laptop and trying out the various components of the K8ssandra stack. While this is a great way to get your first hands-on experience with K8ssandra, let&amp;rsquo;s state the obvious: running K8ssandra locally on a dev laptop is not aimed at performance. In this blog post, we will start Apache Cassandra® locally then explain how to run benchmarks to help evaluate what level of performance (especially throughput) you can expect from a dev laptop deployment.&lt;/p&gt;</description></item><item><title>Why K8ssandra?</title><link>https://foojayio.github.io/website/today/why-k8ssandra/</link><pubDate>Thu, 06 Jan 2022 12:10:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-k8ssandra/</guid><description>&lt;h2 id="the-problem-scalable-data-persistence-for-cloud-native-applications"&gt;The problem: scalable data persistence for cloud-native applications&lt;/h2&gt;
&lt;p&gt;The past decade and a half has brought tremendous change in how we in the software industry think about building and delivering internet applications. With the launch of Amazon Web Services (AWS) in 2006, companies of any size could access cloud computing infrastructure. The burst of creativity that followed gave birth to concepts like &lt;a href="http://pzf.fremantle.org/2010/05/cloud-native.html" target="_blank" rel="noopener noreferrer"&gt;cloud-native&lt;/a&gt;
 in 2010, and methodologies such as the &lt;a href="https://12factor.net/" target="_blank" rel="noopener noreferrer"&gt;twelve-factor app&lt;/a&gt;
 in 2011.&lt;/p&gt;</description></item><item><title>Simplify Migrating from Kafka to Pulsar with Kafka Connect Support</title><link>https://foojayio.github.io/website/today/simplify-migrating-from-kafka-to-pulsar-with-kafka-connect-support/</link><pubDate>Wed, 05 Jan 2022 11:30:09 +0000</pubDate><guid>https://foojayio.github.io/website/today/simplify-migrating-from-kafka-to-pulsar-with-kafka-connect-support/</guid><description>&lt;p&gt;Large-scale implementations of any system, such as the event-streaming platform Apache Kafka, often involve customizations and tools and plugins developed in-house. When it&amp;rsquo;s time to transition from one system to another, the task can become complicated, drawn-out, and error-prone. Often the benefits of an alternative system (which can include &lt;a href="https://gigaom.com/report/the-cost-savings-of-replacing-kafka-with-pulsar/" target="_blank" rel="noopener noreferrer"&gt;significant cost savings&lt;/a&gt;
 and other efficiencies) are outweighed by the risks and costs of migration. As a result, an organization can end up locked into a suboptimal situation, footing a bigger bill than necessary and missing out on modern features that help move the business forward faster.&lt;/p&gt;</description></item><item><title>New Survey Finds Data on Kubernetes Is No Longer a Pipe Dream</title><link>https://foojayio.github.io/website/today/new-survey-finds-data-on-kubernetes-is-no-longer-a-pipe-dream/</link><pubDate>Thu, 30 Dec 2021 15:52:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/new-survey-finds-data-on-kubernetes-is-no-longer-a-pipe-dream/</guid><description>&lt;p&gt;For people that work in infrastructure and application development, the pace of change is quick. Finish one project and it&amp;rsquo;s on to the next. Each iteration requires an evaluation asking if the right technology is being used and if it provides a new advantage. Kubernetes has been on the fast track of continuous evaluation. New projects and methodologies are continuously emerging and it can be hard to keep up. Then there is the question of running stateful services. The Data on Kubernetes community has &lt;a href="https://dok.community/dokc-2021-report/" target="_blank" rel="noopener noreferrer"&gt;released a report&lt;/a&gt;
 titled &amp;ldquo;Data on Kubernetes 2021&amp;rdquo; to give us a snapshot of where our industry sits with stateful workloads. Over 500 executives and tech leaders were asked some very direct and insightful questions about how they use Kubernetes. It turns out that there were a lot of surprising finds. Some that I would have never predicted. Let&amp;rsquo;s dig into some of the highlights that stood out to me.&lt;/p&gt;</description></item><item><title>The future of cloud-native databases begins with Apache Cassandra 4.0</title><link>https://foojayio.github.io/website/today/the-future-of-cloud-native-databases-begins-with-apache-cassandra-4-0/</link><pubDate>Wed, 29 Dec 2021 07:40:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-future-of-cloud-native-databases-begins-with-apache-cassandra-4-0/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Reliability at massive scale is one of the biggest challenges we face at Amazon.com, one of the largest e-commerce operations in the world; even the slightest outage has significant financial consequences and impacts customer trust.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was the first line of the highly impactful &lt;a href="http://www.cs.cornell.edu/courses/cs5414/2017fa/papers/dynamo.pdf" target="_blank" rel="noopener noreferrer"&gt;paper&lt;/a&gt;
 titled &amp;ldquo;Dynamo: Amazon&amp;rsquo;s Highly Available Key-value Store.&amp;rdquo; Published in 2007, it was written at a time when the status quo of database systems was not working for the massive explosion of internet-based applications. A team of computer engineers and scientists at Amazon completely re-thought the idea of data storage in terms of what would be needed for the future, with a firm footing in the computer science of the past. They were trying to solve an immediate problem but they had unwittingly sparked a huge revolution with distributed databases and the eventual collision with cloud-native applications.&lt;/p&gt;</description></item><item><title>Kubernetes Data Simplicity: Getting started with K8ssandra</title><link>https://foojayio.github.io/website/today/kubernetes-data-simplicity-getting-started-with-k8ssandra/</link><pubDate>Thu, 23 Dec 2021 08:56:22 +0000</pubDate><guid>https://foojayio.github.io/website/today/kubernetes-data-simplicity-getting-started-with-k8ssandra/</guid><description>&lt;p&gt;You might have heard about the &lt;a href="https://github.com/k8ssandra/k8ssandra" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 project and want to start contributing, or maybe you want to start using all of its features. If you aren&amp;rsquo;t familiar with K8ssandra (pronounced like &amp;ldquo;Kate Sandra&amp;rdquo;), you can read this &lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;overview&lt;/a&gt;
 before digging into the developer activities in this post.&lt;/p&gt;
&lt;p&gt;In a nutshell, K8ssandra is an open-source distribution of Apache Cassandra™ for Kubernetes, which includes a rich set of trusted open-source services and tooling. K8ssandra comes with handy features that are baked-in and pluggable, which allows for flexible deployment and configuration.&lt;/p&gt;</description></item><item><title>Build a Status Dashboard Using Spring Boot and Astra DB</title><link>https://foojayio.github.io/website/today/build-a-status-dashboard-using-spring-boot-and-astra-db/</link><pubDate>Fri, 17 Dec 2021 09:28:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/build-a-status-dashboard-using-spring-boot-and-astra-db/</guid><description>&lt;p&gt;In this article, we are going to build &amp;ldquo;Tony Stark&amp;rsquo;s Avengers Status Dashboard&amp;rdquo;, used by The Avengers to monitor the status of the members of the team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This will be built using &lt;a href="https://astra.dev/3BJ1lmW" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra&lt;/a&gt;
, a DBaaS powered by &lt;a href="https://cassandra.apache.org/" target="_blank" rel="noopener noreferrer"&gt;Apache Cassandra&lt;/a&gt;
 using &lt;a href="https://stargate.io/?utm_medium=referral&amp;amp;utm_source=baeldung&amp;amp;utm_campaign=series-1-of-3&amp;amp;utm_content=avengers-dash-series-1" target="_blank" rel="noopener noreferrer"&gt;Stargate&lt;/a&gt;
 to offer additional APIs for working with it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On top of this, we will be using a Spring Boot application to render the dashboard and show what&amp;rsquo;s going on.&lt;/p&gt;</description></item><item><title>7 Reasons to Choose Apache Pulsar over Apache Kafka</title><link>https://foojayio.github.io/website/today/7-reasons-to-choose-apache-pulsar-over-apache-kafka/</link><pubDate>Wed, 15 Dec 2021 10:03:13 +0000</pubDate><guid>https://foojayio.github.io/website/today/7-reasons-to-choose-apache-pulsar-over-apache-kafka/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;I wrote an earlier version of this article in 2019, while I was CEO of Kesque, a real-time messaging service built on&lt;/strong&gt;&lt;/em&gt; &lt;a href="https://pulsar.apache.org/" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;&lt;strong&gt;Apache Pulsar&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;&lt;strong&gt;, the cloud-native distributed messaging and streaming platform. A lot of big changes have happened in the interim; perhaps the most significant of these is the fact that the company I founded in early 2019 was&lt;/strong&gt;&lt;/em&gt; &lt;a href="https://www.datastax.com/press-release/datastax-delivers-scale-out-enterprise-event-streaming-modern-data-apps" target="_blank" rel="noopener noreferrer"&gt;&lt;em&gt;&lt;strong&gt;acquired&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;
&lt;em&gt;&lt;strong&gt;, in January, by DataStax. One thing that hasn&amp;rsquo;t changed, however, is the rationale behind our choice of Apache Pulsar.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Adelphi: Apache Cassandra Testing Goes Cloud Native</title><link>https://foojayio.github.io/website/today/adelphi-apache-cassandra-testing-goes-cloud-native/</link><pubDate>Thu, 09 Dec 2021 15:55:43 +0000</pubDate><guid>https://foojayio.github.io/website/today/adelphi-apache-cassandra-testing-goes-cloud-native/</guid><description>&lt;p&gt;|&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;|
| &lt;strong&gt;adelphi&lt;/strong&gt; (ancient greek ἀδελφός) - Subs.: brother or sister, son of the same mother. Adj.: double, twin, in pairs. |&lt;/p&gt;
&lt;p&gt;&lt;img src="https://foojayio.github.io/website/today/adelphi-apache-cassandra-testing-goes-cloud-native/Screen-Shot-2021-05-11-at-14.44.17-1024x129.png" alt="" loading="lazy"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is Adelphi?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/datastax/adelphi" target="_blank" rel="noopener noreferrer"&gt;Adelphi&lt;/a&gt;
 is an open-source QA tool for Apache Cassandra™, it&amp;rsquo;s packaged as a &lt;a href="https://helm.sh/" target="_blank" rel="noopener noreferrer"&gt;Helm&lt;/a&gt;
 chart and it simplifies the tasks of running data integrity and performance tests on Kubernetes.&lt;/p&gt;
&lt;p&gt;Built for simplicity, Adelphi is an opinionated tool; it runs an &lt;a href="https://argoproj.github.io/argo-workflows/" target="_blank" rel="noopener noreferrer"&gt;Argo&lt;/a&gt;
 workflow of well-defined steps and prefers convention over configuration, but it exposes some knobs that you can override.&lt;/p&gt;</description></item><item><title>Why a Serverless Data API Might be Your Next Database</title><link>https://foojayio.github.io/website/today/why-a-serverless-data-api-might-be-your-next-database/</link><pubDate>Wed, 01 Dec 2021 14:53:44 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-a-serverless-data-api-might-be-your-next-database/</guid><description>&lt;p&gt;App development stacks have been improving so rapidly and effectively that today there are a number of easy, straightforward paths to push code to production, on the cloud platform of your choice. But what use are applications without the data that users interact with? Persistent data is such an indispensable piece of the IT puzzle that it&amp;rsquo;s perhaps the reason the other pieces even exist.&lt;/p&gt;
&lt;p&gt;Enter cloud and internet scale requirements, essentially mandating that back-end services must be independently scalable / modular subsystems to succeed. Traditionally, this requirement has been difficult in the extreme for stateful systems. No doubt, database as-a-service (DBaaS) has made provisioning, operations, and security easier. But as anyone who has tried to run databases on Kubernetes will tell you: auto scaling databases, especially ones that are easy for developers to use, remain out of reach for mere mortals.&lt;/p&gt;</description></item><item><title>Backing up K8ssandra with MinIO</title><link>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio/</link><pubDate>Tue, 30 Nov 2021 17:00:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/backing-up-k8ssandra-with-minio/</guid><description>&lt;p&gt;K8ssandra includes Medusa for Apache Cassandra® to handle backup and restore for your Cassandra nodes. Recently Medusa was upgraded to introduce support for all S3 compatible backends, including &lt;a href="https://min.io/" target="_blank" rel="noopener noreferrer"&gt;MinIO&lt;/a&gt;
, the popular k8s-native object storage suite. Let&amp;rsquo;s see how to set up K8ssandra and MinIO to backup Cassandra in just a few steps. If you don&amp;rsquo;t want to self-manage Kubernetes and Cassandra, you can always use &lt;a href="https://dtsx.io/3nHk38t" target="_blank" rel="noopener noreferrer"&gt;Astra DB&lt;/a&gt;
, where this is all set up for you.&lt;/p&gt;</description></item><item><title>Enterprise-Level Apache Cassandra Sink Connector for Apache Pulsar</title><link>https://foojayio.github.io/website/today/developing-an-enterprise-level-apache-cassandra-sink-connector-for-apache-pulsar/</link><pubDate>Wed, 24 Nov 2021 19:16:16 +0000</pubDate><guid>https://foojayio.github.io/website/today/developing-an-enterprise-level-apache-cassandra-sink-connector-for-apache-pulsar/</guid><description>&lt;p&gt;When &lt;a href="https://techcrunch.com/2021/01/27/datastax-acquires-kesque-as-it-gets-into-data-streaming/" target="_blank" rel="noopener noreferrer"&gt;DataStax started investing in streaming with Apache Pulsar&lt;/a&gt;
™, we knew that one of the first things people would want to do was connect existing enterprise data sources to Apache Cassandra™ using Pulsar.&lt;/p&gt;
&lt;p&gt;Apache Pulsar has a powerful framework called Pulsar IO to enable this kind of use case, and at DataStax we already had a best-in-class &lt;a href="https://docs.datastax.com/en/kafka/doc/kafka/kafkaIntro.html" target="_blank" rel="noopener noreferrer"&gt;Kafka Connect Sink&lt;/a&gt;
 that enables you to store structured data coming from one or more Kafka topics into DataStax Enterprise, Apache Cassandra, and Astra.&lt;/p&gt;</description></item><item><title>K8ssandra: Production-Ready Platform for Cassandra on Kubernetes</title><link>https://foojayio.github.io/website/today/k8ssandra-production-ready-platform-for-running-apache-cassandra-on-kubernetes/</link><pubDate>Wed, 24 Nov 2021 09:45:12 +0000</pubDate><guid>https://foojayio.github.io/website/today/k8ssandra-production-ready-platform-for-running-apache-cassandra-on-kubernetes/</guid><description>&lt;p&gt;&lt;a href="https://k8ssandra.io/" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
, an open-source distribution of Apache Cassandra for Kubernetes, aims to provide a &amp;ldquo;production-ready platform&amp;rdquo;, and this includes automation for operational tasks such as repairs, backups, and monitoring. Cassandra is a distributed NoSQL database designed for global scale and fault tolerance for the most demanding applications on the planet, written in Java.&lt;/p&gt;
&lt;p&gt;K8ssandra is deployed using Helm and supports stateful workloads out of the box, which enables database administrators (DBAs) and site reliability engineers (SREs) to set up and operate Cassandra clusters using best practices in a Kubernetes environment.&lt;/p&gt;</description></item><item><title>Connect Stateful Workloads Across Kubernetes Clusters</title><link>https://foojayio.github.io/website/today/connect-stateful-workloads-across-kubernetes-clusters/</link><pubDate>Fri, 23 Jul 2021 08:44:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/connect-stateful-workloads-across-kubernetes-clusters/</guid><description>&lt;p&gt;One of the biggest selling points of Apache Cassandra™ is its shared-nothing architecture, making it an ideal choice for deployments that span multiple physical datacenters. So when our &lt;a href="https://astra.datastax.com/" target="_blank" rel="noopener noreferrer"&gt;Cassandra as-a-service&lt;/a&gt;
 single-region offering reached maturity, we naturally started looking into offering it cross-region and cross-cloud.&lt;/p&gt;
&lt;p&gt;One of the biggest challenges in providing a solution that spans multiple regions and clouds is correctly configuring the network so that Cassandra nodes in different data centers can communicate with each other successfully, even as individual nodes are added, replaced, or removed. From the start of the cloud journey at DataStax, we selected Kubernetes as our orchestration platform, so our search for a networking solution started there. While we&amp;rsquo;ve benefited immensely from the ecosystem and have our share of war stories, this time we chose to forge our own path, landing on ad-hoc overlay virtual application networks (how&amp;rsquo;s that for a buzzword soup?).&lt;/p&gt;</description></item><item><title>The Search for a Cloud-Native Database</title><link>https://foojayio.github.io/website/today/the-search-for-a-cloud-native-atabase/</link><pubDate>Fri, 16 Jul 2021 07:40:06 +0000</pubDate><guid>https://foojayio.github.io/website/today/the-search-for-a-cloud-native-atabase/</guid><description>&lt;p&gt;The concept of &amp;ldquo;cloud-native&amp;rdquo; has come to stand for a collection of best practices for application logic and infrastructure, including databases. However, many of the databases supporting our applications have been around for decades, before the cloud or cloud-native was a thing. The data gravity associated with these legacy solutions has limited our ability to move applications and workloads.&lt;/p&gt;
&lt;p&gt;As we move to the cloud, how do we evolve our data storage approach? Do we need a cloud-native database? What would it even mean for a database to be cloud-native? Let&amp;rsquo;s take a look at these questions.&lt;/p&gt;</description></item><item><title>Best Practices for Data Pipeline Error Handling in Apache NiFi</title><link>https://foojayio.github.io/website/today/best-practices-for-data-pipeline-error-handling-in-apache-nifi/</link><pubDate>Thu, 15 Jul 2021 05:25:32 +0000</pubDate><guid>https://foojayio.github.io/website/today/best-practices-for-data-pipeline-error-handling-in-apache-nifi/</guid><description>&lt;p&gt;&lt;strong&gt;Learn actionable strategies for error management modeling in Apache NiFi data pipelines, and understand the benefits of planning for error handling.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;According to a &lt;a href="https://www.mckinsey.com/business-functions/mckinsey-analytics/our-insights/achieving-business-impact-with-data" target="_blank" rel="noopener noreferrer"&gt;McKinsey&lt;/a&gt;
 report, &amp;ldquo;the best analytics are worth nothing with bad data&amp;rdquo;. We as data engineers and developers know this simply as &amp;ldquo;garbage in, garbage out&amp;rdquo;. Today, with the success of the cloud, data sources are many and varied. Data pipelines help us to consolidate data from these different sources and work on it. However, we must ensure that the data used is of good quality. As data engineers, we mold data into the right shape, size, and type with high attention to detail.&lt;/p&gt;</description></item><item><title>A Case for Databases on Kubernetes from a Former Skeptic</title><link>https://foojayio.github.io/website/today/a-case-for-databases-on-kubernetes-from-a-former-skeptic/</link><pubDate>Tue, 13 Jul 2021 09:12:18 +0000</pubDate><guid>https://foojayio.github.io/website/today/a-case-for-databases-on-kubernetes-from-a-former-skeptic/</guid><description>&lt;p&gt;Kubernetes is everywhere. Transactional apps, video streaming services and machine learning workloads are finding a home on this ever-growing platform. But what about databases?&lt;/p&gt;
&lt;p&gt;If you had asked me this question five years ago, the answer would have been a resounding &amp;ldquo;&lt;strong&gt;No!&lt;/strong&gt; &amp;quot; &amp;mdash; based on my experience in development and operations. In the following years, as more resources emerged for stateful applications, my answer would have changed to &amp;ldquo;&lt;em&gt;&lt;strong&gt;Maybe&lt;/strong&gt;,&amp;rdquo;&lt;/em&gt; but always with a qualifier: &amp;ldquo;It&amp;rsquo;s fine for development or test environments&amp;hellip;&amp;rdquo; or &amp;ldquo;If the rest of your tooling is Kubernetes-based, and you have extensive experience&amp;hellip;&amp;rdquo;&lt;/p&gt;</description></item><item><title>Kubernetes Is The Best Technology For Running A Cloud-Native Database</title><link>https://foojayio.github.io/website/today/why-kubernetes-is-the-best-technology-for-running-a-cloud-native-database/</link><pubDate>Wed, 30 Jun 2021 09:13:19 +0000</pubDate><guid>https://foojayio.github.io/website/today/why-kubernetes-is-the-best-technology-for-running-a-cloud-native-database/</guid><description>&lt;p&gt;We&amp;rsquo;ve been talking about migrating workloads to the cloud for a long time, but a look at the application portfolios of many IT organizations demonstrates that there&amp;rsquo;s still a lot of work to be done. In many cases, challenges with persisting and moving data in clouds continue to be the key limiting factor slowing cloud adoption, despite the fact that databases in the cloud have been available for years.&lt;/p&gt;
&lt;p&gt;For this reason, there has been a surge of recent interest in data infrastructure that is designed to take maximum advantage of the benefits that cloud computing provides. A &lt;a href="https://k8ssandra.io/blog/2021/03/23/the-search-for-a-cloud-native-database/?ref=hackernoon.com" target="_blank" rel="noopener noreferrer"&gt;cloud-native database&lt;/a&gt;
 is one that achieves the goals of scalability, elasticity, resiliency, observability, and automation; the &lt;a href="https://k8ssandra.io/?utm_medium=referral&amp;amp;utm_source=hackernoon&amp;amp;utm_campaign=k8ssandra&amp;amp;ref=hackernoon.com" target="_blank" rel="noopener noreferrer"&gt;K8ssandra&lt;/a&gt;
 project is a great example. It packages Apache Cassandra and supporting tools into a production-ready Kubernetes deployment.&lt;/p&gt;</description></item><item><title>Astra Service Broker: Tradeoff-Free Cassandra in Kubernetes</title><link>https://foojayio.github.io/website/today/announcing-the-astra-service-broker-tradeoff-free-cassandra-in-kubernetes/</link><pubDate>Thu, 19 Nov 2020 19:52:00 +0000</pubDate><guid>https://foojayio.github.io/website/today/announcing-the-astra-service-broker-tradeoff-free-cassandra-in-kubernetes/</guid><description>&lt;p&gt;When you are designing and building a cloud-native application, you are probably thinking about deploying it with Kubernetes. What about the database? That can get a bit more complicated as you weigh out the tradeoffs of elasticity, scale, and self-healing requirements versus maintaining servers and the long term operations required. Apache Cassandra™ ticks the first three boxes easily, but what about the operational burden of managing Cassandra? That&amp;rsquo;s where the cloud-native Cassandra service, &lt;a href="https://www.datastax.com/products/datastax-astra" target="_blank" rel="noopener noreferrer"&gt;DataStax Astra&lt;/a&gt;
, helps both operators and developers. But what makes it easy for deployments on Kubernetes to access the Astra managed service?&lt;/p&gt;</description></item></channel></rss>