<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3132357405579351461</atom:id><lastBuildDate>Wed, 18 Mar 2026 15:44:22 +0000</lastBuildDate><category>code</category><category>Resources</category><category>Best Practices</category><category>powershell scripts</category><category>C#</category><category>azure</category><category>Lotus Notes to SharePoint migration</category><category>Errors</category><category>infopath forms</category><category>.net 9.0</category><category>azure databricks</category><category>rag</category><category>AI</category><category>azure functions</category><category>elements.xml</category><category>nintex workflows</category><category>.net 8.0</category><category>.net core</category><category>AI Foundry</category><category>Azure Data Factory</category><category>Utilities</category><category>azure stream analytics</category><category>azure synapse analytics</category><category>c#.net</category><category>caching</category><category>databricks</category><category>knowledge graph</category><category>kobai</category><category>redis cache</category><category>sql</category><category>DevRadio</category><category>Entity Framework</category><category>LLM</category><category>ML Flow</category><category>MPP</category><category>azure certification</category><category>azure data engineer associate</category><category>azure data partitioning</category><category>azure logic app</category><category>azure snapyse</category><category>azure sql</category><category>best practice</category><category>blazor</category><category>blob storage</category><category>caching azure app services</category><category>delta sharing</category><category>distribution columns</category><category>dotnet core</category><category>dynamic programming</category><category>dynamics 365</category><category>external delta sharing</category><category>function app</category><category>hash distribution</category><category>jquery</category><category>microservices</category><category>migration</category><category>ms-sql</category><category>nintex</category><category>notes</category><category>page</category><category>polybase</category><category>redis</category><category>sharepoint</category><category>training</category><category>webpart</category><category>webpart maintance mode</category><category>window functions</category><category>windowing functions</category><title>Data and AI Platform Engineer, Application Dev- C#.NET, Databricks Apps</title><description>Mehul Bhuva is an AI and Data Platform Engineer bringing two decades of specialized experience across Microsoft's technology ecosystem. His proficiency spans Azure, Databricks, Microsoft AI Foundry, Azure Data Factory, Blazor/Angular frameworks, Powershell and Power BI.</description><link>http://www.sharepointfix.com/</link><managingEditor>noreply@blogger.com (Mehul K Bhuva)</managingEditor><generator>Blogger</generator><openSearch:totalResults>158</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-5936279089524442664</guid><pubDate>Fri, 06 Mar 2026 14:43:00 +0000</pubDate><atom:updated>2026-03-06T08:43:07.149-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AI Foundry</category><category domain="http://www.blogger.com/atom/ns#">DevRadio</category><category domain="http://www.blogger.com/atom/ns#">rag</category><title>From the Field to the Cloud: How I Built SeedOps Savant for Corteva Agriscience on Azure AI Foundry</title><description>&lt;div class="prose dark:prose-invert inline leading-relaxed break-words min-w-0 [word-break:break-word] prose-strong:font-bold [&amp;amp;_&amp;gt;*:first-child]:mt-0 [&amp;amp;_&amp;gt;*:last-child]:mb-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;/p&gt;&lt;h1 class="font-editorial font-bold first:mt-xs mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg leading-[1.5em] lg:text-xl" id="from-the-field-to-the-cloud-how-i-built-seedops-sa"&gt;The Podcast Moment That Started It All&lt;/h1&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;I recently had the privilege of joining &lt;strong&gt;Matthew Calder&lt;/strong&gt; and &lt;strong&gt;Charles Maxson&lt;/strong&gt; on the &lt;strong&gt;Microsoft Dev Radio podcast&lt;/strong&gt; — one of the most exciting conversations I've had about enterprise AI in agriculture. We dug deep into a solution I architected called &lt;strong&gt;SeedOps Savant&lt;/strong&gt;, an Azure AI Foundry–powered platform built for &lt;strong&gt;Corteva Agriscience&lt;/strong&gt;, one of the world's leading agricultural science companies. If you haven't watched it yet, &lt;a class="reset interactable cursor-pointer decoration-1 underline-offset-1 text-super hover:underline font-semibold" href="https://www.youtube.com/live/Val0zf84sCU?si=juzwraUyUECh_dB1" rel="nofollow noopener" target="_blank"&gt;&lt;span class="text-box-trim-both"&gt;check out the full live stream here&lt;/span&gt;&lt;/a&gt; and come back — this post gives you the full behind-the-scenes story.&lt;/p&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4" id="what-is-seedops-savant"&gt;What Is SeedOps Savant?&lt;/h2&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;SeedOps Savant is an enterprise-grade AI solution designed to bring intelligent, conversational access to seed operations data at Corteva. In an industry where seed production decisions can hinge on real-time field intelligence, agronomic research, and supply chain data, having a simple chat interface that synthesizes all of that context into an actionable answer is a game changer.&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;The name says it all: &lt;em&gt;Seed Operations&lt;/em&gt; meet &lt;em&gt;Savant&lt;/em&gt; — a system smart enough to serve agronomists, sales reps, and operational teams with fast, precise, grounded answers without digging through endless reports, spreadsheets, or documents.&lt;/p&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4" id="why-azure-ai-foundry"&gt;Why Azure AI Foundry?&lt;/h2&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;span class="cursor-pointer border-b-2 border-dotted border-[oklch(var(--foreground-color)/0.5)] hover:text-foreground hover:border-foreground font-bold transition-colors duration-200 ease-out" role="link" tabindex="0"&gt;Azure AI Foundry&lt;/span&gt; is Microsoft's integrated platform for building, orchestrating, and managing enterprise AI solutions — from model selection and fine-tuning to deployment and observability. For SeedOps Savant, it was the natural choice for several reasons&lt;/p&gt;&lt;ul class="marker:text-quiet list-disc"&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;End-to-end AI lifecycle management&lt;/strong&gt; — I could go from model selection to deployment without stitching together disparate services&lt;/p&gt;&lt;/li&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Enterprise security &amp;amp; governance&lt;/strong&gt; — Corteva's data required strict access controls and data residency compliance that Azure AI Foundry handles natively&lt;/p&gt;&lt;/li&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Seamless integration with the Azure ecosystem&lt;/strong&gt; — connecting Azure AI Search for RAG, Azure OpenAI for generation, and Databricks for the data lakehouse was straightforward&lt;/p&gt;&lt;/li&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Observability and monitoring&lt;/strong&gt; — production-grade telemetry came built-in, critical for an enterprise rollout at scale&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;Agriculture is increasingly becoming a data-intensive industry, and Corteva is no exception — the company has built AI systems processing millions of data points across seeds, soil, weather, and genetics. SeedOps Savant needed to sit on top of that complexity and make it accessible.&lt;span class="citation-nbsp"&gt;&lt;/span&gt;&lt;span class="group/trigger inline-flex min-w-0" data-state="closed"&gt;&lt;span class="citation inline" style="width: 81px;"&gt;&lt;span class="relative -mt-px max-w-full min-w-0 whitespace-nowrap -top-px font-sans text-base text-foreground select-none selection:bg-super/50 selection:text-foreground dark:selection:bg-super/10 dark:selection:text-super"&gt;&lt;span class="text-3xs rounded-badge group min-w-4 max-w-full cursor-pointer text-center align-middle font-mono tabular-nums font-normal transition-colors duration-150 inline-flex items-center py-[0.1875rem] leading-snug px-[0.3rem] [@media(hover:hover)]:hover:bg-subtle group-data-[state=open]/trigger:bg-subtle border-subtlest ring-subtlest divide-subtlest bg-quiet"&gt;&lt;span class="inline-block relative !mt-0 ![vertical-align:unset] max-w-[25ch] overflow-hidden"&gt;seedworld&lt;/span&gt;&lt;span class="inline-block ml-xs mr-px !mt-0 ![vertical-align:unset]"&gt;&lt;span class="opacity-50"&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4" id="the-architecture-rag-meets-agridata"&gt;The Architecture: RAG Meets AgriData&lt;/h2&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;At its core, SeedOps Savant is a &lt;strong&gt;Retrieval-Augmented Generation (RAG)&lt;/strong&gt; solution. Here's how the key layers fit together:&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;1. Data Foundation&lt;/strong&gt;&lt;br /&gt;Seed operations data — production schedules, agronomic research, product specifications, field trial outcomes — lives across multiple systems. We unified on Azure platform, bringing unstructured data together in a form that can be indexed and vector retrieved.&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;2. Intelligent Indexing with Azure AI Search&lt;/strong&gt;&lt;br /&gt;The heart of any RAG solution is its index. Azure AI Search provides hybrid search (keyword + vector), semantic ranking, and the ability to incorporate Corteva's proprietary data in a secure, governed way. This means that when a user asks a question, the retrieval step pulls back the &lt;em&gt;most relevant&lt;/em&gt; context — not just keyword-matched documents.&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;3. Generative Answers via Azure OpenAI&lt;/strong&gt;&lt;br /&gt;Once the right context is retrieved, Azure OpenAI generates a grounded, human-readable response. The key here is &lt;em&gt;grounded&lt;/em&gt; — SeedOps Savant doesn't hallucinate answers from its training data. Every response is anchored to Corteva's actual operational data.&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;4. Orchestration via Azure AI Foundry&lt;/strong&gt;&lt;br /&gt;Azure AI Foundry ties the prompt flow, model routing, and agent logic together, allowing the solution to handle complex multi-step queries — the kind that seed ops teams actually ask in the real world&lt;/p&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4" id="the-real-world-impact"&gt;The Real-World Impact&lt;/h2&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;The agricultural AI space is exploding. SeedOps Savant brings that same paradigm to Corteva's seed operations specifically — giving the teams closest to production decisions fast access to enterprise knowledge.&lt;span aria-label="Bayer brings agronomic expertise to the edge with Azure AI Foundry" class="inline-flex" data-state="closed"&gt;​&lt;/span&gt;&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;For sales reps and agronomists in the field, having a system that can synthesize research, product data, and operational context into a single conversational interface isn't just a convenience — it's a competitive differentiator.&lt;span class="citation-nbsp"&gt;&lt;/span&gt;&lt;span class="group/trigger inline-flex min-w-0" data-state="closed"&gt;&lt;span class="citation inline" style="width: 99px;"&gt;&lt;span class="relative -mt-px max-w-full min-w-0 whitespace-nowrap -top-px font-sans text-base text-foreground select-none selection:bg-super/50 selection:text-foreground dark:selection:bg-super/10 dark:selection:text-super"&gt;&lt;span class="text-3xs rounded-badge group min-w-4 max-w-full cursor-pointer text-center align-middle font-mono tabular-nums font-normal transition-colors duration-150 inline-flex items-center py-[0.1875rem] leading-snug px-[0.3rem] [@media(hover:hover)]:hover:bg-subtle group-data-[state=open]/trigger:bg-subtle border-subtlest ring-subtlest divide-subtlest bg-quiet"&gt;&lt;span class="inline-block relative !mt-0 ![vertical-align:unset] max-w-[25ch] overflow-hidden"&gt;agfundernews&lt;/span&gt;&lt;span class="inline-block ml-xs mr-px !mt-0 ![vertical-align:unset]"&gt;&lt;span class="opacity-50"&gt;+1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4" id="lessons-learned-building-enterprise-ai-in-agritech"&gt;Lessons Learned: Building Enterprise AI in AgriTech&lt;/h2&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;A few key takeaways from building SeedOps Savant that I shared on the podcast:&lt;/p&gt;&lt;ul class="marker:text-quiet list-disc"&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Data quality is the foundation&lt;/strong&gt; — no matter how powerful your LLM or search index, garbage in means garbage out. Invest early in data curation and governance.&lt;/p&gt;&lt;/li&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Domain specificity matters&lt;/strong&gt; — generic AI models need to be grounded in domain-specific data to be genuinely useful to agronomists and seed ops professionals.&lt;/p&gt;&lt;/li&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Security and access control aren't optional&lt;/strong&gt; — in enterprise agriculture, data is highly proprietary. Azure AI Foundry's built-in governance and role-based access made it possible to deploy with confidence.&lt;/p&gt;&lt;/li&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Start with the user's workflow&lt;/strong&gt; — the most impactful RAG solutions I've built are designed around how people &lt;em&gt;actually work&lt;/em&gt;, not how the technology wants them to work.&lt;/p&gt;&lt;/li&gt;&lt;li class="py-0 my-0 prose-p:pt-0 prose-p:mb-2 prose-p:my-0 [&amp;amp;&amp;gt;p]:pt-0 [&amp;amp;&amp;gt;p]:mb-2 [&amp;amp;&amp;gt;p]:my-0"&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;strong&gt;Hybrid search wins&lt;/strong&gt; — pure vector search is not enough for enterprise RAG. Combining semantic vector search with keyword search and re-ranking delivers meaningfully better results for domain-specific queries.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4" id="watch-the-full-podcast"&gt;Watch the Full Podcast&lt;/h2&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;If you want to hear me walk through the full story — the architecture decisions, the challenges of enterprise-scale RAG, and what's next for AI in agricultural operations — watch the Microsoft Dev Radio episode live below:&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&#127909; &lt;strong&gt;&lt;a class="reset interactable cursor-pointer decoration-1 underline-offset-1 text-super hover:underline font-semibold" href="https://www.youtube.com/live/Val0zf84sCU?si=juzwraUyUECh_dB1" rel="nofollow noopener" target="_blank"&gt;&lt;span class="text-box-trim-both"&gt;Watch on YouTube →&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;h2 class="font-editorial font-bold mb-2 mt-4 [.has-inline-images_&amp;amp;]:clear-end text-lg first:mt-0 md:text-lg [hr+&amp;amp;]:mt-4" id="whats-next"&gt;What's Next?&lt;/h2&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;SeedOps Savant is one chapter in a much larger story about how Azure AI Foundry is enabling enterprise-grade AI solutions across industries that were previously underserved by technology. I'm actively documenting patterns, architectures, and implementation strategies like this in my upcoming book on Enterprise RAG with Azure technologies.&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;If you're building something similar — whether in agriculture, manufacturing, or any data-intensive enterprise — I'd love to connect. Drop a comment below or reach out directly.&lt;/p&gt;&lt;hr class="bg-quiet h-px border-0" node="[object Object]" /&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2"&gt;&lt;em&gt;Mehul Bhuva is a Senior Enterprise Architect, Microsoft Azure Developer Influencer, and author of an upcoming book on Enterprise RAG. He writes at &lt;a class="reset interactable cursor-pointer decoration-1 underline-offset-1 text-super hover:underline font-semibold" href="https://www.sharepointfix.com/" rel="nofollow noopener" target="_blank"&gt;&lt;span class="text-box-trim-both"&gt;sharepointfix.com&lt;/span&gt;&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description><link>http://www.sharepointfix.com/2026/03/from-field-to-cloud-how-i-built-seedops.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-6890608944462738838</guid><pubDate>Tue, 16 Dec 2025 21:05:00 +0000</pubDate><atom:updated>2025-12-16T16:25:31.566-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure databricks</category><category domain="http://www.blogger.com/atom/ns#">delta sharing</category><category domain="http://www.blogger.com/atom/ns#">external delta sharing</category><title>Databricks Delta Sharing (D2O) with Open Delta Sharing – A Practical, Step‑by‑Step Guide for Data Engineers</title><description>&lt;p&gt;&lt;span style="font-family: arial;"&gt;&lt;span color="oklch(0.3039 0.04 213.68)" style="background-color: oklch(0.9902 0.004 106.47); font-size: 16px; letter-spacing: 0.08px;"&gt;Data products only create value when they can be shared and consumed easily, securely, and at scale. Delta Sharing was designed exactly for that: an open, cross‑platform protocol that lets you share live data from your databricks lakehouse with any downstream tool or platform over HTTPS, without copies or custom integrations.&lt;/span&gt;&lt;span color="oklch(0.3039 0.04 213.68)" data-state="closed" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; font-size: 16px; letter-spacing: 0.08px; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;span class="citation-nbsp" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;/span&gt;&lt;span class="citation inline" rel="nofollow noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; display: inline; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;a class="inline" href="https://www.databricks.com/product/delta-sharing" rel="noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); display: inline; scrollbar-color: initial; scrollbar-width: initial; text-decoration-line: none;" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: oklch(0.9902 0.004 106.47); border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); font-size: 16px; letter-spacing: 0.08px; margin: 1rem 0px 0.5rem; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;span style="font-family: arial;"&gt;In this blog post, I walk through&amp;nbsp;&lt;span style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;b&gt;Databricks‑to‑Open (D2O)&lt;/b&gt; Delta Sharing&lt;/span&gt;&amp;nbsp;using&amp;nbsp;&lt;span style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;Open Delta Sharing&lt;/span&gt;&amp;nbsp;in a practical, step‑by‑step way. The focus is on helping data teams move from theory to a concrete implementation pattern that works in real projects.&lt;span data-state="closed" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;span class="citation-nbsp" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;/span&gt;&lt;span class="citation inline" rel="nofollow noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; display: inline; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;a class="inline" href="https://www.databricks.com/blog/delta-sharing-top-10-questions-answered-part-1" rel="noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); display: inline; scrollbar-color: initial; scrollbar-width: initial; text-decoration-line: none;" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 class="mb-2 mt-4 font-display font-semimedium text-base first:mt-0" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: oklch(0.9902 0.004 106.47); border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); font-size: 1rem; letter-spacing: 0.08px; line-height: 1.5rem; margin: 1rem 0px 0.5rem; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;span style="font-family: arial;"&gt;What the article covers:&lt;/span&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;&lt;span style="font-size: 16px; letter-spacing: 0.08px;"&gt;How Delta Sharing fits into a modern data collaboration strategy and when to choose&amp;nbsp;&lt;/span&gt;&lt;span style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; font-size: 16px; letter-spacing: 0.08px; scrollbar-color: initial; scrollbar-width: initial;"&gt;Open Sharing (D2O)&lt;/span&gt;&lt;span style="font-size: 16px; letter-spacing: 0.08px;"&gt;&amp;nbsp;over Databricks‑to‑Databricks (D2D).&lt;/span&gt;&lt;/span&gt;​&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;The core workflow: creating recipients, configuring authentication (bearer token or federated/OIDC), defining shares in Unity Catalog, and granting access to tables and views.&lt;span data-state="closed" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; font-size: 16px; letter-spacing: 0.08px; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;span class="citation-nbsp" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;/span&gt;&lt;span class="citation inline" rel="nofollow noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; display: inline; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;a class="inline" href="https://learn.microsoft.com/en-us/azure/databricks/delta-sharing/share-data-open" rel="noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); display: inline; scrollbar-color: initial; scrollbar-width: initial; text-decoration-line: none;" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;How external consumers can connect using open connectors (Python/pandas, Apache Spark, Power BI, Tableau, Excel and others) without needing a Databricks workspace.&lt;span data-state="closed" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; font-size: 16px; letter-spacing: 0.08px; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;span class="citation-nbsp" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;/span&gt;&lt;span class="citation inline" rel="nofollow noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; display: inline; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;a class="inline" href="https://www.databricks.com/blog/democratizing-data-sharing-platform-agnostic-approach" rel="noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); display: inline; scrollbar-color: initial; scrollbar-width: initial; text-decoration-line: none;" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;Security, governance, and operational considerations such as token TTL, auditing activity, and avoiding data duplication by sharing from your existing Delta Lake and Parquet data.&lt;span data-state="closed" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; font-size: 16px; letter-spacing: 0.08px; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;span class="citation-nbsp" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;/span&gt;&lt;span class="citation inline" rel="nofollow noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; display: inline; scrollbar-color: initial; scrollbar-width: initial;"&gt;&lt;a class="inline" href="https://docs.databricks.com/aws/en/delta-sharing/set-up" rel="noopener" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); display: inline; scrollbar-color: initial; scrollbar-width: initial; text-decoration-line: none;" target="_blank"&gt;&lt;/a&gt;&lt;/span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: arial;"&gt;Whether you are building a data‑as‑a‑service offering, exposing governed data products to partners, or just trying to simplify ad‑hoc external access, D2O can significantly reduce friction and integration work&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="my-2 [&amp;amp;+p]:mt-4 [&amp;amp;_strong:has(+br)]:inline-block [&amp;amp;_strong:has(+br)]:pb-2" style="--tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-ring-color: rgb(59 130 246 / .5); --tw-ring-offset-color: #fff; --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-offset-width: 0px; --tw-ring-shadow: 0 0 #0000; --tw-rotate: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-scroll-snap-strictness: proximity; --tw-shadow-colored: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-skew-x: 0; --tw-skew-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; background-color: oklch(0.9902 0.004 106.47); border-color: oklch(0.3039 0.04 213.68 / 0.16); border-style: solid; border-width: 0px; box-sizing: border-box; color: oklch(0.3039 0.04 213.68); font-size: 16px; letter-spacing: 0.08px; margin: 0.5rem 0px; scrollbar-color: initial; scrollbar-width: initial; text-align: left;"&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: arial;"&gt;&lt;b&gt;Here is a step-by-step guide to Databricks Delta Sharing using Open Delta Sharing (D2O).&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: arial;"&gt;1. Create Recipient&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: arial;"&gt;2. Create Delta Share and assign Recipients&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEj7lBQCa6HMp8EWZwJoFIIzX-K6UxXlw3i4kfp5SQN80VP3xWTDPus2FptswoZWlpAcqlfEVin7d7gIsM6_T61bPZ2_EqDELsv4Nxnw7pfZF6hLrmK0F5P5_82oBzlx4pPzqMCI2PGD_5V6FoJQEpRmsWop7XIxyp91_MT6Z7W-P6-x5BbG1PbPecBLfhA" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="508" data-original-width="845" height="405" src="https://blogger.googleusercontent.com/img/a/AVvXsEj7lBQCa6HMp8EWZwJoFIIzX-K6UxXlw3i4kfp5SQN80VP3xWTDPus2FptswoZWlpAcqlfEVin7d7gIsM6_T61bPZ2_EqDELsv4Nxnw7pfZF6hLrmK0F5P5_82oBzlx4pPzqMCI2PGD_5V6FoJQEpRmsWop7XIxyp91_MT6Z7W-P6-x5BbG1PbPecBLfhA=w675-h405" width="675" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: arial;"&gt;&lt;b&gt;You can create a OIDC Federation Authentication or Token based authentication for your recipients.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEiZv_B3ZJSf-Fm1NBLgovS-hlsw03hTKcpJfdGAkHqgbUBoNxTIkGGrTBfN0SPrK5OFPaQYkI8ga-WuChTCVhK5MPkX3VNyRXghbjqZmBm0poogOsei_7BTnMGFlLMVIAO3xAts3SkRlLY1yuzWSOFxHEKYAAoH64aBVBe9HetaaFEz5ng7l5uLBlHls6Y" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="685" data-original-width="629" height="565" src="https://blogger.googleusercontent.com/img/a/AVvXsEiZv_B3ZJSf-Fm1NBLgovS-hlsw03hTKcpJfdGAkHqgbUBoNxTIkGGrTBfN0SPrK5OFPaQYkI8ga-WuChTCVhK5MPkX3VNyRXghbjqZmBm0poogOsei_7BTnMGFlLMVIAO3xAts3SkRlLY1yuzWSOFxHEKYAAoH64aBVBe9HetaaFEz5ng7l5uLBlHls6Y=w518-h565" width="518" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEja126Bw-WTXyvDEmlT3uexv-MO5UvuR7nw6a06YCWu2PPGlVLEg7w-ceLv__OcSoSP5lQopcEBZPzV0DQxw6mnFinB7GQgDJvgZ2YO1E79RFMrwciBX_Dle3HeSty069Rb3CmDR9m1LfSuzgImOXfID5o6nOSsL2n9oO-uBp6GhuLYPbhdOV7-HWsFNlk" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="823" data-original-width="624" height="661" src="https://blogger.googleusercontent.com/img/a/AVvXsEja126Bw-WTXyvDEmlT3uexv-MO5UvuR7nw6a06YCWu2PPGlVLEg7w-ceLv__OcSoSP5lQopcEBZPzV0DQxw6mnFinB7GQgDJvgZ2YO1E79RFMrwciBX_Dle3HeSty069Rb3CmDR9m1LfSuzgImOXfID5o6nOSsL2n9oO-uBp6GhuLYPbhdOV7-HWsFNlk=w501-h661" width="501" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEiXibVGnup4aydI7QoBsvVTYctoC20hHPtUGdEEQhxfwXL1Q4WRUXWHnW2y8iO4L10xRXEri2fYNcyVK_YpezeP0yo4soACKTtoe224bMg_8McbWWogOEHPwwgAvbe9URHxvhJxwU70J4K94CQgFWUtCWh-k1xI8B41uOH2COZHvI6zmyBnDnrPr39o-h8" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="420" data-original-width="717" height="311" src="https://blogger.googleusercontent.com/img/a/AVvXsEiXibVGnup4aydI7QoBsvVTYctoC20hHPtUGdEEQhxfwXL1Q4WRUXWHnW2y8iO4L10xRXEri2fYNcyVK_YpezeP0yo4soACKTtoe224bMg_8McbWWogOEHPwwgAvbe9URHxvhJxwU70J4K94CQgFWUtCWh-k1xI8B41uOH2COZHvI6zmyBnDnrPr39o-h8=w533-h311" width="533" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEirnW2eQW-YVhKskFR-sCQhxBXKpZnCJfHnNhXeuv43koE2Bs74o0uRn9PzEu71tzCxfvAoUxUo5zqzSR2cpi46pLZb_3Bz9c-dtRiyJR0mnJRjvvdoGepKDdmaRPknEXR9sZhvEBuDw60gIuzTOP1jVm_d1lJW9mviIVgEWO_7PMZ1t3A-xilvT7jcpfk" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="907" data-original-width="1420" height="396" src="https://blogger.googleusercontent.com/img/a/AVvXsEirnW2eQW-YVhKskFR-sCQhxBXKpZnCJfHnNhXeuv43koE2Bs74o0uRn9PzEu71tzCxfvAoUxUo5zqzSR2cpi46pLZb_3Bz9c-dtRiyJR0mnJRjvvdoGepKDdmaRPknEXR9sZhvEBuDw60gIuzTOP1jVm_d1lJW9mviIVgEWO_7PMZ1t3A-xilvT7jcpfk=w620-h396" width="620" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: arial;"&gt;&lt;b&gt;Tables with RLS and column masks cannot be shared using Delta Sharing.&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEj9lK_zpcsvat5CIPEQa21j6udBsPwu85-C0j3xK7kg5puAi29UVFNyYDBjHjOz6yz3f5rF9Q1gtIF2GN5hgMMmeGvCkKJ7M8H7vGqt_0KrHOIguuuElKsgh3eFTmKHFushbrDY-RyLnlD8iL5vix2kqMk7D3cseb0j1z84Y8j0L8Qru1Dg3B-uhSl4Owk" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="273" data-original-width="1123" height="146" src="https://blogger.googleusercontent.com/img/a/AVvXsEj9lK_zpcsvat5CIPEQa21j6udBsPwu85-C0j3xK7kg5puAi29UVFNyYDBjHjOz6yz3f5rF9Q1gtIF2GN5hgMMmeGvCkKJ7M8H7vGqt_0KrHOIguuuElKsgh3eFTmKHFushbrDY-RyLnlD8iL5vix2kqMk7D3cseb0j1z84Y8j0L8Qru1Dg3B-uhSl4Owk=w599-h146" width="599" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEj2k-Sl9JzMxlfFOZ79hiIwwwHbQsC9GIE8SrptZMlp5GqwHa92W5Gbi3Vp-QwrhP-Wk8WEgSJKRuXVLjx2eTqAJ_V2_dRPVpYgSXlRQfKIDFUU54U9QiVZsZAYWSHqTvhzFLIZQmH3vw112zP4bR0M9WNNSYaVPLp1HjF818MbMFpKH2y16KgH-l5aylA" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="413" data-original-width="1134" height="196" src="https://blogger.googleusercontent.com/img/a/AVvXsEj2k-Sl9JzMxlfFOZ79hiIwwwHbQsC9GIE8SrptZMlp5GqwHa92W5Gbi3Vp-QwrhP-Wk8WEgSJKRuXVLjx2eTqAJ_V2_dRPVpYgSXlRQfKIDFUU54U9QiVZsZAYWSHqTvhzFLIZQmH3vw112zP4bR0M9WNNSYaVPLp1HjF818MbMFpKH2y16KgH-l5aylA=w536-h196" width="536" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-family: arial;"&gt;Select Recipient you had created prior.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhHuWg3BMqsDRaxu4ohsBqT0TvHul__K68iqzULrU_WSPzR1WrIoy6LUGsYdBISUBMr1JBwzyR3kePwwiJ2AE197ddgI_cVM6ccNb3frgunelOG18kVf8jqX06CpEJ_wC_50oupHXvLAAs_caWAId8zbItDl-Zbte0Y7EnBI139d5v4S3wjkFr02Qt0-Y8" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: arial;"&gt;&lt;img alt="" data-original-height="409" data-original-width="1438" height="228" src="https://blogger.googleusercontent.com/img/a/AVvXsEhHuWg3BMqsDRaxu4ohsBqT0TvHul__K68iqzULrU_WSPzR1WrIoy6LUGsYdBISUBMr1JBwzyR3kePwwiJ2AE197ddgI_cVM6ccNb3frgunelOG18kVf8jqX06CpEJ_wC_50oupHXvLAAs_caWAId8zbItDl-Zbte0Y7EnBI139d5v4S3wjkFr02Qt0-Y8=w802-h228" width="802" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjLTZHa2p6hCBNqi5I1_W7lysEc_UC-2TfoUcjyhn2wRcqnvk61Ef7sxyiPeBIUuUVSrYylqqHUo1CUtRuPDqTZTuHENdVIMdFEl_O5VH3UBBARxHv9QTkPnzPDxSK2dZH0FIu8q9B9OsGT6O9_SccOo_fpTfqmlzjn3UJ2kHtItZw4CkgP0WYHIcUX0F0" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="357" data-original-width="1413" height="206" src="https://blogger.googleusercontent.com/img/a/AVvXsEjLTZHa2p6hCBNqi5I1_W7lysEc_UC-2TfoUcjyhn2wRcqnvk61Ef7sxyiPeBIUuUVSrYylqqHUo1CUtRuPDqTZTuHENdVIMdFEl_O5VH3UBBARxHv9QTkPnzPDxSK2dZH0FIu8q9B9OsGT6O9_SccOo_fpTfqmlzjn3UJ2kHtItZw4CkgP0WYHIcUX0F0=w814-h206" width="814" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;Additional Information:&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjEcsPgbBozt_ALSvuRO4ZNJtZ3fVmImlc880R5kGqI7Z-b28hHiaADcZFtk5-9kRK4TvXXPYZIZ5oeqBDKnT6TQ5J6v7f5j0mF2vwyDYFPcNV8h9gRgrqZr6kCfhmKQXcV58SsxO46CZfL-NIMD9kUGI2pkT6TM6B3X4yXG7R7xjawe95h5lWWnHNgo04" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="663" data-original-width="1250" height="314" src="https://blogger.googleusercontent.com/img/a/AVvXsEjEcsPgbBozt_ALSvuRO4ZNJtZ3fVmImlc880R5kGqI7Z-b28hHiaADcZFtk5-9kRK4TvXXPYZIZ5oeqBDKnT6TQ5J6v7f5j0mF2vwyDYFPcNV8h9gRgrqZr6kCfhmKQXcV58SsxO46CZfL-NIMD9kUGI2pkT6TM6B3X4yXG7R7xjawe95h5lWWnHNgo04=w591-h314" width="591" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEhfc_5G4B2p_BV3ybznm0ztGfkJTBdz5Io_3A_PBXNyPXTA0wDg4wrKTuOmHqvWLaNnNIh0poJvfq94DIQuJXBWNjXJDmTmgopaba7CznAx_pWfLryShNKc8nbHm-BTYWDscqz7PivPn33zuPQeJjxyF_7qdNP6xYLBMSSm4aee9reUSCTporOKuLJpjaE" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" data-original-height="580" data-original-width="1178" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEhfc_5G4B2p_BV3ybznm0ztGfkJTBdz5Io_3A_PBXNyPXTA0wDg4wrKTuOmHqvWLaNnNIh0poJvfq94DIQuJXBWNjXJDmTmgopaba7CznAx_pWfLryShNKc8nbHm-BTYWDscqz7PivPn33zuPQeJjxyF_7qdNP6xYLBMSSm4aee9reUSCTporOKuLJpjaE=w486-h240" width="486" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://www.sharepointfix.com/2025/12/databricks-delta-sharing-using-open.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEj7lBQCa6HMp8EWZwJoFIIzX-K6UxXlw3i4kfp5SQN80VP3xWTDPus2FptswoZWlpAcqlfEVin7d7gIsM6_T61bPZ2_EqDELsv4Nxnw7pfZF6hLrmK0F5P5_82oBzlx4pPzqMCI2PGD_5V6FoJQEpRmsWop7XIxyp91_MT6Z7W-P6-x5BbG1PbPecBLfhA=s72-w675-h405-c" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-8592286586956741568</guid><pubDate>Thu, 11 Dec 2025 22:03:00 +0000</pubDate><atom:updated>2025-12-11T16:03:33.713-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure databricks</category><category domain="http://www.blogger.com/atom/ns#">databricks</category><category domain="http://www.blogger.com/atom/ns#">notes</category><category domain="http://www.blogger.com/atom/ns#">training</category><title>Databricks Training Notes - Compute</title><description>&lt;p&gt;&lt;b&gt;All purpose compute &lt;/b&gt;-R/W/X - More expensive&lt;/p&gt;&lt;p&gt;Serverless version of all purpose compute&lt;/p&gt;&lt;p&gt;All purpose is also known as Classic Compute.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Classic Compute &lt;/b&gt;- VMs, Databricks Consumption DBU/hr.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Job Compute &lt;/b&gt;- R/X - Cheaper&lt;/p&gt;&lt;p&gt;Serverless version of Job Compute&lt;/p&gt;&lt;p&gt;You can't run Scala/R on Serverless compute.&lt;/p&gt;&lt;p&gt;Serverless DBU cost is higher as VM is in-built into it.&lt;/p&gt;&lt;p&gt;&lt;b&gt;RDD&lt;/b&gt; - Resilient, Dataset, Distributed&lt;/p&gt;&lt;p&gt;Worker dies, it can recreate data partition and keep running. RDD keeps extra RAM available.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Vector Search &lt;/b&gt;- Word embeddings. Array of floats. Specialized engine to build index of those numbers.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Pools - &lt;/b&gt;Pool of VMs that you need to be paying for. Classic compute scenario. Pools have gone away.&lt;/p&gt;&lt;p&gt;Serverless Compute - cheaper version&lt;/p&gt;&lt;p&gt;Serverless Compute - performance optimized version - usually 5 seconds&lt;/p&gt;&lt;p&gt;Cluster - Drivers and Worker Nodes. Single node cluster - driver is the worker. SkLearn, Pandas consume driver memory.&lt;/p&gt;&lt;p&gt;Use Job or Serverless clusters in production. Avoid interactive clusters in prod. Enable Photon for faster and cheaper execution. Reuse clusters to reduce startup time and cost.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Serverless&lt;/b&gt; - Photon engine, Predictive IO, Intelligent Workload Management&lt;/p&gt;&lt;p&gt;&lt;b&gt;Pro &lt;/b&gt;- Photon, Predictive IO&lt;/p&gt;&lt;p&gt;&lt;b&gt;Classic &lt;/b&gt;- Photon engine&lt;/p&gt;&lt;p&gt;&lt;b&gt;Performance considerations: &lt;/b&gt;SKEW/SPILL/STORAGE/SHUFFLE/SERIALIZATION&amp;nbsp;&lt;/p&gt;&lt;p&gt;Adaptive Query Execution helps code optimization&lt;/p&gt;&lt;p&gt;&lt;b&gt;Row Filter:&lt;/b&gt;&lt;/p&gt;&lt;div style="background-color: #f6f7f9; color: #3b3b3b; font-family: Menlo, Monaco, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Source Code Pro&amp;quot;, monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; line-height: 20px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;CREATE OR REPLACE&lt;/span&gt; &lt;span style="color: #0a6fbf;"&gt;FUNCTION&lt;/span&gt; &lt;span style="color: #795e26;"&gt;device_filter&lt;/span&gt;(device_id &lt;span style="color: #0a6fbf;"&gt;INT&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #0a6fbf;"&gt;RETURN&lt;/span&gt; &lt;span style="color: #0a6fbf;"&gt;IF&lt;/span&gt;(IS_ACCOUNT_GROUP_MEMBER(&lt;span style="color: #c72e0f;"&gt;'admin'&lt;/span&gt;), &lt;span style="color: #0a6fbf;"&gt;true&lt;/span&gt;, device_id &lt;span style="color: #687687;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #098658;"&gt;30&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="line-height: 20px;"&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;ALTER&lt;/span&gt; &lt;span style="color: #0a6fbf;"&gt;TABLE&lt;/span&gt; silver &lt;/div&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;SET&lt;/span&gt; &lt;span style="color: #0a6fbf;"&gt;ROW&lt;/span&gt; &lt;span style="color: #0a6fbf;"&gt;FILTER&lt;/span&gt; device_filter &lt;span style="color: #0a6fbf;"&gt;ON&lt;/span&gt; (device_id);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="line-height: 20px;"&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;SELECT&lt;/span&gt; &lt;span style="color: #687687;"&gt;*&lt;/span&gt; &lt;/div&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;FROM&lt;/span&gt; silver&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;ORDER BY&lt;/span&gt; device_id &lt;span style="color: #0a6fbf;"&gt;DESC&lt;/span&gt;;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="line-height: 20px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="background-color: #f6f7f9; color: #3b3b3b; font-family: Menlo, Monaco, Consolas, &amp;quot;Ubuntu Mono&amp;quot;, &amp;quot;Source Code Pro&amp;quot;, monospace, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; line-height: 20px; white-space: pre;"&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #687687;"&gt;*&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #795e26;"&gt;cast&lt;/span&gt;(from_unixtime(user_first_touch_timestamp&lt;span style="color: #687687;"&gt;/&lt;/span&gt;&lt;span style="color: #098658;"&gt;1000000&lt;/span&gt;) &lt;span style="color: #0a6fbf;"&gt;AS&lt;/span&gt; &lt;span style="color: #0a6fbf;"&gt;DATE&lt;/span&gt;) &lt;span style="color: #0a6fbf;"&gt;AS&lt;/span&gt; first_touch_date&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;FROM&lt;/span&gt; read_files(&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #c72e0f;"&gt;"/Volumes/dbacademy_ecommerce/v01/raw/users-historical"&lt;/span&gt;,&lt;/div&gt;&lt;div&gt;&amp;nbsp; &lt;span style="color: #0a6fbf;"&gt;format&lt;/span&gt; &lt;span style="color: #687687;"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #c72e0f;"&gt;'parquet'&lt;/span&gt;)&lt;/div&gt;&lt;div&gt;&lt;span style="color: #0a6fbf;"&gt;LIMIT&lt;/span&gt; &lt;span style="color: #098658;"&gt;10&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;</description><link>http://www.sharepointfix.com/2025/12/databricks-training-notes-compute.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-3370226659506415867</guid><pubDate>Thu, 17 Apr 2025 22:57:00 +0000</pubDate><atom:updated>2025-04-17T18:02:00.111-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AI</category><category domain="http://www.blogger.com/atom/ns#">AI Foundry</category><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">rag</category><title>Setting Up AI Foundry with ChatGPT and RAG-Based Chat: A Comprehensive Guide</title><description>&lt;p&gt;&lt;span face="&amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif" style="background-color: #fafafa; color: #424242; font-size: 16px;"&gt;&lt;b&gt;Introduction&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;In the rapidly evolving landscape of artificial intelligence, setting up an efficient and scalable AI system is crucial for businesses looking to leverage the power of AI. This blog post will guide you through the process of setting up AI Foundry using the ChatGPT model and implementing a Retrieval-Augmented Generation (RAG) based chat approach.&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;What is AI Foundry?&lt;/b&gt;&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;AI Foundry is a comprehensive platform provided by Azure that allows you to design, customize, and manage AI applications at scale. It offers a unified SDK, access to over 200 Azure services, and more than 1,800 models, making it a powerful tool for building AI-driven applications.&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Understanding ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;ChatGPT, developed by OpenAI, is a conversational AI model that interacts in a dialogue format. It can answer follow-up questions, admit mistakes, and reject inappropriate requests. This model is trained using Reinforcement Learning from Human Feedback (RLHF), making it highly effective for generating coherent and contextually relevant responses.&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;What is RAG-Based Chat?&lt;/b&gt;&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;Retrieval-Augmented Generation (RAG) is an architecture that enhances the capabilities of a Large Language Model (LLM) like ChatGPT by integrating an information retrieval system. This system provides grounding data, ensuring that the AI's responses are accurate and relevant. RAG is particularly useful for enterprise solutions, as it allows the AI to access and utilize proprietary content.&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Step-by-Step Guide to Setting Up AI Foundry with ChatGPT and RAG&lt;/b&gt;&lt;/p&gt;&lt;ol style="background-color: #fafafa; box-sizing: border-box; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 0px 0px 8px; max-width: none; padding-inline: 24px 0px; text-align: left;"&gt;&lt;li style="padding-inline-start: 4px;"&gt;&lt;p style="margin: 0px 0px 8px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Prerequisites&lt;/b&gt;&lt;/p&gt;&lt;ul style="box-sizing: border-box; list-style-type: disc; margin: -8px 0px 0px; max-width: none; padding-bottom: 8px; padding-inline: 24px 0px;"&gt;&lt;li style="padding-inline-start: 4px;"&gt;Azure account with access to AI Foundry.&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;OpenAI API key for ChatGPT.&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;Basic understanding of Python and Azure services.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;&lt;p style="margin: 0px 0px 8px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Setting Up AI Foundry&lt;/b&gt;&lt;/p&gt;&lt;ul style="box-sizing: border-box; list-style-type: disc; margin: -8px 0px 0px; max-width: none; padding-bottom: 8px; padding-inline: 24px 0px;"&gt;&lt;li style="padding-inline-start: 4px;"&gt;Sign In: Log into your Azure account and navigate to AI Foundry.&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;Create a New Project: Start a new project and select the necessary services and models.&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;Configure SDK: Install the AI Foundry SDK and set up your development environment.&lt;/li&gt;&lt;/ul&gt;&lt;div class="___77lcry0 f10pi13n" style="position: relative;"&gt;&lt;div class="___1hewfwb f10pi13n f7oukh6 f5p0z4x" role="button" style="opacity: 1; position: relative; transition: opacity 0.5s ease-in-out, max-height 0.5s ease-in-out;" tabindex="0"&gt;&lt;!--ScriptorStartFragment--&gt;&lt;div class="scriptor-paragraph"&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"&gt;&lt;b&gt;pip install azure-ai-foundry&lt;/b&gt;&lt;/blockquote&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;&lt;p style="margin: 0px 0px 8px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Integrating ChatGPT&lt;/b&gt;&lt;/p&gt;&lt;ul style="box-sizing: border-box; list-style-type: disc; margin: -8px 0px 0px; max-width: none; padding-bottom: 8px; padding-inline: 24px 0px;"&gt;&lt;li style="padding-inline-start: 4px;"&gt;API Access: Obtain your OpenAI API key and integrate it into your project.&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;Model Configuration: Configure the ChatGPT model within AI Foundry.&lt;/li&gt;&lt;/ul&gt;&lt;div class="___77lcry0 f10pi13n" style="position: relative;"&gt;&lt;div class="___1hewfwb f10pi13n f7oukh6 f5p0z4x" role="button" style="opacity: 1; position: relative; transition: opacity 0.5s ease-in-out, max-height 0.5s ease-in-out;" tabindex="0"&gt;&lt;!--ScriptorStartFragment--&gt;&lt;div class="scriptor-paragraph"&gt;&lt;blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px;"&gt;&lt;b&gt;import openai&lt;/b&gt;&lt;b&gt;&lt;br class="scriptor-paragraph" /&gt;&lt;/b&gt;&lt;b&gt;openai.api_key = 'your-api-key'&lt;/b&gt;&lt;b&gt;&lt;br class="scriptor-paragraph" /&gt;&lt;/b&gt;&lt;b&gt;response = openai.ChatCompletion.create(&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; model="gpt-4",&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; messages=[&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"role": "system", "content": "You are a helpful assistant."},&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"role": "user", "content": "How can I set up AI Foundry?"}&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]&lt;br /&gt;&lt;/b&gt;&lt;b&gt;)&lt;br /&gt;&lt;/b&gt;&lt;b&gt;print(response.choices[0].message["content"])&lt;/b&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;br /&gt;&lt;/div&gt;&lt;!--ScriptorEndFragment--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;&lt;p style="margin: 0px 0px 8px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Implementing RAG-Based Chat&lt;/b&gt;&lt;/p&gt;&lt;ul style="box-sizing: border-box; list-style-type: disc; margin: -8px 0px 0px; max-width: none; padding-bottom: 8px; padding-inline: 24px 0px;"&gt;&lt;li style="padding-inline-start: 4px;"&gt;Data Retrieval System: Set up Azure AI Search to index and retrieve relevant data.&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;Integration with ChatGPT: Combine the retrieval system with ChatGPT to enhance response accuracy.&lt;br /&gt;&lt;br /&gt;&lt;!--ScriptorStartFragment--&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;from azure.ai.search import SearchClient&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;from azure.core.credentials import AzureKeyCredential&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;br class="scriptor-paragraph" /&gt;&lt;/b&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;search_client = SearchClient(endpoint="your-search-endpoint", credential=AzureKeyCredential("your-key"))&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;br class="scriptor-paragraph" /&gt;&lt;/b&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;def retrieve_data(query):&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; results = search_client.search(query)&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return results&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;br class="scriptor-paragraph" /&gt;&lt;/b&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;def generate_response(query):&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = retrieve_data(query)&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = openai.ChatCompletion.create(&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; model="gpt-4",&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; messages=[&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"role": "system", "content": "You are a helpful assistant."},&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"role": "user", "content": query},&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"role": "assistant", "content": data}&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ]&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;/b&gt;&lt;/div&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return response.choices[0].message["content"]&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;br class="scriptor-paragraph" /&gt;&lt;/b&gt;&lt;div class="scriptor-paragraph"&gt;&lt;b&gt;print(generate_response("Tell me about AI Foundry"))&lt;/b&gt;&lt;/div&gt;&lt;!--ScriptorEndFragment--&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="___77lcry0 f10pi13n" style="position: relative;"&gt;&lt;div class="___1hewfwb f10pi13n f7oukh6 f5p0z4x" role="button" style="opacity: 1; position: relative; transition: opacity 0.5s ease-in-out, max-height 0.5s ease-in-out;" tabindex="0"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;&lt;p style="margin: 0px 0px 8px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Testing and Deployment&lt;/b&gt;&lt;/p&gt;&lt;ul style="box-sizing: border-box; list-style-type: disc; margin: -8px 0px 0px; max-width: none; padding-bottom: 8px; padding-inline: 24px 0px;"&gt;&lt;li style="padding-inline-start: 4px;"&gt;Evaluation: Test the system using ground truth data to ensure coherence and relevance.&lt;/li&gt;&lt;li style="padding-inline-start: 4px;"&gt;Deployment: Deploy your AI application using Azure's scalable infrastructure.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/p&gt;&lt;p style="background-color: #fafafa; color: #424242; font-family: &amp;quot;Segoe Sans&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 16px; margin: 6px 0px 10px; max-width: none; overflow-wrap: break-word;"&gt;Setting up AI Foundry with ChatGPT and implementing a RAG-based chat approach can significantly enhance the capabilities of your AI applications. By following this guide, you can create a robust and scalable AI system that leverages the latest advancements in AI technology.&lt;/p&gt;</description><link>http://www.sharepointfix.com/2025/04/setting-up-ai-foundry-with-chatgpt-and.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-3928760928620228756</guid><pubDate>Sat, 11 Jan 2025 18:13:00 +0000</pubDate><atom:updated>2025-01-13T13:15:56.757-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure certification</category><category domain="http://www.blogger.com/atom/ns#">azure data engineer associate</category><title>How I Successfully Passed the DP-203 Azure Data Engineer Associate Certification</title><description>&lt;i aria-hidden="true" data-tabster-dummy="" role="none" tabindex="0"&gt;&lt;/i&gt;&lt;div aria-labelledby="Mpua31PVbzny7Sgs4Dmck-user-message" data-tabster="{&amp;quot;groupper&amp;quot;:{&amp;quot;tabbability&amp;quot;:2},&amp;quot;focusable&amp;quot;:{}}" id="Mpua31PVbzny7Sgs4Dmck-user-message" role="article" tabindex="0"&gt;&lt;div class="flex w-full flex-col items-end" data-content="user-message"&gt;The journey to obtaining the DP-203 Azure Data Engineer Associate certification is both challenging and rewarding. I'd like to share my experience and preparation strategy that led me to success.&lt;/div&gt;&lt;div class="flex w-full flex-col items-end" data-content="user-message"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz03GEf-0iqjwXDu7BleA6q7asd-pj-Xku0BLWK_h8BJuMLIFo6A0ltF9ku6o0X3iJR-wBx1FSaleePmffLGvmzGXhYP0QQXBEQkwHM9Brr3gxt-yUYmz2kaQJTx6LRrXRtUWf_oY3ufz5ZppUN8bctu2EMyFYGoQozEA3MURoD4zgId9D17TYLMmr2XE/s174/DP203%20Badge.JPG" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="174" data-original-width="167" height="87" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz03GEf-0iqjwXDu7BleA6q7asd-pj-Xku0BLWK_h8BJuMLIFo6A0ltF9ku6o0X3iJR-wBx1FSaleePmffLGvmzGXhYP0QQXBEQkwHM9Brr3gxt-yUYmz2kaQJTx6LRrXRtUWf_oY3ufz5ZppUN8bctu2EMyFYGoQozEA3MURoD4zgId9D17TYLMmr2XE/w83-h87/DP203%20Badge.JPG" width="83" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;Understanding the Certification&lt;/h3&gt;&lt;/div&gt;&lt;div aria-labelledby="wPSX5u7ypT4hm1WHpq2ZE-author} wPSX5u7ypT4hm1WHpq2ZE-content-0" data-content="ai-message" data-tabster="{&amp;quot;groupper&amp;quot;:{&amp;quot;tabbability&amp;quot;:2},&amp;quot;focusable&amp;quot;:{}}" role="article" tabindex="0"&gt;&lt;div class="space-y-3 break-words" id="wPSX5u7ypT4hm1WHpq2ZE-content-0"&gt;&lt;p&gt;Before diving into the study material, it's essential to understand the certification itself. The DP-203 certification focuses on implementing and designing data solutions on Microsoft Azure, including Azure Synapse Analytics, Azure Data Lake Gen2, Azure Data Factory, Azure Databricks, Azure Stream Analytics and Azure Event Hubs among others. It's crucial to be familiar with the core services and tools offered by Azure to effectively prepare for the exam.&lt;/p&gt;&lt;h3&gt;My Preparation Material&lt;/h3&gt;&lt;ol start="1"&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Microsoft Learning&lt;/strong&gt;:
Microsoft Learning offers a range of resources, including free online modules, videos, and documentation that cover the exam's topics comprehensively. I found these resources extremely helpful to build a strong foundation and understand the concepts deeply.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Practice Exams&lt;/strong&gt;:
Taking practice exams was one of the most crucial parts of my preparation. They not only helped me assess my knowledge but also familiarized me with the exam's format and types of questions. It’s a great way to identify areas that need improvement and get comfortable with the timing.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pluralsight Course&lt;/strong&gt;:
I enrolled in the Pluralsight course "DP-203: Processing Data in Azure Using Batch Solutions" &lt;a href="https://www.pluralsight.com/cloud-guru/courses/dp-203-processing-in-azure-using-batch-solutions"&gt;https://www.pluralsight.com/cloud-guru/courses/dp-203-processing-in-azure-using-batch-solutions&lt;/a&gt;&amp;nbsp;This course provided in-depth coverage of the exam's topics, with practical examples and hands-on labs. The interactive approach and clear explanations made complex concepts easier to understand.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h3&gt;Study Plan and Tips&lt;/h3&gt;&lt;p&gt;Creating a study plan and sticking to it is essential. Here's what worked for me:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set Clear Goals&lt;/strong&gt;: Break down the topics and set weekly goals to cover specific modules or sections. This approach makes the vast syllabus more manageable.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Practice Regularly&lt;/strong&gt;: Consistently work on practice questions and labs to reinforce your learning. Practical application is key to mastering the material.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Join Study Groups&lt;/strong&gt;: Engage with study groups or online forums to discuss challenging topics, share resources, and gain different perspectives. The Azure community is very supportive and can provide valuable insights.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Review and Revise&lt;/strong&gt;: Regularly review the topics you’ve covered to retain the information. Summarizing what you've learned in your own words can be an effective revision strategy.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Exam Day&lt;/h3&gt;&lt;p&gt;On the day of the exam, make sure to:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Get a good night's sleep before the exam day.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Have all necessary identification and materials ready.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Stay calm and focused during the exam.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Final Thoughts&lt;/h3&gt;&lt;p&gt;Passing the DP-203 Azure Data Engineer Associate certification requires dedication, consistency, and the right resources. By leveraging Microsoft Learning, practice exams, and the Pluralsight course, I was able to build a solid understanding and practical skills that helped me succeed. Remember, it's not just about passing the exam but gaining valuable knowledge that will benefit your career in data engineering.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Good luck to everyone on their certification journey! &#128640;&amp;nbsp;&lt;/p&gt;</description><link>http://www.sharepointfix.com/2025/01/how-i-successfully-passed-dp-203-azure.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz03GEf-0iqjwXDu7BleA6q7asd-pj-Xku0BLWK_h8BJuMLIFo6A0ltF9ku6o0X3iJR-wBx1FSaleePmffLGvmzGXhYP0QQXBEQkwHM9Brr3gxt-yUYmz2kaQJTx6LRrXRtUWf_oY3ufz5ZppUN8bctu2EMyFYGoQozEA3MURoD4zgId9D17TYLMmr2XE/s72-w83-h87-c/DP203%20Badge.JPG" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-1012494570778796236</guid><pubDate>Sat, 04 Jan 2025 17:54:00 +0000</pubDate><atom:updated>2025-01-04T11:54:39.413-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure stream analytics</category><category domain="http://www.blogger.com/atom/ns#">window functions</category><title> Mastering Window Functions in Azure Stream Analytics</title><description>&lt;p&gt;Azure Stream Analytics is a powerful tool for real-time data processing and analytics. A standout feature of Stream Analytics is its ability to use &lt;strong&gt;window functions&lt;/strong&gt; to analyze streaming data over specified time frames. Window functions allow users to aggregate data, detect patterns, and extract meaningful insights from continuous data streams. In this blog post, we’ll dive into the types of window functions available in Azure Stream Analytics and provide practical examples to showcase their usage.&lt;/p&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;What Are Window Functions?&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Window functions in Azure Stream Analytics are used to group and process streaming data within a temporal boundary. Unlike traditional SQL, where all rows are considered simultaneously for aggregation, window functions process only a subset of data within a defined window, making them perfect for real-time scenarios.&lt;/p&gt;&lt;p&gt;Stream Analytics supports three types of windows:&lt;/p&gt;&lt;ol data-spread="false" start="1"&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tumbling Windows&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hopping Windows&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sliding Windows&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Session Windows&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Each window type serves a unique purpose based on how you want to analyze the data.&lt;/p&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;1. Tumbling Windows&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Tumbling windows divide time into non-overlapping intervals of fixed duration. Every event belongs to exactly one tumbling window.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Calculate the total number of transactions every minute.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Query Example&lt;/strong&gt;&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;SELECT
    COUNT(*) AS TransactionCount,
    System.Timestamp AS WindowEndTime
FROM
    Transactions
GROUP BY
    TumblingWindow(Duration(minute, 1))&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;&lt;strong&gt;Key Characteristics&lt;/strong&gt;&lt;/h4&gt;&lt;ul data-spread="false"&gt;&lt;li&gt;&lt;p&gt;Fixed, non-overlapping intervals.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Suitable for periodic reporting and batch aggregation.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;2. Hopping Windows&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Hopping windows allow overlapping intervals by specifying a hop size and window duration. This overlap means events can belong to multiple windows.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Calculate the average temperature over the past five minutes, updated every minute.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Query Example&lt;/strong&gt;&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;SELECT
    AVG(Temperature) AS AvgTemperature,
    System.Timestamp AS WindowEndTime
FROM
    SensorData
GROUP BY
    HoppingWindow(Duration(minute, 5), Hop(minute, 1))&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;&lt;strong&gt;Key Characteristics&lt;/strong&gt;&lt;/h4&gt;&lt;ul data-spread="false"&gt;&lt;li&gt;&lt;p&gt;Overlapping intervals allow fine-grained updates.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Useful for moving averages or rolling analytics.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;3. Sliding Windows&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Sliding windows have no fixed duration or schedule. A new window is created whenever an event arrives, and the window’s lifetime depends on the event.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Trigger alerts when CPU usage exceeds 80% over a 10-second period.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Query Example&lt;/strong&gt;&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;SELECT
    AVG(CPU_Usage) AS AvgCPUUsage,
    System.Timestamp AS WindowEndTime
FROM
    SystemMetrics
GROUP BY
    SlidingWindow(Duration(second, 10))
HAVING
    AVG(CPU_Usage) &amp;gt; 80&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;&lt;strong&gt;Key Characteristics&lt;/strong&gt;&lt;/h4&gt;&lt;ul data-spread="false"&gt;&lt;li&gt;&lt;p&gt;Continuous analysis without fixed boundaries.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ideal for real-time alerting and anomaly detection.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;4. Session Windows&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Session windows group events that occur within a specific time gap of each other. If the gap exceeds a defined threshold, a new session begins.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;Identify user sessions on a website and calculate the total time spent per session.&lt;/p&gt;&lt;h4&gt;&lt;strong&gt;Query Example&lt;/strong&gt;&lt;/h4&gt;&lt;pre&gt;&lt;code&gt;SELECT
    SessionId,
    COUNT(*) AS EventCount,
    System.Timestamp AS SessionEndTime
FROM
    UserActivity
GROUP BY
    SessionWindow(Duration(minute, 5)), SessionId&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;&lt;strong&gt;Key Characteristics&lt;/strong&gt;&lt;/h4&gt;&lt;ul data-spread="false"&gt;&lt;li&gt;&lt;p&gt;Dynamic window lengths based on activity.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Best suited for sessionization and user activity tracking.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;System.Timestamp in Window Functions&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;System.Timestamp&lt;/code&gt; function provides the end time of each window, which is particularly useful for logging and debugging.&lt;/p&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;Best Practices for Using Window Functions&lt;/strong&gt;&lt;/h3&gt;&lt;ol data-spread="false" start="1"&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the Right Window Type&lt;/strong&gt;: Match the window type to your business need. For example, use tumbling windows for non-overlapping reporting and sliding windows for real-time monitoring.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimize Event Timestamping&lt;/strong&gt;: Ensure your events have accurate timestamps to avoid skewed results.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consider Performance&lt;/strong&gt;: Overlapping windows (e.g., hopping windows) may require more resources. Monitor job performance and scale as needed.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leverage Late Arrival Policies&lt;/strong&gt;: Configure late arrival policies to handle events arriving out of order.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;&lt;h3&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/h3&gt;&lt;p&gt;Azure Stream Analytics window functions are indispensable for real-time data analysis, offering flexibility and precision to handle diverse streaming scenarios. By understanding the differences between tumbling, hopping, sliding, and session windows, you can design robust solutions tailored to your business requirements.&lt;/p&gt;&lt;p&gt;Experiment with these window functions in your Stream Analytics jobs, and unlock the full potential of real-time analytics on Azure. Happy streaming!&lt;/p&gt;</description><link>http://www.sharepointfix.com/2025/01/mastering-window-functions-in-azure.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-2969699781958946899</guid><pubDate>Tue, 24 Dec 2024 23:03:00 +0000</pubDate><atom:updated>2024-12-24T17:03:46.170-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure synapse analytics</category><category domain="http://www.blogger.com/atom/ns#">hash distribution</category><category domain="http://www.blogger.com/atom/ns#">MPP</category><title>Understanding Massively Parallel Processing (MPP) in Azure Synapse Analytics</title><description>&lt;p&gt;&amp;nbsp;In today’s data-driven world, handling large volumes of data efficiently is critical. Azure Synapse Analytics employs a &lt;strong&gt;Massively Parallel Processing (MPP)&lt;/strong&gt; architecture to deliver exceptional performance for big data workloads. But what is MPP, and how does it benefit your data analytics processes? Let’s break it down with examples and practical insights.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What is MPP?&lt;/h2&gt;
&lt;p&gt;Massively Parallel Processing (MPP) is a computational architecture where multiple processors work on different parts of a task simultaneously. In Azure Synapse Analytics, this means data is distributed across 60 nodes, or &lt;strong&gt;distributions&lt;/strong&gt;, allowing for high-speed query execution and scalability.&lt;/p&gt;
&lt;p&gt;Imagine dividing a massive dataset into smaller chunks and assigning each chunk to a different worker. Each worker processes its portion independently, and the results are aggregated to form the final output.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Components of MPP Architecture&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Control Node&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Acts as the brain of the system.&lt;/li&gt;
&lt;li&gt;Receives SQL queries, optimizes them, and coordinates execution across compute nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compute Nodes&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perform the actual data processing.&lt;/li&gt;
&lt;li&gt;Each compute node works on a subset of the data, operating in parallel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Distributions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data is divided into 60 distributions, which are evenly spread across compute nodes.&lt;/li&gt;
&lt;li&gt;Ensures efficient processing and load balancing.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Movement Service (DMS)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Responsible for shuffling data between distributions during query execution.&lt;/li&gt;
&lt;li&gt;Minimizing data movement is critical for performance optimization.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Benefits of MPP&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Easily handle terabytes to petabytes of data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High Performance&lt;/strong&gt;: Parallel execution ensures faster query processing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: Optimized for complex analytical queries and large-scale data transformations.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Practical Example: Query Execution in MPP&lt;/h2&gt;
&lt;h3&gt;Scenario&lt;/h3&gt;
&lt;p&gt;Suppose you have a large &lt;code inline=""&gt;Sales&lt;/code&gt; table with billions of rows, and you want to calculate the total sales by region.&lt;/p&gt;
&lt;h3&gt;Step 1: Distributing the Data&lt;/h3&gt;
&lt;p&gt;First, the table is distributed across 60 distributions based on a chosen hash column, such as &lt;code inline=""&gt;RegionID&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;CREATE TABLE Sales
WITH
(
    DISTRIBUTION = HASH(RegionID)
)
AS
SELECT * FROM ExternalSalesData;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 2: Parallel Processing&lt;/h3&gt;
&lt;p&gt;Each compute node processes the rows within its assigned distributions to calculate partial sums.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;SELECT RegionID, SUM(SalesAmount) AS TotalSales
FROM Sales
GROUP BY RegionID;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The query optimizer divides the computation across nodes, and each node independently calculates the sum for its subset of data.&lt;/p&gt;
&lt;h3&gt;Step 3: Data Aggregation&lt;/h3&gt;
&lt;p&gt;The results from all nodes are aggregated by the &lt;strong&gt;Control Node&lt;/strong&gt; to produce the final output:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;RegionID&lt;/th&gt;
&lt;th&gt;TotalSales&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;1,500,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;2,300,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Optimizing for MPP&lt;/h2&gt;
&lt;p&gt;To get the best performance out of MPP, follow these tips:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Choose the Right Distribution Column&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pick a column with high cardinality and evenly distributed values.&lt;/li&gt;
&lt;li&gt;Avoid skewed columns to prevent load imbalance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Minimize Data Movement&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Design queries and table structures to reduce shuffling between distributions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Partitioning&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For large tables, partition data by time or another logical attribute to improve query performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Leverage Synapse Studio Tools&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use query insights and execution plans to identify bottlenecks and optimize queries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Advanced Example: Join Operations in MPP&lt;/h2&gt;
&lt;p&gt;When joining two large tables, ensuring that data is co-located on the same distributions minimizes data movement. For example:&lt;/p&gt;
&lt;h3&gt;Joining Tables&lt;/h3&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;SELECT s.RegionID, r.RegionName, SUM(s.SalesAmount) AS TotalSales
FROM Sales s
JOIN Regions r
  ON s.RegionID = r.RegionID
GROUP BY s.RegionID, r.RegionName;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Key Considerations:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Distribute both tables using the &lt;code inline=""&gt;RegionID&lt;/code&gt; column to align their data on the same distributions.&lt;/li&gt;
&lt;li&gt;Use the &lt;code inline=""&gt;DISTRIBUTION = HASH&lt;/code&gt; strategy during table creation for consistent hashing.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;CREATE TABLE Regions
WITH
(
    DISTRIBUTION = HASH(RegionID)
)
AS
SELECT * FROM ExternalRegionsData;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Azure Synapse Analytics’ MPP architecture is a game-changer for big data analytics. By distributing workloads across multiple compute nodes, it ensures scalability, performance, and efficiency. However, to fully leverage its power, you need to design your tables and queries thoughtfully.&lt;/p&gt;
&lt;p&gt;Experiment with distribution strategies, minimize data movement, and analyze query performance to maximize your results. For more insights, check out the &lt;a href="https://learn.microsoft.com/en-us/azure/synapse-analytics/sql-data-warehouse/massively-parallel-processing-mpp-architecture"&gt;official documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ready to take your data analytics to the next level? Start optimizing with MPP today!&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/12/understanding-massively-parallel.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-7340485148305142372</guid><pubDate>Tue, 24 Dec 2024 22:45:00 +0000</pubDate><atom:updated>2024-12-24T16:45:26.176-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure synapse analytics</category><category domain="http://www.blogger.com/atom/ns#">distribution columns</category><title>Optimizing Table Design in Azure Synapse Analytics: Choosing a Distribution Column</title><description>&lt;p&gt;&amp;nbsp;When working with Azure Synapse Analytics, the choice of a distribution column can significantly impact query performance and overall system efficiency. Understanding how distributions work and selecting the right column for your table can make all the difference in handling large-scale data processing.&lt;/p&gt;
&lt;h2&gt;What Are Distributions in Synapse Analytics?&lt;/h2&gt;
&lt;p&gt;Azure Synapse uses a massively parallel processing (MPP) architecture, dividing data across 60 distributions to process queries in parallel. This architecture is designed to handle big data workloads efficiently. However, distributing data incorrectly can lead to performance bottlenecks, such as data movement during query execution.&lt;/p&gt;
&lt;p&gt;To mitigate this, tables can be distributed in three ways:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hash Distribution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Round-Robin Distribution&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replicated Tables&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Among these, &lt;strong&gt;hash distribution&lt;/strong&gt; allows you to distribute data based on a specific column, which is key to optimizing performance.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;How to Choose the Right Distribution Column&lt;/h2&gt;
&lt;p&gt;Choosing the right distribution column is crucial to minimizing data movement and improving query performance. Here are the primary considerations and guidelines:&lt;/p&gt;
&lt;h3&gt;1. &lt;strong&gt;Identify Query Patterns&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Examine your query workload. If your queries frequently join tables, filter data, or aggregate results based on a specific column, consider using that column for distribution.&lt;/p&gt;
&lt;h4&gt;Example:&lt;/h4&gt;
&lt;p&gt;If your workload frequently includes queries like:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;SELECT SUM(sales_amount)
FROM Sales
JOIN Products ON Sales.ProductID = Products.ProductID
WHERE Region = 'North';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code inline=""&gt;ProductID&lt;/code&gt; column could be a good candidate for hash distribution.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. &lt;strong&gt;Minimize Data Movement&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Data movement occurs when rows from different distributions must be shuffled to execute a query. To minimize this, choose a column that aligns with the join or filter conditions of your most common queries.&lt;/p&gt;
&lt;h4&gt;Best Practices:&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Use columns involved in &lt;strong&gt;joins&lt;/strong&gt; between large tables.&lt;/li&gt;
&lt;li&gt;Avoid columns with high cardinality and frequent updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;3. &lt;strong&gt;Leverage High Cardinality Columns&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Columns with a wide range of unique values (high cardinality) are ideal for hash distribution. They ensure an even spread of data across distributions, balancing the workload.&lt;/p&gt;
&lt;h4&gt;Example:&lt;/h4&gt;
&lt;p&gt;A column like &lt;code inline=""&gt;CustomerID&lt;/code&gt; with thousands of unique values is a better candidate than a &lt;code inline=""&gt;Region&lt;/code&gt; column with only a few.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. &lt;strong&gt;Avoid Skewed Data&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Data skew occurs when some distributions have significantly more data than others, leading to processing delays. Choose a column that avoids this issue.&lt;/p&gt;
&lt;h4&gt;Anti-Pattern:&lt;/h4&gt;
&lt;p&gt;Using a column like &lt;code inline=""&gt;Region&lt;/code&gt; in a dataset where most rows belong to a single region would lead to uneven data distribution.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Common Scenarios and Recommendations&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommended Column&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Large fact tables with frequent joins&lt;/td&gt;
&lt;td&gt;Primary join key (e.g., ProductID, CustomerID)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tables with filtering by date&lt;/td&gt;
&lt;td&gt;Date column (if cardinality is high)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High update frequency&lt;/td&gt;
&lt;td&gt;Avoid distribution on the updated column&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;Example: Implementing Hash Distribution&lt;/h2&gt;
&lt;p&gt;Here’s how you can create a hash-distributed table in Azure Synapse Analytics:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;CREATE TABLE Sales
WITH
(
    DISTRIBUTION = HASH(ProductID)
)
AS
SELECT * FROM ExternalSalesData;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This configuration ensures that rows are evenly distributed across distributions based on the &lt;code inline=""&gt;ProductID&lt;/code&gt; column.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Selecting the right distribution column is a critical step in optimizing the performance of your Synapse Analytics workload. By understanding your query patterns, avoiding data skew, and leveraging high cardinality columns, you can significantly reduce data movement and improve processing efficiency. Experiment with different configurations and use Synapse’s query execution insights to validate your choices.&lt;/p&gt;
&lt;p&gt;For more detailed information, refer to the &lt;a href="https://learn.microsoft.com/en-us/azure/synapse-analytics/sql-data-warehouse/sql-data-warehouse-tables-distribute#choosing-a-distribution-column"&gt;Azure Synapse Analytics documentation&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;By following these guidelines, you’ll be well on your way to designing high-performance tables in Azure Synapse Analytics.&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/12/optimizing-table-design-in-azure.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-7157251102985330829</guid><pubDate>Sat, 14 Dec 2024 04:32:00 +0000</pubDate><atom:updated>2024-12-13T22:32:07.509-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AI</category><category domain="http://www.blogger.com/atom/ns#">knowledge graph</category><category domain="http://www.blogger.com/atom/ns#">LLM</category><category domain="http://www.blogger.com/atom/ns#">rag</category><title>Enhancing Retrieval-Augmented Generation (RAG) with Knowledge Graphs and Vector Databases</title><description>&lt;p&gt;In the evolving landscape of AI, combining Large Language Models (LLMs) with structured data sources like Knowledge Graphs (KGs) and Vector Databases has become pivotal. This integration, known as Retrieval-Augmented Generation (RAG), enhances the contextual relevance and accuracy of AI-generated responses.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Understanding RAG&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;RAG involves retrieving pertinent information to augment prompts sent to an LLM, enabling more precise and context-aware outputs. For instance, providing a job description and a resume to an LLM can yield a tailored cover letter, as the model leverages the specific context provided.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Integrating Knowledge Graphs in RAG&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Knowledge Graphs store entities and their interrelations, offering a structured representation of information. Incorporating KGs into RAG can be approached in several ways:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vector-Based Retrieval&lt;/strong&gt;: Entities from the KG are vectorized and stored in a vector database. By vectorizing a natural language prompt, the system retrieves entities with similar vectors, facilitating semantic search.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prompt-to-Query Retrieval&lt;/strong&gt;: LLMs generate structured queries (e.g., SPARQL or Cypher) based on the prompt, which are executed against the KG to fetch relevant data.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hybrid Approach&lt;/strong&gt;: Combining vector-based retrieval with structured querying allows for initial broad retrieval refined by specific criteria, enhancing precision.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Practical Implementation Steps&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Preparation&lt;/strong&gt;: Collect and preprocess data to construct the Knowledge Graph, defining entities and their relationships.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vectorization&lt;/strong&gt;: Convert entities and relationships into vector embeddings using models like Word2Vec or BERT, capturing semantic meanings.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;: Store embeddings in a vector database (e.g., Pinecone) and the KG in a graph database (e.g., Neo4j).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Retrieval Mechanism&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Vector-Based&lt;/em&gt;: For a given prompt, compute its embedding and perform similarity search in the vector database to retrieve relevant entities.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Query-Based&lt;/em&gt;: Translate the prompt into a structured query to extract pertinent information from the KG.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Augmentation and Generation&lt;/strong&gt;: Combine retrieved data with the original prompt and feed it into the LLM to generate a contextually enriched response.&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Benefits of This Integration&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhanced Contextuality&lt;/strong&gt;: KGs provide structured context, reducing ambiguities in LLM outputs.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improved Accuracy&lt;/strong&gt;: Leveraging precise relationships from KGs leads to more accurate responses.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Explainability&lt;/strong&gt;: The structured nature of KGs offers clear insights into how conclusions are derived, increasing transparency.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Challenges and Considerations&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data Maintenance&lt;/strong&gt;: Keeping the KG updated with current information is crucial for relevance.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complexity&lt;/strong&gt;: Implementing and managing both vector databases and KGs requires specialized expertise.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;: Ensuring the system handles large-scale data efficiently is essential.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Integrating Knowledge Graphs and Vector Databases within RAG frameworks significantly enhances the capabilities of LLMs, enabling them to generate responses that are not only contextually rich but also accurate and explainable. As AI applications continue to evolve, this synergy will play a critical role in developing intelligent systems that effectively understand and utilize complex information.&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/12/enhancing-retrieval-augmented.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-830656708184333781</guid><pubDate>Sat, 14 Dec 2024 03:50:00 +0000</pubDate><atom:updated>2024-12-13T21:50:38.427-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AI</category><category domain="http://www.blogger.com/atom/ns#">knowledge graph</category><category domain="http://www.blogger.com/atom/ns#">kobai</category><category domain="http://www.blogger.com/atom/ns#">rag</category><title>Bridging Intelligence: RAG, Knowledge Graphs, and the Future of AI-Powered Information Retrieval</title><description>&lt;h2 style="text-align: left;"&gt;Introduction&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;In the rapidly evolving landscape of artificial intelligence, two transformative technologies are reshaping how we approach information retrieval and knowledge management: Retrieval-Augmented Generation (RAG) and Knowledge Graphs. These powerful tools are not just incremental improvements but fundamental reimagining's of how AI systems can understand, retrieve, and generate contextually rich information.&lt;/p&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Understanding the Foundations&lt;/h2&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Retrieval-Augmented Generation (RAG)&lt;/h3&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;RAG represents a breakthrough in AI's ability to generate more accurate, contextually relevant, and up-to-date responses. Unlike traditional language models that rely solely on their training data, RAG combines two critical components:&lt;/p&gt;&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Retrieval Mechanism&lt;/strong&gt;: A system that dynamically fetches relevant information from external knowledge bases&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Generation Engine&lt;/strong&gt;: An AI model that synthesizes retrieved information into coherent, contextually precise responses&lt;/li&gt;
&lt;/ol&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Knowledge Graphs: The Semantic Backbone&lt;/h3&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;A Knowledge Graph is a sophisticated semantic network that represents knowledge in terms of entities, their properties, and the relationships between them. Think of it as a highly structured, interconnected web of information that allows for complex reasoning and inference.&lt;/p&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;The Synergy of RAG and Knowledge Graphs&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;When RAG meets Knowledge Graphs, magic happens. The Knowledge Graph provides a structured, semantically rich repository of information, while RAG enables intelligent, context-aware retrieval and generation.&lt;/p&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Key Benefits:&lt;/h3&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Enhanced accuracy of information retrieval&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Improved contextual understanding&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Dynamic knowledge expansion&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;More nuanced and precise AI responses&lt;/li&gt;
&lt;/ul&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Real-World Use Cases&lt;/h2&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;1. Healthcare and Medical Research&lt;/h3&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Personalized Medical Consultation Support&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Rapidly evolving medical research, complex patient histories&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;RAG + Knowledge Graph Solution&lt;/strong&gt;:
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Integrate medical research databases, patient records, and clinical knowledge graphs&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Generate personalized treatment recommendations&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Provide up-to-date insights based on latest research&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Potential Impact&lt;/strong&gt;:&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;More accurate diagnoses&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Personalized treatment plans&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Reduced medical errors&lt;/li&gt;
&lt;/ul&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;2. Financial Services and Investment Intelligence&lt;/h3&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Intelligent Investment Advisory&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Complex, rapidly changing financial markets&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;RAG + Knowledge Graph Solution&lt;/strong&gt;:
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Create comprehensive financial knowledge graphs&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Retrieve real-time market data, company information, and economic indicators&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Generate nuanced investment insights and risk assessments&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Potential Impact&lt;/strong&gt;:&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;More informed investment decisions&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Comprehensive risk analysis&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Personalized financial advice&lt;/li&gt;
&lt;/ul&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;3. Customer Support and Enterprise Knowledge Management&lt;/h3&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Advanced Enterprise Support System&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Fragmented knowledge bases, inconsistent information retrieval&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;RAG + Knowledge Graph Solution&lt;/strong&gt;:
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Build comprehensive organizational knowledge graphs&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Enable intelligent, context-aware support resolution&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Dynamically update and learn from interaction data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Potential Impact&lt;/strong&gt;:&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Faster, more accurate customer support&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Reduced support ticket resolution time&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Continuous knowledge base improvement&lt;/li&gt;
&lt;/ul&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;4. Scientific Research and Academic Discovery&lt;/h3&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Cross-Disciplinary Research Assistant&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Challenge&lt;/strong&gt;: Information silos, complex interdisciplinary connections&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;RAG + Knowledge Graph Solution&lt;/strong&gt;:
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Create interconnected research knowledge graphs&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Facilitate discovery of novel research connections&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Generate comprehensive literature reviews&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;Potential Impact&lt;/strong&gt;:&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Accelerated scientific discovery&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Identification of novel research opportunities&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Enhanced cross-disciplinary collaboration&lt;/li&gt;
&lt;/ul&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Technical Implementation Considerations&lt;/h2&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Key Architecture Components&lt;/h3&gt;&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Knowledge Graph Design&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Semantic Embedding Technologies&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Vector Database Integration&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Advanced Retrieval Algorithms&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Large Language Model Integration&lt;/li&gt;
&lt;/ol&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Recommended Technologies&lt;/h3&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Azure Databricks&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="0"&gt;Kobai Semantic Model - Saturn, Tower and Studio&lt;/li&gt;
&lt;/ul&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Challenges and Future Directions&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;While promising, RAG and Knowledge Graphs face challenges:&lt;/p&gt;&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Complexity of graph construction&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Maintaining graph accuracy&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Computational resources&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Semantic reasoning limitations&lt;/li&gt;
&lt;/ul&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;RAG and Knowledge Graphs represent more than a technological advancement—they're a paradigm shift in how we conceive intelligent information systems. By bridging structured knowledge with dynamic generation, we're moving towards AI that doesn't just process information, but truly understands and contextualizes it.&lt;/p&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;The future belongs to systems that can learn, reason, and generate insights with human-like nuance and precision.&lt;/p&gt;&lt;hr /&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;strong&gt;About the Author&lt;/strong&gt;: A passionate AI researcher and technical strategist exploring the frontiers of intelligent information systems.&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/12/bridging-intelligence-rag-knowledge.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-2054840945627669025</guid><pubDate>Sun, 08 Dec 2024 21:23:00 +0000</pubDate><atom:updated>2024-12-08T15:23:55.908-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure data partitioning</category><category domain="http://www.blogger.com/atom/ns#">azure sql</category><category domain="http://www.blogger.com/atom/ns#">ms-sql</category><title>Unlocking Scalability in Azure MS-SQL with Data Partitioning</title><description>&lt;p&gt;Partitioning in Azure MS-SQL is crucial for handling large datasets efficiently, ensuring scalability and high performance. This blog post demonstrates practical partitioning strategies with examples and code.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1. &lt;strong&gt;Horizontal Partitioning (Sharding)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Split data by rows across partitions, e.g., using a &lt;code inline=""&gt;TransactionDate&lt;/code&gt; to divide data by year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;:&lt;br /&gt;
Create a partition function and scheme.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;-- Partition Function: Define boundaries
CREATE PARTITION FUNCTION YearPartitionFunction(DATETIME)
AS RANGE LEFT FOR VALUES ('2023-01-01', '2024-01-01', '2025-01-01');

-- Partition Scheme: Map partitions to filegroups
CREATE PARTITION SCHEME YearPartitionScheme
AS PARTITION YearPartitionFunction ALL TO ([PRIMARY]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Table Creation&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;-- Partitioned Table
CREATE TABLE Transactions (
    TransactionID INT NOT NULL,
    TransactionDate DATETIME NOT NULL,
    Amount DECIMAL(10, 2)
) ON YearPartitionScheme(TransactionDate);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Query Example&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;SELECT * FROM Transactions
WHERE TransactionDate &amp;gt;= '2024-01-01' AND TransactionDate &amp;lt; '2025-01-01';
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: Efficient querying of time-based data such as logs or financial transactions.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. &lt;strong&gt;Vertical Partitioning&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Split data by columns to isolate sensitive fields like credentials.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;-- Public Table
CREATE TABLE UserProfile (
    UserID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Email NVARCHAR(100)
);

-- Sensitive Table
CREATE TABLE UserCredentials (
    UserID INT PRIMARY KEY,
    PasswordHash VARBINARY(MAX),
    LastLogin DATETIME
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: Store sensitive data in encrypted filegroups or separate schemas.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3. &lt;strong&gt;Functional Partitioning&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Partition based on business functions, e.g., separating user profiles from transactions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;-- Profiles Table
CREATE TABLE UserProfiles (
    UserID INT PRIMARY KEY,
    FullName NVARCHAR(100),
    Email NVARCHAR(100)
);

-- Transactions Table
CREATE TABLE UserTransactions (
    TransactionID INT PRIMARY KEY,
    UserID INT,
    Amount DECIMAL(10, 2),
    Date DATETIME,
    FOREIGN KEY (UserID) REFERENCES UserProfiles(UserID)
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Query Example&lt;/strong&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;SELECT u.FullName, t.Amount, t.Date
FROM UserProfiles u
JOIN UserTransactions t ON u.UserID = t.UserID
WHERE t.Amount &amp;gt; 1000;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Case&lt;/strong&gt;: Isolate workloads by business function to improve modularity and performance.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Best Practices&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Partition Key&lt;/strong&gt;: Choose keys that balance data distribution, e.g., &lt;code inline=""&gt;TransactionDate&lt;/code&gt; for horizontal partitioning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;: Use Azure Monitor to analyze query patterns and partition usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;: Periodically archive or merge partitions to manage storage costs.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Azure MS-SQL’s partitioning features enhance scalability by enabling logical data segmentation. With thoughtful design and practical implementation, you can optimize application performance while keeping costs under control.&lt;/p&gt;
&lt;p&gt;What partitioning strategy are you planning to implement? Share your thoughts in the comments!&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/12/unlocking-scalability-in-azure-ms-sql.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-4387865606446911578</guid><pubDate>Sat, 07 Dec 2024 22:17:00 +0000</pubDate><atom:updated>2024-12-07T16:17:09.959-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure stream analytics</category><category domain="http://www.blogger.com/atom/ns#">windowing functions</category><title>Types of Azure Stream Analytics windowing functions - Tumbling, Hopping, Sliding, Session and Snapshot window</title><description>&lt;p&gt;Examples of each type of window in Azure Stream Analytics:&lt;/p&gt;&lt;h3&gt;Tumbling Window&lt;/h3&gt;&lt;p&gt;A tumbling window is a series of non-overlapping, fixed-sized, contiguous time intervals. For example, you can count the number of events in each 10-second interval:&lt;/p&gt;&lt;div class="rounded-xl dark:border dark:border-stroke-250" style="opacity: 1; will-change: opacity;"&gt;&lt;div&gt;sql&lt;/div&gt;&lt;div class="rounded-b-xl bg-background-static-850 px-4 pb-1.5 dark:bg-background-static-900"&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SELECT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;System.Timestamp() &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;AS&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;WindowEnd, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TollId, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;COUNT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;*&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;) 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;FROM&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;Input 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TIMESTAMP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;EntryTime 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;GROUP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TollId, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TumblingWindow(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;second&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;, &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;10&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Hopping Window&lt;/h3&gt;&lt;p&gt;A hopping window is similar to a tumbling window but allows overlapping intervals. For example, you can count the number of events every 5 seconds within a 10-second window:&lt;/p&gt;&lt;div class="rounded-xl dark:border dark:border-stroke-250" style="opacity: 1; will-change: opacity;"&gt;&lt;div&gt;sql&lt;/div&gt;&lt;div class="rounded-b-xl bg-background-static-850 px-4 pb-1.5 dark:bg-background-static-900"&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SELECT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;System.Timestamp() &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;AS&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;WindowEnd, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TollId, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;COUNT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;*&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;) 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;FROM&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;Input 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TIMESTAMP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;EntryTime 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;GROUP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TollId, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;HoppingWindow(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;second&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;, &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;10&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;, &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;5&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Sliding Window&lt;/h3&gt;&lt;p&gt;A sliding window moves forward by a specified interval and includes all events within that window. For example, you can calculate the average temperature over the last 30 seconds, updated every 5 seconds:&lt;/p&gt;&lt;div class="rounded-xl dark:border dark:border-stroke-250" style="opacity: 1; will-change: opacity;"&gt;&lt;div&gt;sql&lt;/div&gt;&lt;div class="rounded-b-xl bg-background-static-850 px-4 pb-1.5 dark:bg-background-static-900"&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SELECT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;System.Timestamp() &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;AS&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;WindowEnd, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;AVG&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;(Temperature) 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;FROM&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;Input 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TIMESTAMP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;EntryTime 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;GROUP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SlidingWindow(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;second&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;, &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;30&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;, &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;5&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Session Window&lt;/h3&gt;&lt;p&gt;A session window groups events that are close in time, based on a specified gap duration. For example, you can count the number of events in sessions where events are no more than 30 seconds apart:&lt;/p&gt;&lt;div class="rounded-xl dark:border dark:border-stroke-250" style="opacity: 1; will-change: opacity;"&gt;&lt;div&gt;sql&lt;/div&gt;&lt;div class="rounded-b-xl bg-background-static-850 px-4 pb-1.5 dark:bg-background-static-900"&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SELECT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;System.Timestamp() &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;AS&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;WindowEnd, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;COUNT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;*&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;) 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;FROM&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;Input 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TIMESTAMP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;EntryTime 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;GROUP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SessionWindow(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;second&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;, &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;30&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3&gt;Snapshot Window&lt;/h3&gt;&lt;p&gt;A snapshot window captures the state of the stream at a specific point in time. For example, you can take a snapshot of the current state of a stream every minute:&lt;/p&gt;&lt;div class="rounded-xl dark:border dark:border-stroke-250" style="opacity: 1; will-change: opacity;"&gt;&lt;div&gt;sql&lt;/div&gt;&lt;div class="rounded-b-xl bg-background-static-850 px-4 pb-1.5 dark:bg-background-static-900"&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SELECT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;System.Timestamp() &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;AS&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SnapshotTime, 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;COUNT&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;*&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;) 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;FROM&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;Input 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;TIMESTAMP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;EntryTime 
&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;GROUP&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;BY&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt; 
    &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;SnapshotWindow(&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;second&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;, &lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;60&lt;/span&gt;&lt;span animate="end" custom="0" initial="start" variants="[object Object]"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://www.sharepointfix.com/2024/12/types-of-azure-stream-analytics.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-8343308628427333912</guid><pubDate>Sat, 07 Dec 2024 20:40:00 +0000</pubDate><atom:updated>2024-12-07T14:40:18.016-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure snapyse</category><category domain="http://www.blogger.com/atom/ns#">polybase</category><title>Azure Synapse Analytics and PolyBase: Transforming Enterprise Data Integration and Analytics</title><description>&lt;h1 class="font-600 text-2xl font-bold" level="1"&gt;Introduction&lt;/h1&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;In the rapidly evolving landscape of big data, organizations are constantly seeking innovative solutions to manage, integrate, and derive insights from complex data ecosystems. Azure Synapse Analytics, coupled with PolyBase technology, emerges as a game-changing platform that revolutionizes how businesses approach data warehousing and analytics.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Understanding PolyBase: The Technical Core of Modern Data Integration&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;PolyBase is more than just a technology – it's a paradigm shift in data management. At its core, PolyBase enables seamless querying and integration of data across multiple sources without the traditional overhead of complex ETL (Extract, Transform, Load) processes.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Key Capabilities&lt;/h3&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Unified Data Access&lt;/strong&gt;: Query data from multiple sources in real-time&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Heterogeneous Data Integration&lt;/strong&gt;: Connect structured and unstructured data&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Performance Optimization&lt;/strong&gt;: Minimize data movement and computational overhead&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Real-World Implementation: Global E-Commerce Analytics Use Case&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Scenario: Comprehensive Data Landscape&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Imagine a global e-commerce platform with a complex data infrastructure:&lt;/p&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Sales data in Azure SQL Database&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Customer interactions in Azure Blob Storage&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Inventory information in on-premises SQL Server&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Social media sentiment data in Azure Data Lake Storage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Technical Implementation Walkthrough&lt;/h3&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Step 1: Prerequisite Configuration&lt;/h2&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;sql&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-sql" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Enable PolyBase feature&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;EXEC&lt;/span&gt; sp_configure &lt;span class="token" style="color: #98c379;"&gt;'polybase enabled'&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;1&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;RECONFIGURE&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Create Secure Credentials&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;DATABASE&lt;/span&gt; SCOPED CREDENTIAL AzureStorageCredential
&lt;span class="token" style="color: #c678dd;"&gt;WITH&lt;/span&gt; 
    &lt;span class="token" style="color: #c678dd;"&gt;IDENTITY&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'storage_account_name'&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    SECRET &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'storage_account_access_key'&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Step 2: Define External Data Sources&lt;/h2&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;sql&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-sql" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Create External Data Source&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; EXTERNAL &lt;span class="token" style="color: #c678dd;"&gt;DATA&lt;/span&gt; SOURCE RetailDataSource
&lt;span class="token" style="color: #c678dd;"&gt;WITH&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;TYPE&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; BLOB_STORAGE&lt;span class="token"&gt;,&lt;/span&gt;
    LOCATION &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'https://mystorageaccount.blob.core.windows.net/retailcontainer'&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    CREDENTIAL &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; AzureStorageCredential
&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Define File Formats&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; EXTERNAL &lt;span class="token" style="color: #c678dd;"&gt;FILE&lt;/span&gt; FORMAT ParquetFileFormat
&lt;span class="token" style="color: #c678dd;"&gt;WITH&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;
    FORMAT_TYPE &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; PARQUET&lt;span class="token"&gt;,&lt;/span&gt;
    DATA_COMPRESSION &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'org.apache.hadoop.io.compress.SnappyCodec'&lt;/span&gt;
&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Step 3: Create External Tables&lt;/h2&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;sql&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-sql" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Sales Transactions External Table&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; EXTERNAL &lt;span class="token" style="color: #c678dd;"&gt;TABLE&lt;/span&gt; dbo&lt;span class="token"&gt;.&lt;/span&gt;SalesTransactions &lt;span class="token"&gt;(&lt;/span&gt;
    TransactionID &lt;span class="token" style="color: #c678dd;"&gt;BIGINT&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    ProductID &lt;span class="token" style="color: #c678dd;"&gt;VARCHAR&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;50&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    CustomerID &lt;span class="token" style="color: #c678dd;"&gt;INT&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    SalesAmount &lt;span class="token" style="color: #c678dd;"&gt;DECIMAL&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;18&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;2&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    TransactionDate DATETIME2
&lt;span class="token"&gt;)&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;WITH&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;
    LOCATION &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'/sales-transactions/'&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    DATA_SOURCE &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; RetailDataSource&lt;span class="token"&gt;,&lt;/span&gt;
    FILE_FORMAT &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; ParquetFileFormat
&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Advanced Analytics and Insights&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Cross-Source Analytics Query&lt;/h3&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;sql&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-sql" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Comprehensive Business Intelligence Query&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;VIEW&lt;/span&gt; dbo&lt;span class="token"&gt;.&lt;/span&gt;SalesPerformanceAnalysis
&lt;span class="token" style="color: #c678dd;"&gt;AS&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;SELECT&lt;/span&gt; 
    cd&lt;span class="token"&gt;.&lt;/span&gt;Region&lt;span class="token"&gt;,&lt;/span&gt;
    cd&lt;span class="token"&gt;.&lt;/span&gt;AgeGroup&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #61afef;"&gt;COUNT&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;st&lt;span class="token"&gt;.&lt;/span&gt;TransactionID&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;AS&lt;/span&gt; TotalTransactions&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #61afef;"&gt;SUM&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;st&lt;span class="token"&gt;.&lt;/span&gt;SalesAmount&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;AS&lt;/span&gt; TotalRevenue&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #61afef;"&gt;AVG&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;st&lt;span class="token"&gt;.&lt;/span&gt;SalesAmount&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;AS&lt;/span&gt; AverageTransactionValue
&lt;span class="token" style="color: #c678dd;"&gt;FROM&lt;/span&gt; 
    dbo&lt;span class="token"&gt;.&lt;/span&gt;SalesTransactions st
&lt;span class="token" style="color: #c678dd;"&gt;JOIN&lt;/span&gt; 
    dbo&lt;span class="token"&gt;.&lt;/span&gt;CustomerDemographics cd &lt;span class="token" style="color: #c678dd;"&gt;ON&lt;/span&gt; st&lt;span class="token"&gt;.&lt;/span&gt;CustomerID &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cd&lt;span class="token"&gt;.&lt;/span&gt;CustomerID
&lt;span class="token" style="color: #c678dd;"&gt;GROUP&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;BY&lt;/span&gt; 
    cd&lt;span class="token"&gt;.&lt;/span&gt;Region&lt;span class="token"&gt;,&lt;/span&gt; 
    cd&lt;span class="token"&gt;.&lt;/span&gt;AgeGroup&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Performance Optimization Strategies&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Key Considerations&lt;/h3&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Implement clustered columnstore indexes&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Leverage partitioning techniques&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Optimize materialized views&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Maintain optimal file sizes (100MB-1GB per file)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Security and Governance&lt;/h2&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;sql&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-sql" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Row-Level Security Implementation&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;FUNCTION&lt;/span&gt; dbo&lt;span class="token"&gt;.&lt;/span&gt;fn_SecurityPredicate&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;@Region&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;VARCHAR&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;50&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;RETURNS&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;TABLE&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;WITH&lt;/span&gt; SCHEMABINDING
&lt;span class="token" style="color: #c678dd;"&gt;AS&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;RETURN&lt;/span&gt; 
    &lt;span class="token" style="color: #c678dd;"&gt;SELECT&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;1&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;AS&lt;/span&gt; fn_securitypredicate_result
    &lt;span class="token" style="color: #c678dd;"&gt;WHERE&lt;/span&gt; 
        DATABASE_PRINCIPAL_ID&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; DATABASE_PRINCIPAL_ID&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;'DataAnalystRole'&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token" style="color: #61afef;"&gt;OR&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;@Region&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;IN&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;'North America'&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'Europe'&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; SECURITY POLICY RegionBasedAccess
&lt;span class="token" style="color: #c678dd;"&gt;ADD&lt;/span&gt; FILTER PREDICATE dbo&lt;span class="token"&gt;.&lt;/span&gt;fn_SecurityPredicate&lt;span class="token"&gt;(&lt;/span&gt;Region&lt;span class="token"&gt;)&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;ON&lt;/span&gt; dbo&lt;span class="token"&gt;.&lt;/span&gt;SalesPerformanceAnalysis&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Business Benefits Realized&lt;/h2&gt;
&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Unified Data Access&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Seamless integration of diverse data sources&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Real-time querying capabilities&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Reduced data redundancy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Performance Enhancement&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Minimal data movement&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Efficient computational processing&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Reduced infrastructure complexity&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Advanced Analytics&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Comprehensive business intelligence&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Machine learning model readiness&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Data-driven decision making&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Architectural Considerations&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Scalability Patterns&lt;/h3&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Horizontal scaling of compute nodes&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Dynamic resource management&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Separation of storage and compute&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Elastic workload handling&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;PolyBase in Azure Synapse Analytics represents a transformative approach to enterprise data management. By breaking down traditional data silos, organizations can unlock unprecedented insights, operational efficiency, and competitive advantage.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;&lt;em&gt;Disclaimer: Implementation specifics may vary based on unique organizational requirements and infrastructure configurations.&lt;/em&gt;&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Recommended Next Steps&lt;/h3&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Assess current data infrastructure&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Design proof-of-concept implementation&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Conduct thorough performance testing&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Develop comprehensive migration strategy&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/12/azure-synapse-analytics-and-polybase.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-446066170838518094</guid><pubDate>Wed, 27 Nov 2024 18:43:00 +0000</pubDate><atom:updated>2024-11-27T12:43:47.201-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">migration</category><category domain="http://www.blogger.com/atom/ns#">sql</category><title>Efficiently Copying Large Datasets in Azure MS-SQL: A Comprehensive Guide</title><description>&lt;p&gt;&lt;span style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px;"&gt;Copying a large dataset from a production table to a development or test table in Azure MS-SQL can be efficiently managed using several methods. &lt;br /&gt;&lt;br /&gt;Here are some recommended approaches:&lt;/span&gt;&lt;/p&gt;&lt;h4 style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 5px 0px;"&gt;1. Using T-SQL&lt;/h4&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;You can use T-SQL to create a copy of your production database. Here’s a basic example:&lt;/p&gt;&lt;pre style="background-color: white; border-bottom-color: var(--colorNeutralStroke1); border-bottom-width: var(--borderRadiusMedium); border-left-color: var(--colorNeutralStroke1); border-left-width: var(--borderRadiusMedium); border-right-color: var(--colorNeutralStroke1); border-right-width: var(--borderRadiusMedium); border-style: solid; border-top-color: var(--colorNeutralStroke1); border-top-width: var(--borderRadiusMedium); color: #242424; font-size: 14px; overflow-wrap: break-word; padding: 10px; text-wrap-mode: wrap;"&gt;&lt;code class="language-sql" style="background-color: var(--colorNeutralBackground1); color: var(--colorNeutralForeground1); overflow-wrap: break-word;"&gt;-- Create a new database as a copy of the production database
CREATE DATABASE DevDB AS COPY OF ProdDB;
&lt;/code&gt;&lt;/pre&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;This command creates a new database&amp;nbsp;&lt;code style="background-color: var(--colorNeutralBackground1); color: var(--colorNeutralForeground1); overflow-wrap: break-word;"&gt;DevDB&lt;/code&gt;&amp;nbsp;as a copy of&amp;nbsp;&lt;code style="background-color: var(--colorNeutralBackground1); color: var(--colorNeutralForeground1); overflow-wrap: break-word;"&gt;ProdDB&lt;/code&gt;. You can then use this new database for development or testing purposes.&lt;/p&gt;&lt;h4 style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 5px 0px;"&gt;2. Using PowerShell&lt;/h4&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;PowerShell scripts can automate the process of copying databases. Here’s a sample script:&lt;/p&gt;&lt;pre style="background-color: white; border-bottom-color: var(--colorNeutralStroke1); border-bottom-width: var(--borderRadiusMedium); border-left-color: var(--colorNeutralStroke1); border-left-width: var(--borderRadiusMedium); border-right-color: var(--colorNeutralStroke1); border-right-width: var(--borderRadiusMedium); border-style: solid; border-top-color: var(--colorNeutralStroke1); border-top-width: var(--borderRadiusMedium); color: #242424; font-size: 14px; overflow-wrap: break-word; padding: 10px; text-wrap-mode: wrap;"&gt;&lt;code class="language-powershell" style="background-color: var(--colorNeutralBackground1); color: var(--colorNeutralForeground1); overflow-wrap: break-word;"&gt;# Remove old copy if it exists
Remove-AzureRmSqlDatabase -ResourceGroupName "ResourceGroupName" -ServerName "ServerName" -DatabaseName "DevDB" -Force

# Create a new copy of the production database
New-AzureRmSqlDatabaseCopy -ResourceGroupName "ResourceGroupName" `
    -ServerName "ServerName" `
    -DatabaseName "ProdDB" `
    -CopyResourceGroupName "ResourceGroupName" `
    -CopyServerName "ServerName" `
    -CopyDatabaseName "DevDB"
&lt;/code&gt;&lt;/pre&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;This script removes any existing development database and creates a new copy from the production database.&lt;/p&gt;&lt;h4 style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 5px 0px;"&gt;3. Using Azure Data Factory&lt;/h4&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;Azure Data Factory (ADF) is a powerful tool for data integration and can handle large datasets efficiently. Here’s a high-level overview of the steps:&lt;/p&gt;&lt;ul style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin-bottom: 10px; margin-left: 0px; margin-top: 10px; padding-left: 0px;"&gt;&lt;li style="list-style-type: disc; margin-left: 20px;"&gt;&lt;span style="font-weight: var(--fontWeightSemibold);"&gt;Create Linked Services&lt;/span&gt;: Set up linked services to connect to your source (production) and destination (development/test) databases.&lt;/li&gt;&lt;li style="list-style-type: disc; margin-left: 20px;"&gt;&lt;span style="font-weight: var(--fontWeightSemibold);"&gt;Create Datasets&lt;/span&gt;: Define datasets for the source and destination tables.&lt;/li&gt;&lt;li style="list-style-type: disc; margin-left: 20px;"&gt;&lt;span style="font-weight: var(--fontWeightSemibold);"&gt;Create a Pipeline&lt;/span&gt;: Use a Copy Data activity within a pipeline to transfer data from the source to the destination.&lt;/li&gt;&lt;li style="list-style-type: disc; margin-left: 20px;"&gt;&lt;span style="font-weight: var(--fontWeightSemibold);"&gt;Configure the Pipeline&lt;/span&gt;: Set up the pipeline to handle large datasets, including configuring parallelism and performance settings.&lt;/li&gt;&lt;/ul&gt;&lt;h4 style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 5px 0px;"&gt;4. Using BCP (Bulk Copy Program)&lt;/h4&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;BCP is a command-line utility that can bulk copy data between an instance of Microsoft SQL Server and a data file. Here’s an example:&lt;/p&gt;&lt;pre style="background-color: white; border-bottom-color: var(--colorNeutralStroke1); border-bottom-width: var(--borderRadiusMedium); border-left-color: var(--colorNeutralStroke1); border-left-width: var(--borderRadiusMedium); border-right-color: var(--colorNeutralStroke1); border-right-width: var(--borderRadiusMedium); border-style: solid; border-top-color: var(--colorNeutralStroke1); border-top-width: var(--borderRadiusMedium); color: #242424; font-size: 14px; overflow-wrap: break-word; padding: 10px; text-wrap-mode: wrap;"&gt;&lt;code class="language-bash" style="background-color: var(--colorNeutralBackground1); color: var(--colorNeutralForeground1); overflow-wrap: break-word;"&gt;# Export data from the production table to a file
bcp ProdDB.dbo.ProdTable out ProdTableData.bcp -c -T -S servername

# Import data from the file to the development table
bcp DevDB.dbo.DevTable in ProdTableData.bcp -c -T -S servername
&lt;/code&gt;&lt;/pre&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;This method is useful for transferring large volumes of data efficiently.&lt;/p&gt;&lt;h4 style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 5px 0px;"&gt;5. Using SQL Server Integration Services (SSIS)&lt;/h4&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;SSIS is another robust option for ETL (Extract, Transform, Load) operations. You can create an SSIS package to handle the data transfer, which can be scheduled and managed through SQL Server Agent.&lt;/p&gt;&lt;p style="background-color: white; color: #242424; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Segoe UI Web (West European)&amp;quot;, -apple-system, BlinkMacSystemFont, Roboto, &amp;quot;Helvetica Neue&amp;quot;, sans-serif; font-size: 14px; margin: 0px 0px 1em; overflow-wrap: break-word;"&gt;Each of these methods has its own advantages depending on your specific requirements and environment. If you need more detailed steps or help with a specific method, feel free to ask!&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/11/efficiently-copying-large-datasets-in.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-6835517028363824648</guid><pubDate>Mon, 18 Nov 2024 20:33:00 +0000</pubDate><atom:updated>2024-11-18T14:33:15.268-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">sql</category><title>Handling Transactions in SQL Server:  Using TRY...CATCH for Transaction Management in SQL Server</title><description>&lt;div&gt;&lt;span style="color: #242424; font-family: arial;"&gt;&lt;span style="font-size: 14px;"&gt;In this blog post, we explore the use of TRY...CATCH blocks in SQL Server to manage transactions effectively. Learn how to handle errors gracefully and ensure data integrity with practical examples and best practices.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Web&amp;quot;, sans-serif; font-size: 14px; white-space-collapse: preserve;"&gt;BEGIN TRY&lt;/span&gt;&lt;/p&gt;&lt;span data-teams="true"&gt;&lt;span style="font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, system-ui, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Web&amp;quot;, sans-serif; font-size: 14px; white-space-collapse: preserve;"&gt;&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; BEGIN TRAN&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; -- Add your SQL DDL/DML statements here&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; COMMIT TRAN&lt;br /&gt;
END TRY&lt;br /&gt;
BEGIN CATCH&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ROLLBACK TRAN&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @ErrorMessage NVARCHAR(4000), @ErrorSeverity INT, @ErrorState INT;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorMessage = ERROR_MESSAGE(),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorSeverity = ERROR_SEVERITY(),&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @ErrorState = ERROR_STATE();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);&lt;br /&gt;
END CATCH&lt;br /&gt;&lt;/p&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;</description><link>http://www.sharepointfix.com/2024/11/handling-transactions-in-sql-server.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-431566889944353223</guid><pubDate>Sat, 16 Nov 2024 01:12:00 +0000</pubDate><atom:updated>2024-11-16T10:14:49.857-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure databricks</category><category domain="http://www.blogger.com/atom/ns#">databricks</category><category domain="http://www.blogger.com/atom/ns#">kobai</category><title>Bridging Enterprise Intelligence: Architecting Modern Data Solutions with Databricks and Kobai Semantic Model</title><description>&lt;h2 style="text-align: left;"&gt;&amp;nbsp;Overview&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;This document outlines a high-level architecture for implementing an enterprise knowledge management system using Databricks for data processing and Kobai Semantic Model for knowledge representation. You can learn more about Kobai Platform here:&amp;nbsp;&lt;a href="https://www.kobai.io/"&gt;https://www.kobai.io/&lt;/a&gt;&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Core Components&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;1. Databricks Platform&lt;/h3&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Delta Lake Storage&lt;/strong&gt;: Provides reliable data storage with ACID properties&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Spark Processing&lt;/strong&gt;: Handles large-scale data processing&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;ML Pipeline&lt;/strong&gt;: Supports machine learning model training and inference&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;2. Kobai Semantic Layer&lt;/h3&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Knowledge Graph&lt;/strong&gt;: Represents relationships between entities&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Semantic Model&lt;/strong&gt;: Defines the business ontology&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Inference Engine&lt;/strong&gt;: Generates new insights from existing data&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;3. Integration Points&lt;/h3&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Data Ingestion&lt;/strong&gt;: Multiple source connectivity&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Processing Pipeline&lt;/strong&gt;: Real-time and batch processing&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;API Layer&lt;/strong&gt;: Standardized access patterns&lt;/li&gt;&lt;/ul&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Use Case: Product Development Intelligence&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Business Context&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;A manufacturing company needs to connect product development data across:&lt;/p&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Research &amp;amp; Development&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Supply Chain&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Customer Feedback&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Market Analysis&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Regulatory Compliance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Implementation Strategy&lt;/h3&gt;
&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Data Collection Phase&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Ingest data from various sources into Databricks&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Apply quality checks and transformations&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Store in Delta Lake format&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Knowledge Processing&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Transform structured data into knowledge graph entities&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Apply semantic models to standardize terminology&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Generate relationships between entities&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Intelligence Layer&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Apply inference rules to discover patterns&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Generate recommendations&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Identify potential issues or opportunities&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Application Integration&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Expose REST APIs for applications&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Provide GraphQL endpoints for flexible queries&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Support real-time notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;High Level Architecture&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEjefRIR-JHZP9Px9eI9ElhjfcY48LXIn1oD40C1m6is_gpb3D--95cOBmJ0GLCA1oLp7eBJbxh35kwGglQwPevxNNqHAZLY4mFHSUMZEqWxwKW7n90bPzwzQyFBm057Bxd7XwzO4qBABAMeSTtQfrYegu2eXdax_dH90MWHAOvGofQ5FcbkSe9RJhioY4g" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="745" data-original-width="469" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEjefRIR-JHZP9Px9eI9ElhjfcY48LXIn1oD40C1m6is_gpb3D--95cOBmJ0GLCA1oLp7eBJbxh35kwGglQwPevxNNqHAZLY4mFHSUMZEqWxwKW7n90bPzwzQyFBm057Bxd7XwzO4qBABAMeSTtQfrYegu2eXdax_dH90MWHAOvGofQ5FcbkSe9RJhioY4g=w252-h400" width="252" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Benefits&lt;/h2&gt;
&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Data Integration&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Single source of truth&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Consistent data quality&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Real-time updates&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Knowledge Discovery&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Automated relationship identification&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Pattern recognition&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Predictive insights&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Business Value&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Faster decision making&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Reduced redundancy&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Improved collaboration&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Data Flow Process Diagram&lt;/h2&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/a/AVvXsEh4vfvTMwowZQYBu9I2kTp001EyFdOAoS8z2CZG8uYTpSuitZyX-C3EjchvbGaPgMS7vufJDLIg2kYee8cEzIkdPPsnD3AISuZEWNCD19dUPd3lcKMDHm2sBuaN5SpUQe1nrS_598ifC0ObGt0XnaEY-4biOLbhlSKvdMSszja7lDja5PgFXiSTHI9MfeM" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img data-original-height="747" data-original-width="735" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEh4vfvTMwowZQYBu9I2kTp001EyFdOAoS8z2CZG8uYTpSuitZyX-C3EjchvbGaPgMS7vufJDLIg2kYee8cEzIkdPPsnD3AISuZEWNCD19dUPd3lcKMDHm2sBuaN5SpUQe1nrS_598ifC0ObGt0XnaEY-4biOLbhlSKvdMSszja7lDja5PgFXiSTHI9MfeM=w393-h400" width="393" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Implementation Phases&lt;/h2&gt;
&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Foundation (Month 1-2)&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Set up Databricks environment&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Configure Delta Lake storage&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Establish basic data pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Knowledge Layer (Month 2-3)&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Deploy Kobai Semantic Model&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Define initial ontologies&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Create base semantic rules&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Integration (Month 3-4)&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Connect data sources&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement processing logic&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Build initial APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Enhancement (Month 4-6)&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Add advanced features&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Optimize performance&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Expand use cases&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Key Metrics&lt;/h2&gt;
&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Technical Metrics&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Data processing latency&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Query response time&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;System availability&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Business Metrics&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Time to insight&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Decision accuracy&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Cost savings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Operational Metrics&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Data quality scores&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Integration success rates&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;API usage patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Success Criteria&lt;/h2&gt;
&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Short Term&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Successful data integration&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Working semantic model&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Basic API functionality&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Medium Term&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Automated insights generation&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Reduced manual data processing&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Improved decision accuracy&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Long Term&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Full enterprise adoption&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Measurable business impact&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Scalable architecture&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Recommendations&lt;/h2&gt;
&lt;ol class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Start Small&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Begin with a focused use case&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Validate the approach&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Scale gradually&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Focus on Quality&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Ensure data accuracy&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Validate semantic models&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Test thoroughly&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Plan for Scale&lt;/strong&gt;
&lt;ul class="-mt-1 [li&amp;gt;&amp;amp;]:mt-2 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Design for growth&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Consider performance early&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Build modular components&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;</description><link>http://www.sharepointfix.com/2024/11/bridging-enterprise-intelligence.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/a/AVvXsEjefRIR-JHZP9Px9eI9ElhjfcY48LXIn1oD40C1m6is_gpb3D--95cOBmJ0GLCA1oLp7eBJbxh35kwGglQwPevxNNqHAZLY4mFHSUMZEqWxwKW7n90bPzwzQyFBm057Bxd7XwzO4qBABAMeSTtQfrYegu2eXdax_dH90MWHAOvGofQ5FcbkSe9RJhioY4g=s72-w252-h400-c" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-5060704517214333192</guid><pubDate>Sun, 13 Oct 2024 23:29:00 +0000</pubDate><atom:updated>2024-10-13T18:48:31.767-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net 8.0</category><category domain="http://www.blogger.com/atom/ns#">best practice</category><category domain="http://www.blogger.com/atom/ns#">c#.net</category><category domain="http://www.blogger.com/atom/ns#">microservices</category><title>Building a Microservices Ecosystem with .NET 8.0: Orders, Products, and Customers</title><description>&lt;div class="border-x-bg-200 border-t-bg-300 border-b-bg-000 absolute h-full w-full border-[1.5rem] blur-[1.5px]"&gt;&lt;/div&gt;&lt;div class="absolute inset-0 flex flex-col overflow-hidden border-0.5 border-border-300 inset-4 rounded-lg shadow-[0_0_6px_rgba(255,255,255,0.25)] transition-all duration-200 ease-out"&gt;&lt;div class="absolute opacity-0 w-0 h-0 overflow-hidden pointer-events-none"&gt;&lt;div class="relative absolute opacity-0 w-0 h-0 overflow-hidden pointer-events-none"&gt;In this comprehensive guide, we'll expand on our previous microservices example to create a more complex ecosystem. We'll build three interconnected microservices using .NET 8.0: Order Service, Product Service, and Customer Service. We'll then demonstrate how these services interact to create a robust e-commerce backend.&lt;/div&gt;&lt;/div&gt;&lt;div class="relative flex w-full flex-1 overflow-x-hidden overflow-y-scroll"&gt;&lt;div class="w-full h-full relative [&amp;amp;_:not(input)::selection]:text-text-200"&gt;&lt;div class="font-claude-message mx-auto w-full max-w-3xl px-4 pb-8 pt-4 leading-[1.65rem] -tracking-[0.015em] md:px-8"&gt;&lt;div class="grid-cols-1 grid gap-2.5 [&amp;amp;_&amp;gt;_*]:min-w-0 space-y-4"&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Table of Contents&lt;/h2&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Introduction&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Architecture Overview&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Setting Up the Microservices&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Implementing the Microservices
&lt;br /&gt;4.1 Product Service
&lt;br /&gt;4.2 Customer Service
&lt;br /&gt;4.3 Order Service&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Inter-Service Communication&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="5"&gt;API Gateway&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="6"&gt;Running the Ecosystem&lt;br /&gt;&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="6"&gt;Microservices Best Practice&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="7"&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;1. Introduction&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Microservices architecture allows us to build complex systems by breaking them down into smaller, manageable services. In this article, we'll create three microservices that work together to manage an e-commerce platform:&lt;/p&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Product Service: Manages product information and inventory&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Customer Service: Handles customer data and authentication&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Order Service: Processes and manages orders&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;We'll use .NET 8.0 to build these services and demonstrate how they can communicate with each other to fulfill business operations.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;2. Architecture Overview&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Here's a high-level overview of our microservices ecosystem:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;[API Gateway]
    |
    |--- [Product Service]
    |
    |--- [Customer Service]
    |
    |--- [Order Service]&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;The API Gateway will route requests to the appropriate service.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Each service will have its own database.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Services will communicate with each other using HTTP/REST.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;3. Setting Up the Microservices&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Let's start by creating three separate projects for our microservices:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;dotnet new webapi -n ProductService
dotnet new webapi -n CustomerService
dotnet new webapi -n OrderService&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;For each project, add the following NuGet packages:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package Microsoft.EntityFrameworkCore.SqlServer
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package AutoMapper.Extensions.Microsoft.DependencyInjection
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package MediatR.Extensions.Microsoft.DependencyInjection
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package Microsoft.Extensions.Http&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;4. Implementing the Microservices&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;4.1 Product Service&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Let's implement the Product Service:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// ProductService/Models/Product.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Guid&lt;/span&gt; Id &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; Name &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;decimal&lt;/span&gt; Price &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; StockQuantity &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// ProductService/Data/ProductDbContext.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductDbContext&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;DbContext&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductDbContext&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;DbContextOptions&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ProductDbContext&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;base&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DbSet&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Product&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Products &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// ProductService/Controllers/ProductsController.cs&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;ApiController&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Route&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"api/[controller]"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductsController&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ControllerBase&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductDbContext&lt;/span&gt; _context&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductsController&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ProductDbContext&lt;/span&gt; context&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; context&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Product&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Guid&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; product &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;product &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; product&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPost&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Product&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreateProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreatedAtAction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;GetProduct&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; id &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; product&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPut&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;UpdateStock&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Guid&lt;/span&gt; id&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; quantity&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; product &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;product &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        product&lt;span class="token"&gt;.&lt;/span&gt;StockQuantity &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; quantity&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NoContent&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;4.2 Customer Service&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's implement the Customer Service:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// CustomerService/Models/Customer.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Customer&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Guid&lt;/span&gt; Id &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; Name &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; Email &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// CustomerService/Data/CustomerDbContext.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;CustomerDbContext&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;DbContext&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CustomerDbContext&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;DbContextOptions&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;CustomerDbContext&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;base&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DbSet&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Customer&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Customers &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// CustomerService/Controllers/CustomersController.cs&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;ApiController&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Route&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"api/[controller]"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;CustomersController&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ControllerBase&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;CustomerDbContext&lt;/span&gt; _context&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CustomersController&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;CustomerDbContext&lt;/span&gt; context&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; context&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Customer&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetCustomer&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Guid&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; customer &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Customers&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;customer &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; customer&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPost&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Customer&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreateCustomer&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Customer&lt;/span&gt; customer&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context&lt;span class="token"&gt;.&lt;/span&gt;Customers&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;customer&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreatedAtAction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;GetCustomer&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; id &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; customer&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; customer&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;4.3 Order Service&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Finally, let's implement the Order Service, which will interact with both Product and Customer services:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// OrderService/Models/Order.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Order&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Guid&lt;/span&gt; Id &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Guid&lt;/span&gt; CustomerId &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;List&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;OrderItem&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Items &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DateTime&lt;/span&gt; OrderDate &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;decimal&lt;/span&gt; TotalAmount &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;OrderItem&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Guid&lt;/span&gt; ProductId &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; Quantity &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;decimal&lt;/span&gt; UnitPrice &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// OrderService/Data/OrderDbContext.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;OrderDbContext&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;DbContext&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;OrderDbContext&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;DbContextOptions&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;OrderDbContext&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;base&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DbSet&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Order&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Orders &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// OrderService/Services/ProductService.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;HttpClient&lt;/span&gt; _httpClient&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductService&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;HttpClient&lt;/span&gt; httpClient&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _httpClient &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; httpClient&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #c678dd;"&gt;bool&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;UpdateStock&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Guid&lt;/span&gt; productId&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; quantity&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; response &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _httpClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;PutAsJsonAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"api/products/&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;productId&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; quantity&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; response&lt;span class="token"&gt;.&lt;/span&gt;IsSuccessStatusCode&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// OrderService/Services/CustomerService.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;CustomerService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;HttpClient&lt;/span&gt; _httpClient&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CustomerService&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;HttpClient&lt;/span&gt; httpClient&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _httpClient &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; httpClient&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #c678dd;"&gt;bool&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CustomerExists&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Guid&lt;/span&gt; customerId&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; response &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _httpClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"api/customers/&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;customerId&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; response&lt;span class="token"&gt;.&lt;/span&gt;IsSuccessStatusCode&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// OrderService/Controllers/OrdersController.cs&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;ApiController&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Route&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"api/[controller]"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;OrdersController&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ControllerBase&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;OrderDbContext&lt;/span&gt; _context&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductService&lt;/span&gt; _productService&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;CustomerService&lt;/span&gt; _customerService&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;OrdersController&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;OrderDbContext&lt;/span&gt; context&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductService&lt;/span&gt; productService&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;CustomerService&lt;/span&gt; customerService&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; context&lt;span class="token"&gt;;&lt;/span&gt;
        _productService &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; productService&lt;span class="token"&gt;;&lt;/span&gt;
        _customerService &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; customerService&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPost&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Order&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreateOrder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Order&lt;/span&gt; order&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Check if customer exists&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;!&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _customerService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CustomerExists&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;order&lt;span class="token"&gt;.&lt;/span&gt;CustomerId&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;BadRequest&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Invalid customer"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Update product stock&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;foreach&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; item &lt;span class="token" style="color: #c678dd;"&gt;in&lt;/span&gt; order&lt;span class="token"&gt;.&lt;/span&gt;Items&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;!&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _productService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;UpdateStock&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;item&lt;span class="token"&gt;.&lt;/span&gt;ProductId&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;-&lt;/span&gt;item&lt;span class="token"&gt;.&lt;/span&gt;Quantity&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;BadRequest&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Failed to update stock for product &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;item&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;ProductId&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        order&lt;span class="token"&gt;.&lt;/span&gt;OrderDate &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; DateTime&lt;span class="token"&gt;.&lt;/span&gt;UtcNow&lt;span class="token"&gt;;&lt;/span&gt;
        _context&lt;span class="token"&gt;.&lt;/span&gt;Orders&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;order&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreatedAtAction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;GetOrder&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; id &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; order&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; order&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Order&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetOrder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Guid&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; order &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Orders&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;order &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; order&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;5. Inter-Service Communication&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;As you can see in the Order Service, we're using &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;HttpClient&lt;/code&gt; to communicate with the Product and Customer services. This is a simple form of inter-service communication. In a production environment, you might want to consider more robust solutions like service discovery, message queues, or event-driven architectures.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;6. API Gateway&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;To simplify client interactions with our microservices, we can implement an API Gateway. Here's a simple example using YARP (Yet Another Reverse Proxy):&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;dotnet new web -n ApiGateway
&lt;span class="token" style="color: #d19a66;"&gt;cd&lt;/span&gt; ApiGateway
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package Microsoft.ReverseProxy&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Then, update the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// ApiGateway/Program.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; builder &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; WebApplication&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CreateBuilder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;args&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddReverseProxy&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LoadFromConfig&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Configuration&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetSection&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"ReverseProxy"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; app &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; builder&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Build&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

app&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;MapReverseProxy&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

app&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Run&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;And add the following to your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;appsettings.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"ReverseProxy"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Routes"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"products"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"ClusterId"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"products"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Match"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
          &lt;span class="token" style="color: #e06c75;"&gt;"Path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/products/{**catch-all}"&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Transforms"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
          &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #e06c75;"&gt;"PathPattern"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"api/products/{**catch-all}"&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;]&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"customers"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"ClusterId"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"customers"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Match"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
          &lt;span class="token" style="color: #e06c75;"&gt;"Path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/customers/{**catch-all}"&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Transforms"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
          &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #e06c75;"&gt;"PathPattern"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"api/customers/{**catch-all}"&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;]&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"orders"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"ClusterId"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"orders"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Match"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
          &lt;span class="token" style="color: #e06c75;"&gt;"Path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/orders/{**catch-all}"&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Transforms"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
          &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #e06c75;"&gt;"PathPattern"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"api/orders/{**catch-all}"&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;]&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Clusters"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"products"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Destinations"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
          &lt;span class="token" style="color: #e06c75;"&gt;"destination1"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"Address"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"https://localhost:5001"&lt;/span&gt;
          &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"customers"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Destinations"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
          &lt;span class="token" style="color: #e06c75;"&gt;"destination1"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"Address"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"https://localhost:5002"&lt;/span&gt;
          &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"orders"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"Destinations"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
          &lt;span class="token" style="color: #e06c75;"&gt;"destination1"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"Address"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"https://localhost:5003"&lt;/span&gt;
          &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
  &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;7. Running the Ecosystem&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;To run our microservices ecosystem:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Start each microservice (Product, Customer, Order) on different ports.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Start the API Gateway.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Use the API Gateway URL to interact with the services.&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;For example, to create an order:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;http&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-http" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;POST https://localhost:5000/orders
&lt;span class="token header header-name" style="color: #c678dd;"&gt;Content-Type&lt;/span&gt;&lt;span class="token header"&gt;:&lt;/span&gt;&lt;span class="token header"&gt; &lt;/span&gt;&lt;span class="token header header-value"&gt;application/json&lt;/span&gt;
&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;&lt;/span&gt;&lt;span class="token application-json"&gt;{&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;  &lt;/span&gt;&lt;span class="token application-json string-property" style="color: #e06c75;"&gt;"customerId"&lt;/span&gt;&lt;span class="token application-json" style="color: #61afef;"&gt;:&lt;/span&gt;&lt;span class="token application-json"&gt; &lt;/span&gt;&lt;span class="token application-json" style="color: #98c379;"&gt;"00000000-0000-0000-0000-000000000001"&lt;/span&gt;&lt;span class="token application-json"&gt;,&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;  &lt;/span&gt;&lt;span class="token application-json string-property" style="color: #e06c75;"&gt;"items"&lt;/span&gt;&lt;span class="token application-json" style="color: #61afef;"&gt;:&lt;/span&gt;&lt;span class="token application-json"&gt; &lt;/span&gt;&lt;span class="token application-json"&gt;[&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;    &lt;/span&gt;&lt;span class="token application-json"&gt;{&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;      &lt;/span&gt;&lt;span class="token application-json string-property" style="color: #e06c75;"&gt;"productId"&lt;/span&gt;&lt;span class="token application-json" style="color: #61afef;"&gt;:&lt;/span&gt;&lt;span class="token application-json"&gt; &lt;/span&gt;&lt;span class="token application-json" style="color: #98c379;"&gt;"00000000-0000-0000-0000-000000000001"&lt;/span&gt;&lt;span class="token application-json"&gt;,&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;      &lt;/span&gt;&lt;span class="token application-json string-property" style="color: #e06c75;"&gt;"quantity"&lt;/span&gt;&lt;span class="token application-json" style="color: #61afef;"&gt;:&lt;/span&gt;&lt;span class="token application-json"&gt; &lt;/span&gt;&lt;span class="token application-json" style="color: #d19a66;"&gt;2&lt;/span&gt;&lt;span class="token application-json"&gt;,&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;      &lt;/span&gt;&lt;span class="token application-json string-property" style="color: #e06c75;"&gt;"unitPrice"&lt;/span&gt;&lt;span class="token application-json" style="color: #61afef;"&gt;:&lt;/span&gt;&lt;span class="token application-json"&gt; &lt;/span&gt;&lt;span class="token application-json" style="color: #d19a66;"&gt;10.99&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;    &lt;/span&gt;&lt;span class="token application-json"&gt;}&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;  &lt;/span&gt;&lt;span class="token application-json"&gt;]&lt;/span&gt;&lt;span class="token application-json"&gt;,&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;  &lt;/span&gt;&lt;span class="token application-json string-property" style="color: #e06c75;"&gt;"totalAmount"&lt;/span&gt;&lt;span class="token application-json" style="color: #61afef;"&gt;:&lt;/span&gt;&lt;span class="token application-json"&gt; &lt;/span&gt;&lt;span class="token application-json" style="color: #d19a66;"&gt;21.98&lt;/span&gt;&lt;span class="token application-json"&gt;
&lt;/span&gt;&lt;span class="token application-json"&gt;&lt;/span&gt;&lt;span class="token application-json"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;This request will:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Check if the customer exists via the Customer Service&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Update the product stock via the Product Service&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Create the order in the Order Service&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;8. Microservices Best Practices&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;When developing a microservices architecture, it's crucial to follow best practices to ensure your system is robust, scalable, and maintainable. Here are some key best practices to consider:&lt;/p&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;8.1 Design Principles&lt;/h3&gt;&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Single Responsibility Principle&lt;/strong&gt;: Each microservice should have a single, well-defined responsibility. In our example, we have separate services for products, customers, and orders.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Database per Service&lt;/strong&gt;: Each microservice should have its own database. This ensures loose coupling and allows each service to choose the most appropriate database technology.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;API First Design&lt;/strong&gt;: Design your service APIs before implementing the services. This helps in clearly defining the service boundaries and interactions.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Stateless Services&lt;/strong&gt;: Design your services to be stateless. This makes them easier to scale horizontally.&lt;/li&gt;
&lt;/ol&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;8.2 Development Practices&lt;/h3&gt;&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0" start="5"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Use of Domain-Driven Design (DDD)&lt;/strong&gt;: Apply DDD principles to model your microservices around business domains.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Continuous Integration and Continuous Deployment (CI/CD)&lt;/strong&gt;: Implement robust CI/CD pipelines for each microservice to automate testing and deployment.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Containerization&lt;/strong&gt;: Use containerization technologies like Docker to ensure consistency across different environments and facilitate easy deployment.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Automated Testing&lt;/strong&gt;: Implement comprehensive unit tests, integration tests, and contract tests for each microservice.&lt;/li&gt;
&lt;/ol&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;8.3 Operational Practices&lt;/h3&gt;&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0" start="9"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Centralized Logging&lt;/strong&gt;: Implement a centralized logging system to aggregate logs from all microservices for easier debugging and monitoring.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Distributed Tracing&lt;/strong&gt;: Use distributed tracing to track requests as they flow through your microservices ecosystem.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Health Checks&lt;/strong&gt;: Implement health check endpoints in each service to facilitate monitoring and auto-healing.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Circuit Breaker Pattern&lt;/strong&gt;: Implement circuit breakers to prevent cascading failures when a service is down.&lt;/li&gt;
&lt;/ol&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;8.4 Communication Practices&lt;/h3&gt;&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0" start="13"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;API Gateway&lt;/strong&gt;: Use an API gateway to handle cross-cutting concerns like authentication, SSL termination, and routing.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Service Discovery&lt;/strong&gt;: Implement service discovery to allow services to find and communicate with each other dynamically.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Event-Driven Architecture&lt;/strong&gt;: Consider using an event-driven architecture for loose coupling and better scalability.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Asynchronous Communication&lt;/strong&gt;: Use asynchronous communication where possible to improve responsiveness and scalability.&lt;/li&gt;
&lt;/ol&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;8.5 Data Management Practices&lt;/h3&gt;&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0" start="17"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Data Consistency&lt;/strong&gt;: Use patterns like Saga for managing data consistency across services in distributed transactions.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;CQRS Pattern&lt;/strong&gt;: Consider using the Command Query Responsibility Segregation (CQRS) pattern for complex domains with different read and write operations.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;API Versioning&lt;/strong&gt;: Version your APIs to allow for backward compatibility as services evolve.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Data Backup and Recovery&lt;/strong&gt;: Implement robust data backup and recovery processes for each service's database.&lt;/li&gt;
&lt;/ol&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Implementation Example: Health Checks&lt;/h3&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Let's implement health checks in our services as an example of applying these best practices. We'll add health checks to the Order Service:&lt;/p&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// OrderService/Program.cs&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; builder &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; WebApplication&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CreateBuilder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;args&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// ... other configurations ...&lt;/span&gt;

builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddHealthChecks&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;AddDbContextCheck&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;OrderDbContext&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddUrlGroup&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;Uri&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"https://localhost:5001/health"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token named-parameter"&gt;name&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"product-service"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddUrlGroup&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;Uri&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"https://localhost:5002/health"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token named-parameter"&gt;name&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"customer-service"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; app &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; builder&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Build&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// ... other middleware ...&lt;/span&gt;

app&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;MapHealthChecks&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"/health"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

app&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Run&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;This adds a health check endpoint that checks:&lt;/p&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;The Order Service's database connection&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;The availability of the Product Service&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;The availability of the Customer Service&lt;/li&gt;
&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;You would then add similar health check endpoints to the Product and Customer services.&lt;/p&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;

















&lt;/p&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;By implementing these best practices, you can create a more robust, scalable, and maintainable microservices architecture. Remember, not all practices may be necessary or applicable to every project. Always consider your specific requirements and constraints when deciding which practices to adopt.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;9. Conclusion&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;In this article, we've created a microservices ecosystem using .NET 8.0, demonstrating how different services can work together to create a complex e-commerce backend. We've covered:&lt;/p&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;&lt;li class="whitespace-normal break-words" index="0"&gt;Creating individual microservices for Products, Customers, and Orders&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="1"&gt;Implementing inter-service communication&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="2"&gt;Setting up an API Gateway to simplify client interactions&lt;/li&gt;&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;This architecture allows for independent scaling and deployment of services, making it easier to manage and evolve complex systems over time.&lt;/p&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Remember, this is a simplified example. In a production environment, you'd need to consider additional factors such as:&lt;/p&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;&lt;li class="whitespace-normal break-words" index="0"&gt;Authentication and authorization&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="1"&gt;Resilience patterns (e.g., Circuit Breaker, Retry)&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="2"&gt;Monitoring and logging&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="3"&gt;Data consistency across services&lt;/li&gt;&lt;li class="whitespace-normal break-words" index="4"&gt;Testing strategies for microservices&lt;/li&gt;&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;As you continue to develop your microservices architecture, keep these considerations in mind to build a robust, scalable, and maintainable system.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;In addition to the basic implementation, we've now covered key best practices for developing microservices. By following these practices, you can create a more robust, scalable, and maintainable microservices architecture. Remember to continuously evaluate and refine your approach as your system grows and evolves.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://www.sharepointfix.com/2024/10/building-microservices-ecosystem-with.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-2831970953781267452</guid><pubDate>Sat, 12 Oct 2024 14:47:00 +0000</pubDate><atom:updated>2024-10-12T09:55:26.144-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net 8.0</category><category domain="http://www.blogger.com/atom/ns#">.net 9.0</category><category domain="http://www.blogger.com/atom/ns#">.net core</category><category domain="http://www.blogger.com/atom/ns#">caching</category><category domain="http://www.blogger.com/atom/ns#">redis cache</category><title>Implementing the Cache-Aside Pattern in .NET 8.0 APIs with Entity Framework Core using Redis Cache</title><description>&lt;h2 style="text-align: left;"&gt;Introduction&lt;/h2&gt;&lt;div class="absolute inset-0 flex flex-col overflow-hidden border-0.5 border-border-300 inset-4 rounded-lg shadow-[0_0_6px_rgba(255,255,255,0.25)] transition-all duration-200 ease-out"&gt;&lt;div class="relative flex w-full flex-1 overflow-x-hidden overflow-y-scroll"&gt;&lt;div class="w-full h-full relative [&amp;amp;_:not(input)::selection]:text-text-200"&gt;&lt;div class="font-claude-message mx-auto w-full max-w-3xl px-4 pb-8 pt-4 leading-[1.65rem] -tracking-[0.015em] md:px-8"&gt;&lt;div class="grid-cols-1 grid gap-2.5 [&amp;amp;_&amp;gt;_*]:min-w-0 space-y-4"&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;In this blog post, we'll explore how to implement the Cache-Aside pattern in a .NET 8.0 API using Entity Framework Core. We'll focus on a real-world scenario: an online transaction processing system for an e-commerce platform. By the end of this post, you'll understand how to effectively use caching to improve your API's performance and reduce database load.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;What is the Cache-Aside Pattern?&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;The Cache-Aside pattern is a caching strategy where the application is responsible for maintaining the cache. When data is requested, the application first checks the cache. If the data is not found (a cache miss), it retrieves the data from the database, stores it in the cache, and then returns it to the caller.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Our Scenario: E-commerce Order Processing&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;We'll build an API for an e-commerce platform that handles order processing. Our focus will be on the following operations:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Retrieving product details&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Placing an order&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Retrieving order status&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Setting Up the Project&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;First, let's set up our .NET 8.0 API project with Entity Framework Core.&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;dotnet new webapi -n ECommerceApi
&lt;span class="token" style="color: #d19a66;"&gt;cd&lt;/span&gt; ECommerceApi
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package Microsoft.EntityFrameworkCore.SqlServer
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package Microsoft.Extensions.Caching.StackExchangeRedis&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Implementing the Data Models&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Let's create our data models for products and orders.&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; Id &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; Name &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;decimal&lt;/span&gt; Price &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; StockQuantity &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Order&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; Id &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; CustomerEmail &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DateTime&lt;/span&gt; OrderDate &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;decimal&lt;/span&gt; TotalAmount &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; Status &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;List&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;OrderItem&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Items &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;OrderItem&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; Id &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; ProductId &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; Quantity &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;decimal&lt;/span&gt; UnitPrice &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Setting Up Entity Framework Core&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's set up our DbContext and configure Entity Framework Core.&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ECommerceContext&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;DbContext&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ECommerceContext&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;DbContextOptions&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ECommerceContext&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;base&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DbSet&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Product&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Products &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DbSet&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Order&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Orders &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DbSet&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;OrderItem&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; OrderItems &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;protected&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;override&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;void&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;OnModelCreating&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ModelBuilder&lt;/span&gt; modelBuilder&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Configure your entity relationships and constraints here&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Add the following to your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;AddDbContext&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;ECommerceContext&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;UseSqlServer&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Configuration&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetConnectionString&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Implementing the Cache-Aside Pattern&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;We'll use Redis as our distributed cache. Add the following to your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddStackExchangeRedisCache&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;Configuration &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; builder&lt;span class="token"&gt;.&lt;/span&gt;Configuration&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetConnectionString&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"RedisConnection"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;InstanceName &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ECommerceCache_"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's create a caching service that implements the Cache-Aside pattern:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;interface&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token generic-method" style="color: #61afef;"&gt;GetOrSetAsync&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Func&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; getItemCallback&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;TimeSpan&lt;/span&gt; expirationTime&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;RedisCacheService&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;IDistributedCache&lt;/span&gt; _cache&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;RedisCacheService&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RedisCacheService&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;IDistributedCache&lt;/span&gt; cache&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;RedisCacheService&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _cache &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cache&lt;span class="token"&gt;;&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token generic-method" style="color: #61afef;"&gt;GetOrSetAsync&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Func&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; getItemCallback&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;TimeSpan&lt;/span&gt; expirationTime&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cachedResult &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetStringAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;cachedResult &lt;span class="token" style="color: #61afef;"&gt;!=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Cache hit for key: {Key}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;Deserialize&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cachedResult&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Cache miss for key: {Key}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; result &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;getItemCallback&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SetStringAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;,&lt;/span&gt; JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Serialize&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;result&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;DistributedCacheEntryOptions&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            AbsoluteExpirationRelativeToNow &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; expirationTime
        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; result&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Removed cache for key: {Key}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Register the cache service in &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;AddSingleton&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;&lt;span class="token generic-method generic"&gt;,&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt; RedisCacheService&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Implementing the API Endpoints&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's implement our API endpoints using the Cache-Aside pattern.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Product Controller&lt;/h3&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;ApiController&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Route&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"api/[controller]"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductsController&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ControllerBase&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ECommerceContext&lt;/span&gt; _context&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; _cacheService&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ProductsController&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductsController&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ECommerceContext&lt;/span&gt; context&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; cacheService&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ProductsController&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; context&lt;span class="token"&gt;;&lt;/span&gt;
        _cacheService &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cacheService&lt;span class="token"&gt;;&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Product&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; product &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetOrSetAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cacheKey&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Fetching product {Id} from database"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;10&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;product &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; product&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPost&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Product&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreateProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Invalidate cache for this product&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;product&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreatedAtAction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;GetProduct&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; id &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; product&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPut&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;UpdateProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;id &lt;span class="token" style="color: #61afef;"&gt;!=&lt;/span&gt; product&lt;span class="token"&gt;.&lt;/span&gt;Id&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;BadRequest&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Entry&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;State &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; EntityState&lt;span class="token"&gt;.&lt;/span&gt;Modified&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;try&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Invalidate cache for this product&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;catch&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;DbUpdateConcurrencyException&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;!&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductExists&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;else&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;throw&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NoContent&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #c678dd;"&gt;bool&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductExists&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AnyAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;e &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; e&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Order Controller&lt;/h3&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;ApiController&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Route&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"api/[controller]"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;OrdersController&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ControllerBase&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ECommerceContext&lt;/span&gt; _context&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; _cacheService&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;OrdersController&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;OrdersController&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ECommerceContext&lt;/span&gt; context&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; cacheService&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;OrdersController&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; context&lt;span class="token"&gt;;&lt;/span&gt;
        _cacheService &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cacheService&lt;span class="token"&gt;;&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPost&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Order&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;PlaceOrder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Order&lt;/span&gt; order&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; transaction &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Database&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;BeginTransactionAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;try&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;foreach&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; item &lt;span class="token" style="color: #c678dd;"&gt;in&lt;/span&gt; order&lt;span class="token"&gt;.&lt;/span&gt;Items&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; product &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;item&lt;span class="token"&gt;.&lt;/span&gt;ProductId&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;product &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;||&lt;/span&gt; product&lt;span class="token"&gt;.&lt;/span&gt;StockQuantity &lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt; item&lt;span class="token"&gt;.&lt;/span&gt;Quantity&lt;span class="token"&gt;)&lt;/span&gt;
                &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #c678dd;"&gt;throw&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;InvalidOperationException&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Insufficient stock for product &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;item&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;ProductId&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;

                product&lt;span class="token"&gt;.&lt;/span&gt;StockQuantity &lt;span class="token" style="color: #61afef;"&gt;-=&lt;/span&gt; item&lt;span class="token"&gt;.&lt;/span&gt;Quantity&lt;span class="token"&gt;;&lt;/span&gt;
                _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Entry&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;State &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; EntityState&lt;span class="token"&gt;.&lt;/span&gt;Modified&lt;span class="token"&gt;;&lt;/span&gt;

                &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Invalidate cache for this product&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;item&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;ProductId&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;

            order&lt;span class="token"&gt;.&lt;/span&gt;OrderDate &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; DateTime&lt;span class="token"&gt;.&lt;/span&gt;UtcNow&lt;span class="token"&gt;;&lt;/span&gt;
            order&lt;span class="token"&gt;.&lt;/span&gt;Status &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Pending"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            _context&lt;span class="token"&gt;.&lt;/span&gt;Orders&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;order&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; transaction&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CommitAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreatedAtAction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;GetOrder&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; id &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; order&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; order&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;catch&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Exception&lt;/span&gt; ex&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; transaction&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RollbackAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogError&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;ex&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Error placing order"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;StatusCode&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;500&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"An error occurred while placing the order."&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Order&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetOrder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"order_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; order &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetOrSetAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cacheKey&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Fetching order {Id} from database"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Orders
                    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;o &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; o&lt;span class="token"&gt;.&lt;/span&gt;Items&lt;span class="token"&gt;)&lt;/span&gt;
                    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FirstOrDefaultAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;o &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; o&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;5&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;order &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; order&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPut&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}/status"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;UpdateOrderStatus&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; status&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; order &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Orders&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;order &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        order&lt;span class="token"&gt;.&lt;/span&gt;Status &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; status&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Invalidate cache for this order&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"order_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NoContent&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Performance Considerations&lt;/h2&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Cache Expiration&lt;/strong&gt;: We've set different expiration times for products (10 minutes) and orders (5 minutes). Adjust these based on your specific requirements and data volatility.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Cache Invalidation&lt;/strong&gt;: We invalidate the cache when products are updated or when order statuses change. This ensures that the cached data remains consistent with the database.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Batch Operations&lt;/strong&gt;: For high-volume scenarios, consider implementing batch cache operations to reduce network overhead.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;: Implement proper logging and monitoring to track cache hit/miss ratios and identify potential bottlenecks.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;We've implemented the Cache-Aside pattern in our .NET 8.0 API using Entity Framework Core and Redis. This approach significantly reduces database load for read-heavy operations while ensuring data consistency for write operations.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Key takeaways:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;The Cache-Aside pattern improves performance for frequently accessed, relatively static data.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Proper cache invalidation is crucial to maintain data consistency.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Use distributed caching (like Redis) for scalability in multi-instance deployments.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Adjust cache expiration times based on your data's volatility and consistency requirements.&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;By following these practices, you can build high-performance, scalable APIs that can handle the demands of modern e-commerce platforms.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://www.sharepointfix.com/2024/10/implementing-cache-aside-pattern-in-net.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-4592880193271551670</guid><pubDate>Sat, 12 Oct 2024 14:25:00 +0000</pubDate><atom:updated>2024-10-12T09:26:00.142-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure functions</category><category domain="http://www.blogger.com/atom/ns#">blob storage</category><category domain="http://www.blogger.com/atom/ns#">function app</category><title>Developing an Azure Function Isolated Process with Service Bus Trigger, Batch Processing, and Blob Storage in .NET 8.0</title><description>&lt;p&gt;In this blog post, we'll walk through the process of creating an Azure Function isolated process app using .NET 8.0. Our function will use a Service Bus trigger to process messages in batches and store the results in Azure Blob Storage. This approach is particularly useful for high-volume data processing scenarios where you want to optimize performance and reduce the number of write operations to your storage.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Prerequisites&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Before we begin, make sure you have the following:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;An Azure account with an active subscription&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Azure Functions Core Tools version 4.x&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;.NET 8.0 SDK installed&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Visual Studio Code with the Azure Functions extension&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Azure CLI installed&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 1: Set up Azure Resources&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;First, let's create the necessary Azure resources. You can do this using the Azure portal or Azure CLI. Here's an example using Azure CLI:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Set variables&lt;/span&gt;
&lt;span class="token assign-left" style="color: #61afef;"&gt;resourceGroup&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"myResourceGroup"&lt;/span&gt;
&lt;span class="token assign-left" style="color: #61afef;"&gt;location&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"eastus"&lt;/span&gt;
&lt;span class="token assign-left" style="color: #61afef;"&gt;serviceBusNamespace&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"myServiceBusNamespace"&lt;/span&gt;
&lt;span class="token assign-left" style="color: #61afef;"&gt;serviceBusQueue&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"myQueue"&lt;/span&gt;
&lt;span class="token assign-left" style="color: #61afef;"&gt;storageAccount&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"mystorageaccount"&lt;/span&gt;
&lt;span class="token assign-left" style="color: #61afef;"&gt;functionApp&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"myIsolatedFunctionApp"&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Create Resource Group&lt;/span&gt;
az group create --name &lt;span class="token" style="color: #61afef;"&gt;$resourceGroup&lt;/span&gt; --location &lt;span class="token" style="color: #61afef;"&gt;$location&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Create Service Bus namespace and queue&lt;/span&gt;
az servicebus namespace create --name &lt;span class="token" style="color: #61afef;"&gt;$serviceBusNamespace&lt;/span&gt; --resource-group &lt;span class="token" style="color: #61afef;"&gt;$resourceGroup&lt;/span&gt; --location &lt;span class="token" style="color: #61afef;"&gt;$location&lt;/span&gt;
az servicebus queue create --name &lt;span class="token" style="color: #61afef;"&gt;$serviceBusQueue&lt;/span&gt; --namespace-name &lt;span class="token" style="color: #61afef;"&gt;$serviceBusNamespace&lt;/span&gt; --resource-group &lt;span class="token" style="color: #61afef;"&gt;$resourceGroup&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Create Storage account&lt;/span&gt;
az storage account create --name &lt;span class="token" style="color: #61afef;"&gt;$storageAccount&lt;/span&gt; --resource-group &lt;span class="token" style="color: #61afef;"&gt;$resourceGroup&lt;/span&gt; --location &lt;span class="token" style="color: #61afef;"&gt;$location&lt;/span&gt; --sku Standard_LRS

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Create Function App (Isolated process)&lt;/span&gt;
az functionapp create --name &lt;span class="token" style="color: #61afef;"&gt;$functionApp&lt;/span&gt; --storage-account &lt;span class="token" style="color: #61afef;"&gt;$storageAccount&lt;/span&gt; --consumption-plan-location &lt;span class="token" style="color: #61afef;"&gt;$location&lt;/span&gt; --resource-group &lt;span class="token" style="color: #61afef;"&gt;$resourceGroup&lt;/span&gt; --runtime dotnet-isolated --runtime-version &lt;span class="token" style="color: #d19a66;"&gt;8.0&lt;/span&gt; --functions-version &lt;span class="token" style="color: #d19a66;"&gt;4&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 2: Create the Function App Project&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's create a new Function App project:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Open a terminal and navigate to your desired project directory&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Run the following command to create a new Function App project:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;func init IsolatedServiceBusBatchProcessor --worker-runtime dotnet-isolated --target-framework net8.0
&lt;span class="token" style="color: #d19a66;"&gt;cd&lt;/span&gt; IsolatedServiceBusBatchProcessor&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0" start="3"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Add a new function to the project:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;func new --name ProcessMessages --template &lt;span class="token" style="color: #98c379;"&gt;"Azure Service Bus Queue trigger"&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 3: Update Project File&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Update your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;.csproj&lt;/code&gt; file to include the necessary package references and ensure it's targeting .NET 8.0:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;xml&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-xml" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Project&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Sdk&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.NET.Sdk&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PropertyGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;TargetFramework&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;net8.0&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;TargetFramework&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;AzureFunctionsVersion&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;v4&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;AzureFunctionsVersion&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;OutputType&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;Exe&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;OutputType&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ImplicitUsings&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;enable&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ImplicitUsings&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Nullable&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;enable&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Nullable&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PropertyGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ItemGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;1.20.0&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker.Extensions.ServiceBus&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;5.14.1&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker.Sdk&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;1.16.2&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Azure.Storage.Blobs&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;12.19.1&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ItemGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ItemGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;None&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Update&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;host.json&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;CopyToOutputDirectory&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;PreserveNewest&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;CopyToOutputDirectory&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;None&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;None&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Update&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;local.settings.json&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;CopyToOutputDirectory&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;PreserveNewest&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;CopyToOutputDirectory&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;CopyToPublishDirectory&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;Never&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;CopyToPublishDirectory&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;None&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ItemGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Project&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 4: Implement the Function&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Replace the content of your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;ProcessMessages.cs&lt;/code&gt; file with the following code:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;System&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;System&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Text&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;System&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Threading&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Tasks&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Azure&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Functions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Worker&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Extensions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Logging&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Azure&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Storage&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Blobs&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;namespace&lt;/span&gt; &lt;span class="token"&gt;IsolatedServiceBusBatchProcessor&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProcessMessages&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;BlobServiceClient&lt;/span&gt; _blobServiceClient&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProcessMessages&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ILoggerFactory&lt;/span&gt; loggerFactory&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;BlobServiceClient&lt;/span&gt; blobServiceClient&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; loggerFactory&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;CreateLogger&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;ProcessMessages&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            _blobServiceClient &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; blobServiceClient&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Function&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"ProcessMessages"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Run&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;ServiceBusTrigger&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"myqueue"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; Connection &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"ServiceBusConnection"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; messages&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"ServiceBus queue trigger function processed &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;messages&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Length&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; messages"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; processedMessages &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;List&lt;/span&gt;&lt;span class="token constructor-invocation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token constructor-invocation" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token constructor-invocation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #c678dd;"&gt;foreach&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; message &lt;span class="token" style="color: #c678dd;"&gt;in&lt;/span&gt; messages&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Process the message (in this example, we're just adding a timestamp)&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; processedMessage &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;DateTime&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;UtcNow&lt;/span&gt;&lt;span class="token interpolation-string interpolation format-string"&gt;:&lt;/span&gt;&lt;span class="token interpolation-string interpolation format-string"&gt;yyyy-MM-dd HH:mm:ss&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;: &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;message&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                processedMessages&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;processedMessage&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Combine all processed messages into a single string&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; batchContent &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Join&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;Environment&lt;span class="token"&gt;.&lt;/span&gt;NewLine&lt;span class="token"&gt;,&lt;/span&gt; processedMessages&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Generate a unique file name&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; fileName &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"batch-&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Guid&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;NewGuid&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;)&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;.txt"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Get a reference to the container&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; containerClient &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; _blobServiceClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetBlobContainerClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"processed-messages"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Create the container if it doesn't exist&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; containerClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CreateIfNotExistsAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Get a reference to the blob&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; blobClient &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; containerClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetBlobClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;fileName&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Upload the batch content to the blob&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; ms &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;MemoryStream&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;Encoding&lt;span class="token"&gt;.&lt;/span&gt;UTF8&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetBytes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;batchContent&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; blobClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;UploadAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;ms&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token named-parameter"&gt;overwrite&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;true&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;

            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Batch uploaded to blob storage: &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;fileName&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;This code does the following:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Processes each message in the batch by adding a timestamp.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Combines all processed messages into a single string.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Generates a unique file name for the batch.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Creates a blob container if it doesn't exist.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Uploads the batch content to a new blob in the container.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 5: Configure Dependency Injection&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;In the isolated process model, we need to configure dependency injection in the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt; file. Replace the content of &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt; with the following:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Extensions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Hosting&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Extensions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;DependencyInjection&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Azure&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Storage&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Blobs&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; host &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;HostBuilder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ConfigureFunctionsWorkerDefaults&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ConfigureServices&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;services &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddSingleton&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;sp &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; configuration &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; sp&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;GetRequiredService&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;IConfiguration&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; storageConnectionString &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; configuration&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;BlobServiceClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;storageConnectionString&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Build&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

host&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Run&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;This code adds the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;BlobServiceClient&lt;/code&gt; to the dependency injection container, using the connection string from the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;AzureWebJobsStorage&lt;/code&gt; app setting.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 6: Configure Application Settings&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Make sure your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;local.settings.json&lt;/code&gt; file includes the following settings:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"IsEncrypted"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;false&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"Values"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"YOUR_STORAGE_ACCOUNT_CONNECTION_STRING"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"dotnet-isolated"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"ServiceBusConnection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"YOUR_SERVICE_BUS_CONNECTION_STRING"&lt;/span&gt;
  &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Replace &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;YOUR_STORAGE_ACCOUNT_CONNECTION_STRING&lt;/code&gt; and &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;YOUR_SERVICE_BUS_CONNECTION_STRING&lt;/code&gt; with the actual connection strings for your Azure Storage account and Service Bus namespace.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 7: Test and Deploy&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;You can now test your function locally using the Azure Functions Core Tools:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;func start&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;To deploy your function to Azure, you can use the Azure Functions extension in Visual Studio Code or the Azure CLI:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;func azure functionapp publish &lt;span class="token" style="color: #61afef;"&gt;$functionApp&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;In this blog post, we've created an Azure Function isolated process app using .NET 8.0 that uses a Service Bus trigger to process messages in batches and store the results in Azure Blob Storage. This approach can significantly improve performance for high-volume data processing scenarios by reducing the number of write operations to storage.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Some key takeaways:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;The isolated process model in Azure Functions provides better performance and scalability for .NET applications.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Using batch processing with Service Bus can improve the efficiency of your Azure Functions.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;The &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;BlobServiceClient&lt;/code&gt; provides an easy way to interact with Azure Blob Storage.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Dependency injection in isolated process Azure Functions allows for better separation of concerns and testability.&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Remember to monitor your function's performance and adjust the batch size and other parameters as needed for your specific use case.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Happy coding!&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/10/developing-azure-function-isolated.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-2165746805598565183</guid><pubDate>Thu, 10 Oct 2024 00:50:00 +0000</pubDate><atom:updated>2024-10-09T19:50:29.673-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure databricks</category><category domain="http://www.blogger.com/atom/ns#">ML Flow</category><title>Azure Databricks with ML Flow: A Comprehensive Guide with Real-World Examples</title><description>&lt;h2 style="text-align: left;"&gt;Introduction&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Azure Databricks combines the best of Apache Spark with the Azure cloud platform, providing a powerful collaborative analytics platform for big data processing and machine learning. In this comprehensive guide, we'll explore Azure Databricks through practical, real-world examples that demonstrate its capabilities in data engineering, analytics, and machine learning.&lt;/p&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Table of Contents&lt;/h2&gt;&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Platform Overview&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Setting Up Your Environment&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Real-World Example #1: Data Lake Processing Pipeline&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Real-World Example #2: Real-time Stream Processing&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Real-World Example #3: Machine Learning with MLflow&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="5"&gt;Best Practices and Optimization&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="6"&gt;Security and Governance&lt;/li&gt;
&lt;/ol&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;1. Platform Overview&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Azure Databricks provides:&lt;/p&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Collaborative notebooks&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Managed Apache Spark clusters&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Interactive data exploration&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Built-in MLflow integration&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Delta Lake support&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="5"&gt;Enterprise security features&lt;/li&gt;
&lt;/ul&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;2. Setting Up Your Environment&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;First, let's set up a Databricks workspace and cluster:&lt;/p&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Example cluster configuration in JSON&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;"cluster_name"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"production-etl"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;"spark_version"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"10.4.x-scala2.12"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;"node_type_id"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Standard_DS3_v2"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;"spark_conf"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"spark.speculation"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; true&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"spark.scheduler.mode"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"FAIR"&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;"autoscale"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"min_workers"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;2&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"max_workers"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;8&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;3. Real-World Example #1: Data Lake Processing Pipeline&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Let's build a data processing pipeline that ingests raw sales data from a data lake, transforms it, and prepares it for analytics.&lt;/p&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;from&lt;/span&gt; pyspark&lt;span class="token"&gt;.&lt;/span&gt;sql &lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; SparkSession
&lt;span class="token" style="color: #c678dd;"&gt;from&lt;/span&gt; pyspark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;.&lt;/span&gt;functions &lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;*&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;from&lt;/span&gt; delta&lt;span class="token"&gt;.&lt;/span&gt;tables &lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;*&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Initialize Spark session&lt;/span&gt;
spark &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; SparkSession&lt;span class="token"&gt;.&lt;/span&gt;builder \
    &lt;span class="token"&gt;.&lt;/span&gt;appName&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Sales Data Processing"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;config&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"spark.sql.extensions"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"io.delta.sql.DeltaSparkSessionExtension"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;config&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"spark.sql.catalog.spark_catalog"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"org.apache.spark.sql.delta.catalog.DeltaCatalog"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;getOrCreate&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Read raw data from Azure Data Lake&lt;/span&gt;
raw_sales &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; spark&lt;span class="token"&gt;.&lt;/span&gt;read&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;format&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"parquet"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;load&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"abfss://raw@yourdatalake.dfs.core.windows.net/sales/*.parquet"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Transform data&lt;/span&gt;
processed_sales &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; raw_sales \
    &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"processing_date"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; current_timestamp&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"total_amount"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"quantity"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;*&lt;/span&gt; col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"unit_price"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"year_month"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; date_format&lt;span class="token"&gt;(&lt;/span&gt;col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"sale_date"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"yyyy-MM"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Write to Delta table&lt;/span&gt;
processed_sales&lt;span class="token"&gt;.&lt;/span&gt;write \
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;format&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"delta"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;mode&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"append"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;partitionBy&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"year_month"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;save&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"abfss://processed@yourdatalake.dfs.core.windows.net/sales_delta"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Create database and table&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"CREATE DATABASE IF NOT EXISTS sales"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token triple-quoted-string" style="color: #98c379;"&gt;"""
&lt;/span&gt;    CREATE TABLE IF NOT EXISTS sales.processed_sales
    USING DELTA
    LOCATION 'abfss://processed@yourdatalake.dfs.core.windows.net/sales_delta'
&lt;span class="token triple-quoted-string" style="color: #98c379;"&gt;"""&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Implementing Data Quality Checks&lt;/h3&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;def&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;validate_sales_data&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;df&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt;
    &lt;span class="token triple-quoted-string" style="color: #98c379;"&gt;"""Validate sales data quality"""&lt;/span&gt;
    validation_results &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Check for nulls in critical columns&lt;/span&gt;
    null_checks &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; df&lt;span class="token"&gt;.&lt;/span&gt;select&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;sum&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;col&lt;span class="token"&gt;(&lt;/span&gt;c&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;isNull&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;cast&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"int"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;alias&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token string-interpolation" style="color: #98c379;"&gt;f"&lt;/span&gt;&lt;span class="token string-interpolation interpolation"&gt;{&lt;/span&gt;&lt;span class="token string-interpolation interpolation"&gt;c&lt;/span&gt;&lt;span class="token string-interpolation interpolation"&gt;}&lt;/span&gt;&lt;span class="token string-interpolation" style="color: #98c379;"&gt;_nulls"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;for&lt;/span&gt; c &lt;span class="token" style="color: #c678dd;"&gt;in&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"sale_id"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"product_id"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"sale_date"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"quantity"&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;collect&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;0&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Check for negative quantities&lt;/span&gt;
    negative_quantities &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; df&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;filter&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"quantity"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;0&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;count&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Check for future dates&lt;/span&gt;
    future_dates &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; df&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;filter&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"sale_date"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt; current_date&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;count&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    
    validation_results&lt;span class="token"&gt;.&lt;/span&gt;extend&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;
        &lt;span class="token" style="color: #61afef;"&gt;*&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token"&gt;{&lt;/span&gt;&lt;span class="token string-interpolation" style="color: #98c379;"&gt;f"null_check_&lt;/span&gt;&lt;span class="token string-interpolation interpolation"&gt;{&lt;/span&gt;&lt;span class="token string-interpolation interpolation"&gt;k&lt;/span&gt;&lt;span class="token string-interpolation interpolation"&gt;}&lt;/span&gt;&lt;span class="token string-interpolation" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; v&lt;span class="token"&gt;}&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;for&lt;/span&gt; k&lt;span class="token"&gt;,&lt;/span&gt; v &lt;span class="token" style="color: #c678dd;"&gt;in&lt;/span&gt; null_checks&lt;span class="token"&gt;.&lt;/span&gt;asDict&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;items&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"negative_quantities"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; negative_quantities&lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"future_dates"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; future_dates&lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    
    &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; validation_results&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;4. Real-World Example #2: Real-time Stream Processing&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Let's implement a real-time streaming pipeline that processes IoT sensor data:&lt;/p&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;from&lt;/span&gt; pyspark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;.&lt;/span&gt;types &lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;*&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Define schema for IoT data&lt;/span&gt;
schema &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; StructType&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;
    StructField&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"device_id"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; StringType&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;True&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    StructField&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"timestamp"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; TimestampType&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;True&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    StructField&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"temperature"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; DoubleType&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;True&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    StructField&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"humidity"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; DoubleType&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;True&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    StructField&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"pressure"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; DoubleType&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;True&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
&lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Read from Event Hub&lt;/span&gt;
stream_df &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; spark&lt;span class="token"&gt;.&lt;/span&gt;readStream \
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;format&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"eventhubs"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;options&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;**&lt;/span&gt;ehConf&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;load&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Process streaming data&lt;/span&gt;
processed_stream &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; stream_df \
    &lt;span class="token"&gt;.&lt;/span&gt;select&lt;span class="token"&gt;(&lt;/span&gt;
        from_json&lt;span class="token"&gt;(&lt;/span&gt;col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"body"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;cast&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"string"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; schema&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;alias&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"data"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;select&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"data.*"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;withWatermark&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"timestamp"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"1 minute"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;groupBy&lt;span class="token"&gt;(&lt;/span&gt;
        window&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"timestamp"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"5 minutes"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"device_id"&lt;/span&gt;
    &lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;agg&lt;span class="token"&gt;(&lt;/span&gt;
        avg&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"temperature"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;alias&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"avg_temperature"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        avg&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"humidity"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;alias&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"avg_humidity"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        avg&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"pressure"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;alias&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"avg_pressure"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Write stream to Delta table&lt;/span&gt;
query &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; processed_stream&lt;span class="token"&gt;.&lt;/span&gt;writeStream \
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;format&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"delta"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;outputMode&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"append"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;option&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"checkpointLocation"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"abfss://checkpoints@yourdatalake.dfs.core.windows.net/iot_stream"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;start&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"abfss://processed@yourdatalake.dfs.core.windows.net/iot_metrics"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;5. Real-World Example #3: Machine Learning with MLflow&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Let's implement a sales forecasting model using MLflow for tracking:&lt;/p&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; mlflow
&lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; mlflow&lt;span class="token"&gt;.&lt;/span&gt;sklearn
&lt;span class="token" style="color: #c678dd;"&gt;from&lt;/span&gt; sklearn&lt;span class="token"&gt;.&lt;/span&gt;ensemble &lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; RandomForestRegressor
&lt;span class="token" style="color: #c678dd;"&gt;from&lt;/span&gt; sklearn&lt;span class="token"&gt;.&lt;/span&gt;metrics &lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; mean_squared_error&lt;span class="token"&gt;,&lt;/span&gt; r2_score

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Enable MLflow tracking&lt;/span&gt;
mlflow&lt;span class="token"&gt;.&lt;/span&gt;set_tracking_uri&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"databricks"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
mlflow&lt;span class="token"&gt;.&lt;/span&gt;set_experiment&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"/Users/your-email/sales-forecasting"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Prepare features&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;def&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;prepare_features&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;df&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; df \
        &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"day_of_week"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; dayofweek&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"sale_date"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
        &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"month"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; month&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"sale_date"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
        &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"year"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; year&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"sale_date"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Train model with MLflow tracking&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;with&lt;/span&gt; mlflow&lt;span class="token"&gt;.&lt;/span&gt;start_run&lt;span class="token"&gt;(&lt;/span&gt;run_name&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"rf_sales_forecast"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt;
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Log parameters&lt;/span&gt;
    params &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"n_estimators"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;100&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"max_depth"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;10&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"min_samples_split"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;2&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
    mlflow&lt;span class="token"&gt;.&lt;/span&gt;log_params&lt;span class="token"&gt;(&lt;/span&gt;params&lt;span class="token"&gt;)&lt;/span&gt;
    
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Train model&lt;/span&gt;
    rf &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; RandomForestRegressor&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;**&lt;/span&gt;params&lt;span class="token"&gt;)&lt;/span&gt;
    rf&lt;span class="token"&gt;.&lt;/span&gt;fit&lt;span class="token"&gt;(&lt;/span&gt;X_train&lt;span class="token"&gt;,&lt;/span&gt; y_train&lt;span class="token"&gt;)&lt;/span&gt;
    
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Make predictions&lt;/span&gt;
    predictions &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; rf&lt;span class="token"&gt;.&lt;/span&gt;predict&lt;span class="token"&gt;(&lt;/span&gt;X_test&lt;span class="token"&gt;)&lt;/span&gt;
    
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Log metrics&lt;/span&gt;
    mse &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; mean_squared_error&lt;span class="token"&gt;(&lt;/span&gt;y_test&lt;span class="token"&gt;,&lt;/span&gt; predictions&lt;span class="token"&gt;)&lt;/span&gt;
    r2 &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; r2_score&lt;span class="token"&gt;(&lt;/span&gt;y_test&lt;span class="token"&gt;,&lt;/span&gt; predictions&lt;span class="token"&gt;)&lt;/span&gt;
    mlflow&lt;span class="token"&gt;.&lt;/span&gt;log_metrics&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"mse"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; mse&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #98c379;"&gt;"r2"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; r2
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    
    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Log model&lt;/span&gt;
    mlflow&lt;span class="token"&gt;.&lt;/span&gt;sklearn&lt;span class="token"&gt;.&lt;/span&gt;log_model&lt;span class="token"&gt;(&lt;/span&gt;rf&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"model"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;6. Best Practices and Optimization&lt;/h2&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Cluster Configuration&lt;/h3&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Example of optimized Spark configuration&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;conf&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"spark.sql.shuffle.partitions"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"200"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;conf&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"spark.default.parallelism"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"100"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;conf&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"spark.sql.broadcastTimeout"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"600"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Memory optimization&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;conf&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"spark.memory.fraction"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"0.8"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;conf&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"spark.memory.storageFraction"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"0.3"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Delta Lake Optimization&lt;/h3&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Optimize table&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"OPTIMIZE sales.processed_sales"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Z-ORDER by frequently filtered columns&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"OPTIMIZE sales.processed_sales ZORDER BY (sale_date, product_id)"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Vacuum old files&lt;/span&gt;
spark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"VACUUM sales.processed_sales RETAIN 168 HOURS"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;7. Security and Governance&lt;/h2&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Implementing Column-Level Encryption&lt;/h3&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;python&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-python" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;from&lt;/span&gt; pyspark&lt;span class="token"&gt;.&lt;/span&gt;sql&lt;span class="token"&gt;.&lt;/span&gt;functions &lt;span class="token" style="color: #c678dd;"&gt;import&lt;/span&gt; encrypt&lt;span class="token"&gt;,&lt;/span&gt; decrypt

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Define encryption key&lt;/span&gt;
encryption_key &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; dbutils&lt;span class="token"&gt;.&lt;/span&gt;secrets&lt;span class="token"&gt;.&lt;/span&gt;get&lt;span class="token"&gt;(&lt;/span&gt;scope&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"sales-security"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; key&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"encryption-key"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;# Encrypt sensitive columns&lt;/span&gt;
encrypted_sales &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; sales_df \
    &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"encrypted_customer_id"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; encrypt&lt;span class="token"&gt;(&lt;/span&gt;col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"customer_id"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; lit&lt;span class="token"&gt;(&lt;/span&gt;encryption_key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; \
    &lt;span class="token"&gt;.&lt;/span&gt;withColumn&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"encrypted_email"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; encrypt&lt;span class="token"&gt;(&lt;/span&gt;col&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"email"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; lit&lt;span class="token"&gt;(&lt;/span&gt;encryption_key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Setting Up Table ACLs&lt;/h3&gt;&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;sql&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-sql" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Grant specific permissions&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;GRANT&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;SELECT&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;ON&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;TABLE&lt;/span&gt; sales&lt;span class="token"&gt;.&lt;/span&gt;processed_sales &lt;span class="token" style="color: #c678dd;"&gt;TO&lt;/span&gt; &lt;span class="token identifier"&gt;`&lt;/span&gt;&lt;span class="token identifier"&gt;analysts&lt;/span&gt;&lt;span class="token identifier"&gt;`&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;GRANT&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;MODIFY&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;ON&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;TABLE&lt;/span&gt; sales&lt;span class="token"&gt;.&lt;/span&gt;processed_sales &lt;span class="token" style="color: #c678dd;"&gt;TO&lt;/span&gt; &lt;span class="token identifier"&gt;`&lt;/span&gt;&lt;span class="token identifier"&gt;data_engineers&lt;/span&gt;&lt;span class="token identifier"&gt;`&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;-- Set row-level security&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;ALTER&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;TABLE&lt;/span&gt; sales&lt;span class="token"&gt;.&lt;/span&gt;processed_sales 
&lt;span class="token" style="color: #c678dd;"&gt;SET&lt;/span&gt; TBLPROPERTIES &lt;span class="token"&gt;(&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;'delta.columnMapping.mode'&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'name'&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;'delta.minReaderVersion'&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'2'&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #98c379;"&gt;'delta.minWriterVersion'&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;'5'&lt;/span&gt;
&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;CREATE&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;ROW&lt;/span&gt; ACCESS POLICY sales_region_policy
&lt;span class="token" style="color: #c678dd;"&gt;AS&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;sale_row STRING&lt;span class="token"&gt;)&lt;/span&gt; 
&lt;span class="token" style="color: #c678dd;"&gt;RETURNS&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;BOOLEAN&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;RETURN&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;current_user&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;IN&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;SELECT&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;user&lt;/span&gt; 
    &lt;span class="token" style="color: #c678dd;"&gt;FROM&lt;/span&gt; sales&lt;span class="token"&gt;.&lt;/span&gt;user_region_mapping 
    &lt;span class="token" style="color: #c678dd;"&gt;WHERE&lt;/span&gt; region &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; sale_row&lt;span class="token"&gt;.&lt;/span&gt;region
&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Best Practices Summary&lt;/h2&gt;&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Data Engineering&lt;/strong&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Use Delta Lake for ACID transactions&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement proper partitioning strategies&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Regular OPTIMIZE and VACUUM operations&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Implement comprehensive data validation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Performance&lt;/strong&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Right-size clusters&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Use auto-scaling&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Optimize shuffle partitions&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Cache frequently accessed data&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;MLOps&lt;/strong&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Track experiments with MLflow&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Version control for notebooks&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Implement model monitoring&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Use MLflow Model Registry&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Security&lt;/strong&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Implement proper access controls&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Encrypt sensitive data&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Use Secrets management&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Regular security audits&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Azure Databricks provides a powerful platform for implementing big data solutions. Through these real-world examples, we've demonstrated how to:&lt;/p&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Process data at scale&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement streaming solutions&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Build and deploy ML models&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Maintain security and governance&lt;/li&gt;
&lt;/ul&gt;&lt;p class="whitespace-pre-wrap break-words"&gt;Remember to:&lt;/p&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Start small and scale gradually&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Monitor performance metrics&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Implement proper testing&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Follow security best practices&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Document your implementations&lt;/li&gt;
&lt;/ul&gt;&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Additional Resources&lt;/h2&gt;&lt;p&gt;







































&lt;/p&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/databricks/"&gt;Azure Databricks Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="https://docs.delta.io/"&gt;Delta Lake Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;a href="https://www.mlflow.org/docs/latest/index.html"&gt;MLflow Documentation&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;&lt;/ul&gt;</description><link>http://www.sharepointfix.com/2024/10/azure-databricks-with-ml-flow.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-5702583672218851442</guid><pubDate>Sat, 05 Oct 2024 21:28:00 +0000</pubDate><atom:updated>2024-10-05T16:28:47.375-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure logic app</category><category domain="http://www.blogger.com/atom/ns#">c#.net</category><category domain="http://www.blogger.com/atom/ns#">dynamics 365</category><category domain="http://www.blogger.com/atom/ns#">sharepoint</category><title>Building Enterprise Integration Solutions with Azure Logic Apps: A Practical Guide</title><description>&lt;h2 style="text-align: left;"&gt;&amp;nbsp;Introduction&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Azure Logic Apps provide a powerful platform for creating and running automated workflows that integrate apps, data, services, and systems. In this comprehensive guide, we'll walk through building a practical enterprise integration scenario using Azure Logic Apps, complete with best practices and real-world considerations.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Scenario Overview&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;We'll build an automated order processing system that:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Monitors a SharePoint list for new orders&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Validates order data&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Creates invoices in Dynamics 365&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Sends approval emails&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Updates order status in SharePoint&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="5"&gt;Generates and stores PDF invoices in Azure Blob Storage&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Prerequisites&lt;/h2&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Azure subscription&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;SharePoint Online site&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Dynamics 365 instance&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Office 365 account&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Azure Storage account&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 1: Creating the Logic App&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;First, let's create a new Logic App using the Azure Portal:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"definition"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"$schema"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"triggers"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"When_a_new_item_is_created"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ApiConnection"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"host"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"connection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@parameters('$connections')['sharepointonline']['connectionId']"&lt;/span&gt;
                        &lt;span class="token"&gt;}&lt;/span&gt;
                    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"method"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"get"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/datasets/@{encodeURIComponent(encodeURIComponent('https://contoso.sharepoint.com/sites/orders'))}/tables/@{encodeURIComponent(encodeURIComponent('Orders'))}/onnewitems"&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 2: Data Validation&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Let's add data validation using a condition and expressions:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Validate_Order_Data"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"If"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"expression"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"and"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
                &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"greater"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
                        &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()?['OrderAmount']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                        &lt;span class="token" style="color: #d19a66;"&gt;0&lt;/span&gt;
                    &lt;span class="token"&gt;]&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"not"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"equals"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
                            &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()?['CustomerEmail']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                            &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;
                        &lt;span class="token"&gt;]&lt;/span&gt;
                    &lt;span class="token"&gt;}&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;]&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"actions"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"Valid_Order"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ApiConnection"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"host"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"connection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@parameters('$connections')['dynamics365']['connectionId']"&lt;/span&gt;
                        &lt;span class="token"&gt;}&lt;/span&gt;
                    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"method"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"post"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/api/data/v9.0/invoices"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()?['OrderNumber']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"customerid"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()?['CustomerId']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"totalamount"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()?['OrderAmount']"&lt;/span&gt;
                    &lt;span class="token"&gt;}&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"else"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"actions"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"Send_Validation_Error_Email"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ApiConnection"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"host"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"connection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                                &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@parameters('$connections')['office365']['connectionId']"&lt;/span&gt;
                            &lt;span class="token"&gt;}&lt;/span&gt;
                        &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"method"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"post"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/v2/Mail"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"To"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()?['CustomerEmail']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"Subject"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Order Validation Failed"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"Body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Your order could not be processed due to validation errors."&lt;/span&gt;
                        &lt;span class="token"&gt;}&lt;/span&gt;
                    &lt;span class="token"&gt;}&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 3: Implementing Approval Flow&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Add an approval process using Office 365 Outlook:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Send_Approval_Email"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ApiConnectionWebhook"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"host"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"connection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@parameters('$connections')['office365']['connectionId']"&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"NotificationUrl"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@{listCallbackUrl()}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"Message"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"To"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"approvers@contoso.com"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"Subject"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"New Order Approval Required - @{triggerBody()?['OrderNumber']}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"Options"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Approve, Reject"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"Body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Please review and approve the order:\n\nOrder Number: @{triggerBody()?['OrderNumber']}\nCustomer: @{triggerBody()?['CustomerName']}\nAmount: @{triggerBody()?['OrderAmount']}"&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 4: Generate and Store PDF Invoice&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Implement PDF generation and storage:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Generate_PDF_Invoice"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Http"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"method"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"POST"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"uri"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"https://api.contoso.com/generateInvoice"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"orderDetails"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"invoiceNumber"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@body('Create_Invoice_in_Dynamics')?['invoicenumber']"&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Store_PDF_in_Blob"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ApiConnection"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"host"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"connection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@parameters('$connections')['azureblob']['connectionId']"&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"method"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"post"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/v2/datasets/@{encodeURIComponent(encodeURIComponent('AccountNameFromSettings'))}/files"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"queries"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"folderPath"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/invoices/@{formatDateTime(utcNow(), 'yyyy-MM')}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@{triggerBody()?['OrderNumber']}_invoice.pdf"&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@body('Generate_PDF_Invoice')"&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Step 5: Update SharePoint Status&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Finally, update the order status in SharePoint:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Update_SharePoint_Status"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ApiConnection"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"host"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"connection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@parameters('$connections')['sharepointonline']['connectionId']"&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"method"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"patch"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"path"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"/datasets/@{encodeURIComponent(encodeURIComponent('https://contoso.sharepoint.com/sites/orders'))}/tables/@{encodeURIComponent(encodeURIComponent('Orders'))}/items/@{triggerBody()?['ID']}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"Status"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Processed"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"InvoiceNumber"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@body('Create_Invoice_in_Dynamics')?['invoicenumber']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"ProcessedDate"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@utcNow()"&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Best Practices for Azure Logic Apps&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;1. Error Handling&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Implement comprehensive error handling:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Try"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"actions"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Your main logic here&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"runAfter"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;&lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"catch"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"if"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"equals"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
                    &lt;span class="token" style="color: #98c379;"&gt;"@result('Generate_PDF_Invoice')['statusCode']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #d19a66;"&gt;429&lt;/span&gt;
                &lt;span class="token"&gt;]&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"then"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"Delay_and_Retry"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Wait"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                        &lt;span class="token" style="color: #e06c75;"&gt;"interval"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"count"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;30&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                            &lt;span class="token" style="color: #e06c75;"&gt;"unit"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Second"&lt;/span&gt;
                        &lt;span class="token"&gt;}&lt;/span&gt;
                    &lt;span class="token"&gt;}&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;2. Monitoring and Logging&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Set up proper monitoring using Azure Application Insights:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"Log_To_App_Insights"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"ApiConnection"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"inputs"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"host"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"connection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@parameters('$connections')['applicationinsights']['connectionId']"&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"method"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"post"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"body"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"OrderProcessing"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"properties"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"OrderNumber"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@triggerBody()?['OrderNumber']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"ProcessingTime"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@workflow()['run']['duration']"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                    &lt;span class="token" style="color: #e06c75;"&gt;"Status"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"@workflow()['run']['status']"&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;3. Security Best Practices&lt;/h3&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Use Managed Identities for connections&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement proper role-based access control (RBAC)&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Secure parameters and connections using Azure Key Vault&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Enable diagnostic logging&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;4. Performance Optimization&lt;/h3&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Use parallel branches for independent operations&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement proper retry policies&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Use pagination for large datasets&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Optimize trigger polling intervals&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Deployment and DevOps&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;ARM Template for Logic App Deployment&lt;/h3&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"$schema"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"contentVersion"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"1.0.0.0"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"parameters"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"logicAppName"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"string"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"minLength"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;1&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"maxLength"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;80&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"resources"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"type"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Microsoft.Logic/workflows"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"apiVersion"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"2019-05-01"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"name"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"[parameters('logicAppName')]"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"location"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"[resourceGroup().location]"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #e06c75;"&gt;"properties"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #e06c75;"&gt;"definition"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
                    &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Your Logic App definition here&lt;/span&gt;
                &lt;span class="token"&gt;}&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Testing and Troubleshooting&lt;/h2&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Use Logic App's built-in run history&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement proper logging at each step&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Use tracking IDs for cross-service correlation&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Set up alerts for failed runs&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Azure Logic Apps provide a powerful platform for implementing enterprise integration solutions. By following the practices outlined in this guide and implementing proper error handling, monitoring, and security measures, you can build robust and scalable integration workflows.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Key takeaways:&lt;/p&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Use proper error handling and retry mechanisms&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement comprehensive monitoring&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Follow security best practices&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Optimize performance where possible&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;Use DevOps practices for deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Remember to regularly review and update your Logic Apps to ensure they continue to meet your business requirements and performance expectations.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Additional Resources&lt;/h2&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/logic-apps/"&gt;Azure Logic Apps Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-best-practices"&gt;Logic Apps Best Practices&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-overview"&gt;Enterprise Integration Patterns&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>http://www.sharepointfix.com/2024/10/building-enterprise-integration.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-2391544713281822190</guid><pubDate>Sat, 05 Oct 2024 18:26:00 +0000</pubDate><atom:updated>2024-10-05T13:26:46.562-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net core</category><category domain="http://www.blogger.com/atom/ns#">azure functions</category><category domain="http://www.blogger.com/atom/ns#">C#</category><title>Building Isolated Process Azure Functions in .NET 8.0: A Comprehensive Guide</title><description>&lt;p&gt;In this comprehensive guide, we'll explore how to build and deploy Azure Functions using the isolated process model in .NET 8.0. We'll cover HTTP triggers, Service Bus integration, Application Insights monitoring, and best practices for production deployments.&lt;/p&gt;&lt;div class="absolute inset-0 flex flex-col overflow-hidden border-0.5 border-border-300 inset-4 rounded-lg shadow-[0_0_6px_rgba(255,255,255,0.25)] transition-all duration-200 ease-out"&gt;&lt;div class="relative flex w-full flex-1 overflow-x-hidden overflow-y-scroll"&gt;&lt;div class="w-full h-full relative [&amp;amp;_:not(input)::selection]:text-text-200"&gt;&lt;div class="font-claude-message mx-auto w-full max-w-3xl px-4 pb-8 pt-4 leading-[1.65rem] -tracking-[0.015em] md:px-8"&gt;&lt;div class="grid-col-1 grid gap-2.5 [&amp;amp;_&amp;gt;_*]:min-w-0 space-y-4"&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Introduction&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Azure Functions isolated process model represents a significant evolution in the Azure Functions runtime, offering better control over dependencies, improved performance, and enhanced security through process isolation. With .NET 8.0, we get access to the latest features while maintaining the serverless benefits that Azure Functions provide.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Prerequisites&lt;/h2&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Visual Studio 2022 (17.8 or later)&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;.NET 8.0 SDK&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Azure subscription&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Azure Functions Core Tools v4.x&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Project Setup&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Let's create a new Azure Functions project using the isolated process model. We'll implement two different trigger types: HTTP and Service Bus.&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;func init IsolatedFunctionApp --worker-runtime dotnet-isolated --target-framework net8.0
&lt;span class="token" style="color: #d19a66;"&gt;cd&lt;/span&gt; IsolatedFunctionApp&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;First, let's set up our project structure and dependencies in the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;.csproj&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;xml&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-xml" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Project&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Sdk&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.NET.Sdk&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PropertyGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;TargetFramework&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;net8.0&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;TargetFramework&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;AzureFunctionsVersion&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;v4&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;AzureFunctionsVersion&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;OutputType&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;Exe&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;OutputType&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ImplicitUsings&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;enable&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ImplicitUsings&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Nullable&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;enable&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Nullable&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PropertyGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ItemGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;1.20.0&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker.Extensions.Http&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;3.1.0&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker.Extensions.ServiceBus&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;5.14.1&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker.Sdk&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;1.16.2&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.ApplicationInsights.WorkerService&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;2.21.0&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PackageReference&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Include&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;Microsoft.Azure.Functions.Worker.ApplicationInsights&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Version&lt;/span&gt;&lt;span class="token"&gt;=&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;1.1.0&lt;/span&gt;&lt;span class="token"&gt;"&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt; &lt;/span&gt;&lt;span class="token"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;ItemGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;Project&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Implementing the Functions&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Let's create two functions: an HTTP-triggered function for API endpoints and a Service Bus-triggered function for message processing.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;HTTP-Triggered Function&lt;/h3&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;System&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Net&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Azure&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Functions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Worker&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Azure&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Functions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Worker&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Http&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Extensions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Logging&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;namespace&lt;/span&gt; &lt;span class="token"&gt;IsolatedFunctionApp&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;HttpTriggerFunction&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;HttpTriggerFunction&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;HttpTriggerFunction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;HttpTriggerFunction&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Function&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"ProcessHttpRequest"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;HttpResponseData&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RunAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
        &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpTrigger&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;.&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;Function&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"get"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"post"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;HttpRequestData&lt;/span&gt; req&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"C# HTTP trigger function processed a request."&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;try&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; response &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; req&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CreateResponse&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;HttpStatusCode&lt;span class="token"&gt;.&lt;/span&gt;OK&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; response&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;WriteAsJsonAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                message &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Success"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
                timestamp &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; DateTime&lt;span class="token"&gt;.&lt;/span&gt;UtcNow
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; response&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;catch&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Exception&lt;/span&gt; ex&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogError&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;ex&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Error processing HTTP request"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; errorResponse &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; req&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CreateResponse&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;HttpStatusCode&lt;span class="token"&gt;.&lt;/span&gt;InternalServerError&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; errorResponse&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;WriteAsJsonAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; error &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"An error occurred processing your request"&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; errorResponse&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Service Bus-Triggered Function&lt;/h3&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Azure&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Functions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Worker&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Extensions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Logging&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;namespace&lt;/span&gt; &lt;span class="token"&gt;IsolatedFunctionApp&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ServiceBusFunction&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ServiceBusFunction&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ServiceBusFunction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ServiceBusFunction&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Function&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"ProcessServiceBusMessage"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RunAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
        &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;ServiceBusTrigger&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"%ServiceBusQueueName%"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; Connection &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"ServiceBusConnection"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; message&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;try&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Processing Service Bus message: {Message}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; message&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            
            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Add your message processing logic here&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProcessMessageAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;message&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Successfully processed message"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;catch&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Exception&lt;/span&gt; ex&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogError&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;ex&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Error processing message: {Message}"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; message&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;throw&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Re-throw to trigger the retry policy&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProcessMessageAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; message&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Simulate some processing&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; Task&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Delay&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;100&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Program.cs Setup with Application Insights&lt;/h2&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Extensions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Hosting&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;using&lt;/span&gt; &lt;span class="token"&gt;Microsoft&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;Extensions&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token"&gt;DependencyInjection&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; host &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;HostBuilder&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ConfigureFunctionsWorkerDefaults&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;worker &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        worker&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;UseMiddleware&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;ExceptionHandlingMiddleware&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ConfigureServices&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;services &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddApplicationInsightsTelemetryWorkerService&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ConfigureFunctionsApplicationInsights&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Build&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; host&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RunAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Custom Middleware for Exception Handling&lt;/h2&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ExceptionHandlingMiddleware&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;IFunctionsWorkerMiddleware&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ExceptionHandlingMiddleware&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ExceptionHandlingMiddleware&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ExceptionHandlingMiddleware&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Invoke&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;FunctionContext&lt;/span&gt; context&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;FunctionExecutionDelegate&lt;/span&gt; next&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;try&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;next&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;context&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;catch&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Exception&lt;/span&gt; ex&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogError&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;ex&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Unhandled exception in function execution"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;throw&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Configuration Setup&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Create a &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;local.settings.json&lt;/code&gt; file for local development:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"IsEncrypted"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;false&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"Values"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"AzureWebJobsStorage"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"UseDevelopmentStorage=true"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"FUNCTIONS_WORKER_RUNTIME"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"dotnet-isolated"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"ServiceBusConnection"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"&amp;lt;your-service-bus-connection-string&amp;gt;"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"ServiceBusQueueName"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"myqueue"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"APPLICATIONINSIGHTS_CONNECTION_STRING"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"&amp;lt;your-app-insights-connection-string&amp;gt;"&lt;/span&gt;
  &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Best Practices for Azure Functions&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;1. Performance Optimization&lt;/h3&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Connection Reuse&lt;/strong&gt;: Implement singleton patterns for client connections (e.g., Service Bus client, HTTP client)&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Proper Scaling Configuration&lt;/strong&gt;: Set appropriate &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;host.json&lt;/code&gt; configurations:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;json&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-json" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;{&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"version"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"2.0"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"logging"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"applicationInsights"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"samplingSettings"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"isEnabled"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;true&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"excludedTypes"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Request"&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
  &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"functionTimeout"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"00:10:00"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
  &lt;span class="token" style="color: #e06c75;"&gt;"extensions"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #e06c75;"&gt;"serviceBus"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"prefetchCount"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;100&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
      &lt;span class="token" style="color: #e06c75;"&gt;"messageHandlerOptions"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"maxConcurrentCalls"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;32&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #e06c75;"&gt;"maxAutoRenewDuration"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"00:05:00"&lt;/span&gt;
      &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
  &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;2. Error Handling and Logging&lt;/h3&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Implement comprehensive error handling with try-catch blocks&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Use structured logging with appropriate log levels&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Include correlation IDs in logs for request tracking&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Configure proper retry policies for transient failures&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;3. Security Best Practices&lt;/h3&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Use Managed Identity where possible&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Store secrets in Azure Key Vault&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Implement proper authorization levels for HTTP triggers&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Use private endpoints for enhanced network security&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;4. Monitoring and Diagnostics&lt;/h3&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Configure Application Insights for comprehensive monitoring&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Set up appropriate alerts for errors and performance issues&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Use proper sampling rates to manage costs&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Implement custom metrics for business-specific monitoring&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;5. Development and Deployment&lt;/h3&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Use Infrastructure as Code (IaC) with Azure Bicep or ARM templates&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Implement proper CI/CD pipelines&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Use staging slots for zero-downtime deployments&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Maintain separate configurations for different environments&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Deployment&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Deploy your function app using Azure CLI:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;az login
az functionapp create --name myisolatedfunctionapp --storage-account mystorageaccount --resource-group myresourcegroup --runtime dotnet-isolated --runtime-version &lt;span class="token" style="color: #d19a66;"&gt;8.0&lt;/span&gt; --functions-version &lt;span class="token" style="color: #d19a66;"&gt;4&lt;/span&gt; --os-type Linux --consumption-plan-location eastus&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Monitoring with Application Insights&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Access your application's telemetry through the Azure Portal:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Navigate to your Function App&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;Click on "Application Insights"&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;Explore metrics, logs, and performance data&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;Set up custom dashboards for monitoring&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Isolated process Azure Functions in .NET 8.0 provide a robust foundation for building serverless applications. By following the best practices outlined in this guide and implementing proper monitoring and error handling, you can build reliable and scalable solutions that leverage the full potential of Azure Functions.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Remember to regularly update dependencies, monitor performance metrics, and adjust configurations based on your specific use cases and requirements.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://www.sharepointfix.com/2024/10/building-isolated-process-azure.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-6900887544423649299</guid><pubDate>Sun, 29 Sep 2024 01:29:00 +0000</pubDate><atom:updated>2024-09-28T20:29:38.030-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net 9.0</category><category domain="http://www.blogger.com/atom/ns#">azure</category><category domain="http://www.blogger.com/atom/ns#">azure functions</category><category domain="http://www.blogger.com/atom/ns#">caching azure app services</category><category domain="http://www.blogger.com/atom/ns#">redis cache</category><title>Caching Strategies for Azure App Services and Azure Function Apps</title><description>&lt;p&gt;&amp;nbsp;When working with Azure cloud services, particularly Azure App Services and Azure Function Apps, implementing effective caching strategies becomes even more crucial for maintaining performance and reducing costs. Let's explore some caching techniques specifically tailored for these Azure services.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Azure App Services&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Azure App Services provide a fully managed platform for building, deploying, and scaling web apps. Here are some caching strategies you can implement:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;In-Memory Caching with IMemoryCache&lt;/strong&gt;
&lt;!-- --&gt;For single-instance App Services, you can use the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;IMemoryCache&lt;/code&gt; as we discussed earlier. However, keep in mind that if your App Service scales out to multiple instances, each instance will have its own separate cache.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Azure Redis Cache&lt;/strong&gt;
&lt;!-- --&gt;For multi-instance scenarios, Azure Redis Cache is an excellent choice. It provides a distributed caching layer that can be shared across multiple App Service instances.&lt;!-- --&gt;
&lt;!-- --&gt;To use Azure Redis Cache:&lt;!-- --&gt;
&lt;!-- --&gt;a. Create an Azure Redis Cache instance in your Azure portal.&lt;!-- --&gt;
&lt;!-- --&gt;b. Add the following NuGet packages to your project:&lt;!-- --&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;Microsoft.Extensions.Caching.StackExchangeRedis&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;!-- --&gt;c. Configure Redis in your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;!-- --&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddStackExchangeRedisCache&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;Configuration &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; builder&lt;span class="token"&gt;.&lt;/span&gt;Configuration&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetConnectionString&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"RedisConnection"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;InstanceName &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"YourAppPrefix"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;!-- --&gt;d. Use the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;IDistributedCache&lt;/code&gt; interface in your controllers or services as shown in the distributed caching example earlier.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Azure Blob Storage for Large Objects&lt;/strong&gt;
&lt;!-- --&gt;For caching large objects that don't fit well in Redis, you can use Azure Blob Storage:&lt;!-- --&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;BlobStorageCacheService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;BlobServiceClient&lt;/span&gt; _blobServiceClient&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; _containerName&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;BlobStorageCacheService&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; connectionString&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; containerName&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _blobServiceClient &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;BlobServiceClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;connectionString&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        _containerName &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; containerName&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;SetAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;byte&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; data&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;TimeSpan&lt;/span&gt; expiration&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; container &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; _blobServiceClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetBlobContainerClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;_containerName&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; container&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;CreateIfNotExistsAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; blob &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; container&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetBlobClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; blob&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;UploadAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;BinaryData&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;data&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token named-parameter"&gt;overwrite&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;true&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; headers &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;BlobHttpHeaders&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; CacheControl &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"max-age=&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;expiration&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;TotalSeconds&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; blob&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SetHttpHeadersAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;headers&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #c678dd;"&gt;byte&lt;/span&gt;&lt;span class="token return-type"&gt;[&lt;/span&gt;&lt;span class="token return-type"&gt;]&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; container &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; _blobServiceClient&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetBlobContainerClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;_containerName&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; blob &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; container&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetBlobClient&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; blob&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ExistsAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; response &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; blob&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;DownloadContentAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; response&lt;span class="token"&gt;.&lt;/span&gt;Value&lt;span class="token"&gt;.&lt;/span&gt;Content&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ToArray&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Azure Function Apps&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Azure Functions can benefit greatly from caching, especially for reducing cold start times and improving performance for frequently accessed data.&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;In-Memory Caching with Static Variables&lt;/strong&gt;
&lt;!-- --&gt;For simple scenarios, you can use static variables to cache data within a Function App instance:&lt;!-- --&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;MyFunctionApp&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ConcurrentDictionary&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;object&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _cache &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;ConcurrentDictionary&lt;/span&gt;&lt;span class="token constructor-invocation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token constructor-invocation" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token constructor-invocation"&gt;,&lt;/span&gt;&lt;span class="token constructor-invocation" style="color: #d19a66;"&gt; &lt;/span&gt;&lt;span class="token constructor-invocation" style="color: #c678dd;"&gt;object&lt;/span&gt;&lt;span class="token constructor-invocation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;FunctionName&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"MyFunction"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Run&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
        &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpTrigger&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;.&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;Function&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"get"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; Route &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;HttpRequest&lt;/span&gt; req&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt; log&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"myDataKey"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;!&lt;/span&gt;_cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;TryGetValue&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cacheKey&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;out&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;object&lt;/span&gt; cachedData&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Fetch data from the source&lt;/span&gt;
            cachedData &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;FetchDataFromSourceAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            _cache&lt;span class="token"&gt;[&lt;/span&gt;cacheKey&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cachedData&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;OkObjectResult&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cachedData&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;!-- --&gt;Remember that this cache is not shared across multiple instances of your Function App.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Azure Redis Cache for Distributed Caching&lt;/strong&gt;
&lt;!-- --&gt;For a distributed caching solution in Azure Functions, you can use Azure Redis Cache:&lt;!-- --&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;MyFunctionApp&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Lazy&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ConnectionMultiplexer&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; lazyConnection &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;Lazy&lt;/span&gt;&lt;span class="token constructor-invocation"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;ConnectionMultiplexer&lt;/span&gt;&lt;span class="token constructor-invocation"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; ConnectionMultiplexer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Connect&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;Environment&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"RedisConnection"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;ConnectionMultiplexer&lt;/span&gt; Connection &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; lazyConnection&lt;span class="token"&gt;.&lt;/span&gt;Value&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;FunctionName&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"MyFunction"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Run&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
        &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpTrigger&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;.&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;Function&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"get"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; Route &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;HttpRequest&lt;/span&gt; req&lt;span class="token"&gt;,&lt;/span&gt;
        &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt; log&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #d19a66;"&gt;IDatabase&lt;/span&gt; cache &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; Connection&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetDatabase&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"myDataKey"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; cachedData &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;StringGetAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cacheKey&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;cachedData &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Fetch data from the source&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; data &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;FetchDataFromSourceAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            cachedData &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Serialize&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;data&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;StringSetAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cacheKey&lt;span class="token"&gt;,&lt;/span&gt; cachedData&lt;span class="token"&gt;,&lt;/span&gt; TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;10&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;OkObjectResult&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;Deserialize&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;YourDataType&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cachedData&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Durable Entities for Stateful Caching&lt;/strong&gt;
&lt;!-- --&gt;Azure Durable Functions provide a feature called Durable Entities, which can be used as a form of distributed cache:&lt;!-- --&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;FunctionName&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;CacheEntity&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;void&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CacheEntity&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;EntityTrigger&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;IDurableEntityContext&lt;/span&gt; ctx&lt;span class="token"&gt;)&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;switch&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;ctx&lt;span class="token"&gt;.&lt;/span&gt;OperationName&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ToLowerInvariant&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;case&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"set"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt;
            ctx&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SetState&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;ctx&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;GetInput&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;break&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;case&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"get"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt;
            ctx&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Return&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;ctx&lt;/span&gt;&lt;span class="token return-type"&gt;.&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;HasState &lt;/span&gt;&lt;span class="token return-type"&gt;?&lt;/span&gt; ctx&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;GetState&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;break&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;FunctionName&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"MyFunction"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;static&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Run&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpTrigger&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;AuthorizationLevel&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;.&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;Function&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"get"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;,&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; Route &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;HttpRequest&lt;/span&gt; req&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;DurableClient&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;IDurableEntityClient&lt;/span&gt; client&lt;span class="token"&gt;,&lt;/span&gt;
    &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt; log&lt;span class="token"&gt;)&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"myDataKey"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; entityId &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;EntityId&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;CacheEntity&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; cacheKey&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; response &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; client&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;ReadEntityStateAsync&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;entityId&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;!&lt;/span&gt;response&lt;span class="token"&gt;.&lt;/span&gt;EntityExists &lt;span class="token" style="color: #61afef;"&gt;||&lt;/span&gt; response&lt;span class="token"&gt;.&lt;/span&gt;EntityState &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Fetch data from the source&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; data &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;FetchDataFromSourceAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; client&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SignalEntityAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;entityId&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"set"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Serialize&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;data&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;OkObjectResult&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;data&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;OkObjectResult&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;Deserialize&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;YourDataType&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;response&lt;span class="token"&gt;.&lt;/span&gt;EntityState&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Best Practices for Azure Caching&lt;/h3&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Use Azure Redis Cache for multi-instance scenarios&lt;/strong&gt;: This ensures consistency across all instances of your App Service or Function App.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Implement circuit breakers&lt;/strong&gt;: Use libraries like Polly to handle transient failures in your caching layer gracefully.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Monitor cache performance&lt;/strong&gt;: Use Azure Monitor and Application Insights to track cache hit rates, miss rates, and overall performance improvements.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Optimize cache expiration&lt;/strong&gt;: Set appropriate TTL (Time To Live) values based on how frequently your data changes.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;&lt;strong&gt;Consider Azure CDN for static content&lt;/strong&gt;: For static assets, consider using Azure Content Delivery Network (CDN) to cache content closer to your users.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="5"&gt;&lt;strong&gt;Use Azure Front Door for global applications&lt;/strong&gt;: If your application serves users globally, consider using Azure Front Door, which provides integrated caching capabilities.&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;By implementing these caching strategies in your Azure App Services and Function Apps, you can significantly improve your application's performance, reduce load on your backend services, and potentially lower your Azure hosting costs.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Remember to always measure the impact of your caching strategies and adjust them based on your specific application needs and usage patterns.&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/09/caching-strategies-for-azure-app.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-1157628129015766175</guid><pubDate>Sun, 29 Sep 2024 01:20:00 +0000</pubDate><atom:updated>2024-09-28T20:22:29.874-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net 9.0</category><category domain="http://www.blogger.com/atom/ns#">caching</category><category domain="http://www.blogger.com/atom/ns#">code</category><category domain="http://www.blogger.com/atom/ns#">redis</category><title>Boosting Performance with Data Caching in .NET 9.0: A Deep Dive into Distributed (Redis) and In-Memory Caching</title><description>&lt;div style="text-align: left;"&gt;In the world of .NET development, optimizing application performance is a constant pursuit. One of the most effective ways to achieve this is through strategic data caching. In this blog post, we'll explore how to leverage different caching techniques in .NET 9.0 to speed up performance when working with Entity Framework and LINQ queries. We'll focus on two primary caching strategies: distributed caching and in-memory caching.&lt;/div&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Table of Contents&lt;/h2&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="#introduction-to-caching-in-net"&gt;Introduction to Caching in .NET&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="#setting-up-the-environment"&gt;Setting Up the Environment&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;a href="#distributed-caching"&gt;Distributed Caching&lt;/a&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="#implementing-distributed-caching"&gt;Implementing Distributed Caching&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="#using-distributed-cache-with-ef-core-and-linq"&gt;Using Distributed Cache with EF Core and LINQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;a href="#in-memory-caching"&gt;In-Memory Caching&lt;/a&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="#implementing-in-memory-caching"&gt;Implementing In-Memory Caching&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="#using-in-memory-cache-with-ef-core-and-linq"&gt;Using In-Memory Cache with EF Core and LINQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;&lt;a href="#best-practices-and-considerations"&gt;Best Practices and Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="5"&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Introduction to Caching in .NET&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Caching is a technique used to store frequently accessed data in a fast-access storage layer, reducing the need to fetch the same data repeatedly from slower sources like databases. In .NET, we have several caching options, but we'll focus on two powerful approaches: distributed caching and in-memory caching.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Setting Up the Environment&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Before we dive into the caching implementations, let's set up our project. We'll use a simple ASP.NET Core Web API project with Entity Framework Core.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;First, create a new ASP.NET Core Web API project and install the necessary NuGet packages:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;dotnet new webapi -n CachingDemo
&lt;span class="token" style="color: #d19a66;"&gt;cd&lt;/span&gt; CachingDemo
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package Microsoft.EntityFrameworkCore.SqlServer
dotnet &lt;span class="token" style="color: #61afef;"&gt;add&lt;/span&gt; package Microsoft.Extensions.Caching.StackExchangeRedis&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's create a simple model and DbContext:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; Id &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; Name &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;decimal&lt;/span&gt; Price &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;AppDbContext&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;DbContext&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;AppDbContext&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;DbContextOptions&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;AppDbContext&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;base&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;DbSet&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;Product&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; Products &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;set&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Add the DbContext to your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;AddDbContext&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;AppDbContext&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;UseSqlServer&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Configuration&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetConnectionString&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"DefaultConnection"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Distributed Caching&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Distributed caching is an excellent choice for web farms or microservices architectures where multiple instances of an application need to share the same cache. We'll use Redis as our distributed cache provider.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Implementing Distributed Caching&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;First, add Redis caching to your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddStackExchangeRedisCache&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;options &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;Configuration &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; builder&lt;span class="token"&gt;.&lt;/span&gt;Configuration&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetConnectionString&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Redis"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    options&lt;span class="token"&gt;.&lt;/span&gt;InstanceName &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"SampleInstance"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's create a service to handle our caching logic:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;interface&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token generic-method" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Func&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; factory&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;TimeSpan&lt;/span&gt;&lt;span class="token"&gt;?&lt;/span&gt; expiration &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;RedisCacheService&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;IDistributedCache&lt;/span&gt; _cache&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;RedisCacheService&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RedisCacheService&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;IDistributedCache&lt;/span&gt; cache&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;RedisCacheService&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _cache &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cache&lt;span class="token"&gt;;&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token generic-method" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Func&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; factory&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;TimeSpan&lt;/span&gt;&lt;span class="token"&gt;?&lt;/span&gt; expiration &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cachedResult &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetStringAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;cachedResult &lt;span class="token" style="color: #61afef;"&gt;!=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Cache hit for key: &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;key&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;Deserialize&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;cachedResult&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Cache miss for key: &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;key&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; result &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;factory&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; options &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;DistributedCacheEntryOptions&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;expiration&lt;span class="token"&gt;.&lt;/span&gt;HasValue&lt;span class="token"&gt;)&lt;/span&gt;
            options&lt;span class="token"&gt;.&lt;/span&gt;AbsoluteExpirationRelativeToNow &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; expiration&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SetStringAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;,&lt;/span&gt; JsonSerializer&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Serialize&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;result&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; options&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; result&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Add this service to your dependency injection container in &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;AddSingleton&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;&lt;span class="token generic-method generic"&gt;,&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt; RedisCacheService&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Using Distributed Cache with EF Core and LINQ&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's use our distributed cache in a controller:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;ApiController&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Route&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"[controller]"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductsController&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ControllerBase&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;AppDbContext&lt;/span&gt; _context&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; _cacheService&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductsController&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;AppDbContext&lt;/span&gt; context&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; cacheService&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; context&lt;span class="token"&gt;;&lt;/span&gt;
        _cacheService &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cacheService&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetProducts&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; products &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
            &lt;span class="token" style="color: #98c379;"&gt;"all_products"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ToListAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;10&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Ok&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;products&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; product &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
            &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;5&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;product &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Ok&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPost&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreateProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"all_products"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreatedAtAction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;GetProduct&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; id &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; product&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;In this example, we're caching the results of our LINQ queries. The &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;GetProducts&lt;/code&gt; method caches the entire list of products for 10 minutes, while the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;GetProduct&lt;/code&gt; method caches individual products for 5 minutes. When a new product is created, we invalidate the "all_products" cache.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;In-Memory Caching&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;In-memory caching is suitable for single-instance applications or scenarios where you need extremely fast access to cached data. .NET provides a built-in &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;IMemoryCache&lt;/code&gt; interface for in-memory caching.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Implementing In-Memory Caching&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;First, add memory caching to your &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AddMemoryCache&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's create an in-memory cache service:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;MemoryCacheService&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;IMemoryCache&lt;/span&gt; _cache&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;MemoryCacheService&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;MemoryCacheService&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;IMemoryCache&lt;/span&gt; cache&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;MemoryCacheService&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _cache &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cache&lt;span class="token"&gt;;&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token generic-method" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Func&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;T&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; factory&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;TimeSpan&lt;/span&gt;&lt;span class="token"&gt;?&lt;/span&gt; expiration &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;_cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;TryGetValue&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;out&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;T&lt;/span&gt; cachedResult&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Cache hit for key: &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;key&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; cachedResult&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Cache miss for key: &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;key&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; result &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;factory&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cacheEntryOptions &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;MemoryCacheEntryOptions&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;expiration&lt;span class="token"&gt;.&lt;/span&gt;HasValue&lt;span class="token"&gt;)&lt;/span&gt;
            cacheEntryOptions&lt;span class="token"&gt;.&lt;/span&gt;AbsoluteExpirationRelativeToNow &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; expiration&lt;span class="token"&gt;;&lt;/span&gt;

        _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Set&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;,&lt;/span&gt; result&lt;span class="token"&gt;,&lt;/span&gt; cacheEntryOptions&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; result&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; key&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _cache&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Remove&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;key&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; Task&lt;span class="token"&gt;.&lt;/span&gt;CompletedTask&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Update your dependency injection in &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;Program.cs&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;builder&lt;span class="token"&gt;.&lt;/span&gt;Services&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;AddSingleton&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt;&lt;span class="token generic-method generic"&gt;,&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt; MemoryCacheService&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;div style="text-align: left;"&gt;&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Using In-Memory Cache with EF Core and LINQ&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Now, let's look at a practical example of how to use our &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;MemoryCacheService&lt;/code&gt; with Entity Framework Core and LINQ queries. We'll create a new controller that demonstrates various caching scenarios.&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background: rgb(40, 44, 52); color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;ApiController&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;Route&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"[controller]"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ProductsMemoryCacheController&lt;/span&gt; &lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token type-list" style="color: #d19a66;"&gt;ControllerBase&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;AppDbContext&lt;/span&gt; _context&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; _cacheService&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;readonly&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ProductsMemoryCacheController&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; _logger&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;ProductsMemoryCacheController&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;AppDbContext&lt;/span&gt; context&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ICacheService&lt;/span&gt; cacheService&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ILogger&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;ProductsMemoryCacheController&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; logger&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; context&lt;span class="token"&gt;;&lt;/span&gt;
        _cacheService &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; cacheService&lt;span class="token"&gt;;&lt;/span&gt;
        _logger &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; logger&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetProducts&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"all_products"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; products &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
            cacheKey&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Fetching all products from database"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ToListAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;10&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Ok&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;products&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; product &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
            cacheKey&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Fetching product &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; from database"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;5&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;product &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Ok&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpGet&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"category/{category}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetProductsByCategory&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; category&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; cacheKey &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"products_category_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;category&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; products &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetOrCreateAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;
            cacheKey&lt;span class="token"&gt;,&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Fetching products for category &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;category&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; from database"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products
                    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Where&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;p &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; p&lt;span class="token"&gt;.&lt;/span&gt;Category &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; category&lt;span class="token"&gt;)&lt;/span&gt;
                    &lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;ToListAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;
            TimeSpan&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FromMinutes&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;15&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Ok&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;products&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPost&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreateProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Add&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Invalidate relevant caches&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"all_products"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"products_category_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;product&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Category&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Created new product with ID &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;product&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; and invalidated caches"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CreatedAtAction&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;nameof&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;GetProduct&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; id &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; product&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpPut&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;UpdateProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Product&lt;/span&gt; product&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;id &lt;span class="token" style="color: #61afef;"&gt;!=&lt;/span&gt; product&lt;span class="token"&gt;.&lt;/span&gt;Id&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;BadRequest&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Entry&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;State &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; EntityState&lt;span class="token"&gt;.&lt;/span&gt;Modified&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;try&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Invalidate relevant caches&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"all_products"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"products_category_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;product&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Category&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

            _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Updated product with ID &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; and invalidated caches"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;catch&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;DbUpdateConcurrencyException&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
        &lt;span class="token"&gt;{&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;!&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;AnyAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;e &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; e&lt;span class="token"&gt;.&lt;/span&gt;Id &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;else&lt;/span&gt;
                &lt;span class="token" style="color: #c678dd;"&gt;throw&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token"&gt;}&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NoContent&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;HttpDelete&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #98c379;"&gt;"{id}"&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IActionResult&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;DeleteProduct&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; id&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; product &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;FindAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;id&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;if&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;product &lt;span class="token" style="color: #61afef;"&gt;==&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NotFound&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        _context&lt;span class="token"&gt;.&lt;/span&gt;Products&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Remove&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;product&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _context&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;SaveChangesAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Invalidate relevant caches&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"product_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"all_products"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; _cacheService&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;RemoveAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"products_category_&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;product&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;.&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Category&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        _logger&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;LogInformation&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Deleted product with ID &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;id&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; and invalidated caches"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;NoContent&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;This example demonstrates several key concepts:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Caching Individual Items&lt;/strong&gt;: In the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;GetProduct&lt;/code&gt; method, we cache individual products using their ID as part of the cache key. This allows for quick retrieval of frequently accessed products without querying the database.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Caching Collections&lt;/strong&gt;: The &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;GetProducts&lt;/code&gt; method caches the entire list of products, while &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;GetProductsByCategory&lt;/code&gt; caches products by category. This is useful for frequently accessed collections that don't change often.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Cache Invalidation&lt;/strong&gt;: In the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;CreateProduct&lt;/code&gt;, &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;UpdateProduct&lt;/code&gt;, and &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;DeleteProduct&lt;/code&gt; methods, we invalidate relevant caches. This ensures that when data changes, the cache is updated accordingly.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Flexible Cache Duration&lt;/strong&gt;: We use different cache durations for different types of data. For example, individual products are cached for 5 minutes, while category lists are cached for 15 minutes.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;&lt;strong&gt;Logging&lt;/strong&gt;: We've added logging to help track when the database is actually being queried versus when data is being retrieved from the cache.&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Using this approach, you can significantly reduce the number of database queries for frequently accessed data. However, it's important to carefully consider your caching strategy based on your application's specific needs and data access patterns.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Remember that while in-memory caching provides extremely fast access to data, it's limited to a single application instance. If you're running multiple instances of your application (e.g., in a web farm), you might want to consider distributed caching to ensure cache consistency across all instances.&lt;/p&gt;&lt;/div&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Best Practices and Considerations&lt;/h2&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;strong&gt;Cache Invalidation&lt;/strong&gt;: Always have a strategy for invalidating cached data when it changes. In our example, we removed the "all_products" cache when a new product was added.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;strong&gt;Expiration Policies&lt;/strong&gt;: Use appropriate expiration times based on how frequently your data changes and how tolerant your application is to slightly outdated data.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;strong&gt;Cache Keys&lt;/strong&gt;: Use consistent and meaningful cache keys. Consider using a key generation strategy to avoid conflicts.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="3"&gt;&lt;strong&gt;Error Handling&lt;/strong&gt;: Implement proper error handling for cache operations. Your application should gracefully handle scenarios where the cache is unavailable.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="4"&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;: Implement logging and monitoring for your cache to track hit rates, miss rates, and overall performance improvements.&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="5"&gt;&lt;strong&gt;Selective Caching&lt;/strong&gt;: Not all data needs to be cached. Focus on caching data that is expensive to compute or retrieve and is accessed frequently.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Implementing effective caching strategies can significantly improve the performance of your .NET applications, especially when working with Entity Framework and LINQ queries. By using distributed caching with Redis or in-memory caching, you can reduce database load and speed up data retrieval.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Remember, the choice between distributed and in-memory caching depends on your specific use case. Distributed caching is ideal for multi-instance deployments and can handle larger datasets, while in-memory caching offers the fastest possible access times but is limited to a single instance.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;As with any performance optimization, it's crucial to measure the impact of caching in your specific application. Use performance profiling tools to ensure that your caching strategy is delivering the expected benefits.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Happy coding, and may your .NET applications be faster than ever!&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/09/boosting-performance-with-data-caching.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3132357405579351461.post-3903843702631841770</guid><pubDate>Sat, 28 Sep 2024 17:44:00 +0000</pubDate><atom:updated>2024-09-28T12:44:23.876-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.net 9.0</category><category domain="http://www.blogger.com/atom/ns#">blazor</category><category domain="http://www.blogger.com/atom/ns#">dotnet core</category><title>Exploring .NET 9.0 Features and Latest Blazor Updates: A Deep Dive</title><description>&lt;div style="text-align: left;"&gt;As a .NET developer, staying up-to-date with the latest features and improvements is crucial. In this blog post, we'll explore the exciting new features in .NET 9.0 and the latest updates to Blazor. We'll cover everything from performance enhancements to new language features, complete with code samples and detailed walkthroughs.&lt;/div&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Table of Contents&lt;/h2&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="#net-90-features"&gt;.NET 9.0 Features&lt;/a&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="#performance-improvements"&gt;Performance Improvements&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="#c-12-language-features"&gt;C# 12 Language Features&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;a href="#native-aot-enhancements"&gt;Native AOT Enhancements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="#blazor-updates"&gt;Blazor Updates&lt;/a&gt;
&lt;ul class="-mt-1 list-disc space-y-2 pl-8" depth="1"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;&lt;a href="#blazor-united"&gt;Blazor United&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="1"&gt;&lt;a href="#enhanced-javascript-interop"&gt;Enhanced JavaScript Interop&lt;/a&gt;&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;a href="#improved-component-model"&gt;Improved Component Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class="whitespace-normal break-words" index="2"&gt;&lt;a href="#conclusion"&gt;Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;.NET 9.0 Features&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Performance Improvements&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;.NET 9.0 continues the trend of focusing on performance improvements. One of the most significant enhancements is the introduction of profile-guided optimization (PGO) for native AOT compilation.&lt;/p&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Profile-Guided Optimization (PGO)&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;PGO allows the compiler to make more informed decisions about code optimization based on actual runtime behavior. Here's how you can enable PGO for your .NET 9.0 project:&lt;/p&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;First, add the following to your project file:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;xml&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-xml" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PropertyGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PublishAot&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;true&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PublishAot&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;OptimizationPreference&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;PGO&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;OptimizationPreference&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="token"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="token" style="color: #e06c75;"&gt;PropertyGroup&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0" start="2"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;Build and run your application with instrumentation:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;dotnet publish -c Release
./bin/Release/net9.0/&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;YourApp&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt; --collect-profile&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;ol class="-mt-1 list-decimal space-y-2 pl-8" depth="0" start="3"&gt;
&lt;li class="whitespace-normal break-words" index="0"&gt;This will generate a profile file. Now, rebuild your application using this profile:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;bash&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-bash" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;dotnet publish -c Release&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;The resulting executable will be optimized based on the collected profile data, potentially offering significant performance improvements for your specific use case.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;C# 12 Language Features&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;C# 12, which comes with .NET 9.0, introduces several new language features to improve developer productivity and code readability.&lt;/p&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Primary Constructors for Non-Record Classes&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;C# 12 extends the primary constructor syntax to non-record classes. This feature allows for more concise class definitions:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;Person&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; name&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; age&lt;span class="token"&gt;)&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt; Name &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; name&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;int&lt;/span&gt; Age &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;get&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; age&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;void&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;Introduce&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;WriteLine&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt;$"Hi, I'm &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Name&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; and I'm &lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;{&lt;/span&gt;&lt;span class="token interpolation-string interpolation expression language-csharp"&gt;Age&lt;/span&gt;&lt;span class="token interpolation-string interpolation"&gt;}&lt;/span&gt;&lt;span class="token interpolation-string" style="color: #98c379;"&gt; years old."&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Usage&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; person &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;Person&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Alice"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;30&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
person&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Introduce&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Collection Expressions&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Collection expressions provide a more concise way to initialize collections:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; numbers &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;1&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;2&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;3&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;4&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;5&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #d19a66;"&gt;List&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; names &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Alice"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Bob"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Charlie"&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token" style="color: #d19a66;"&gt;Dictionary&lt;/span&gt;&lt;span class="token"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt; &lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt;&lt;span class="token"&gt;&amp;gt;&lt;/span&gt; ages &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Alice"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;30&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Bob"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;25&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Charlie"&lt;/span&gt;&lt;span class="token"&gt;:&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;35&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Native AOT Enhancements&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;.NET 9.0 further improves Native AOT (Ahead-of-Time) compilation, making it more viable for a wider range of applications.&lt;/p&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Improved Reflection Support&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Native AOT now has better support for reflection, allowing more libraries and frameworks to work seamlessly with AOT compilation. Here's an example of using reflection with Native AOT:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token attribute" style="color: #d19a66;"&gt;DynamicallyAccessedMembers&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;(&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;DynamicallyAccessedMemberTypes&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;.&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;PublicConstructors &lt;/span&gt;&lt;span class="token attribute attribute-arguments" style="color: #61afef;"&gt;|&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt; DynamicallyAccessedMemberTypes&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;.&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;PublicMethods&lt;/span&gt;&lt;span class="token attribute attribute-arguments"&gt;)&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;class&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;ReflectionExample&lt;/span&gt;
&lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;void&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;DynamicMethod&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;string&lt;/span&gt; methodName&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; method &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetType&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;GetMethod&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;methodName&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
        method&lt;span class="token"&gt;?.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Invoke&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;this&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;null&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;public&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;void&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;SayHello&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; Console&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;WriteLine&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"Hello from reflection!"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;

&lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Usage&lt;/span&gt;
&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; example &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt; &lt;span class="token constructor-invocation" style="color: #d19a66;"&gt;ReflectionExample&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
example&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;DynamicMethod&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"SayHello"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Blazor Updates&lt;/h2&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Blazor United&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Blazor United is a new model that combines the best of server-side and client-side rendering. It allows for seamless transitions between server and client rendering modes.&lt;/p&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Streaming Rendering&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Blazor United introduces streaming rendering, which allows parts of the page to be rendered and sent to the client incrementally. Here's an example of how to use streaming rendering:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;@page &lt;span class="token" style="color: #98c379;"&gt;"/"&lt;/span&gt;
@attribute &lt;span class="token"&gt;[&lt;/span&gt;StreamRendering&lt;span class="token"&gt;]&lt;/span&gt;

&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;h1&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;Welcome to My Blazor App&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;/&lt;/span&gt;h1&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;QuickLoadingComponent &lt;span class="token" style="color: #61afef;"&gt;/&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;SlowLoadingComponent &lt;span class="token" style="color: #61afef;"&gt;/&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;

@code &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;RenderFragment&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;SlowLoadingComponent&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt; builder &lt;span class="token" style="color: #61afef;"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;div&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;
            @&lt;span class="token" style="color: #c678dd;"&gt;foreach&lt;/span&gt; &lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #c678dd;"&gt;var&lt;/span&gt; item &lt;span class="token" style="color: #c678dd;"&gt;in&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetSlowDataAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
            &lt;span class="token"&gt;{&lt;/span&gt;
                &lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;p&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;@item&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;/&lt;/span&gt;p&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="token"&gt;}&lt;/span&gt;
        &lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;/&lt;/span&gt;div&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #d19a66;"&gt;IEnumerable&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token return-type" style="color: #c678dd;"&gt;string&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token return-type"&gt;&amp;gt;&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;GetSlowDataAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; Task&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;Delay&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;3000&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt; &lt;span class="token" style="color: #5c6370; font-style: italic;"&gt;// Simulate slow data fetch&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;return&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;new&lt;/span&gt;&lt;span class="token"&gt;[&lt;/span&gt;&lt;span class="token"&gt;]&lt;/span&gt; &lt;span class="token"&gt;{&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Data 1"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Data 2"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Data 3"&lt;/span&gt; &lt;span class="token"&gt;}&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;In this example, the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;QuickLoadingComponent&lt;/code&gt; will render immediately, while the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;SlowLoadingComponent&lt;/code&gt; will stream its content as it becomes available.&lt;/p&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Enhanced JavaScript Interop&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Blazor in .NET 9.0 provides improved JavaScript interop capabilities, making it easier to integrate with existing JavaScript libraries and frameworks.&lt;/p&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Module-based JavaScript Interop&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;You can now use ECMAScript modules for cleaner JavaScript interop:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;@inject IJSRuntime &lt;span class="token return-type" style="color: #d19a66;"&gt;JS&lt;/span&gt;

@code &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;IJSObjectReference&lt;/span&gt;&lt;span class="token"&gt;?&lt;/span&gt; module&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;protected&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;override&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;OnInitializedAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        module &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; JS&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token generic-method" style="color: #61afef;"&gt;InvokeAsync&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token generic-method generic" style="color: #d19a66;"&gt;IJSObjectReference&lt;/span&gt;&lt;span class="token generic-method generic"&gt;&amp;gt;&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"import"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"./scripts/myModule.js"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;async&lt;/span&gt; &lt;span class="token return-type" style="color: #d19a66;"&gt;Task&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;CallJsMethod&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        &lt;span class="token" style="color: #c678dd;"&gt;await&lt;/span&gt; module&lt;span class="token" style="color: #61afef;"&gt;!&lt;/span&gt;&lt;span class="token"&gt;.&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;InvokeVoidAsync&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"myJsMethod"&lt;/span&gt;&lt;span class="token"&gt;,&lt;/span&gt; &lt;span class="token" style="color: #98c379;"&gt;"Hello from Blazor!"&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;h3 class="font-600 text-lg font-bold" level="3"&gt;Improved Component Model&lt;/h3&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;The Blazor component model has been enhanced to provide better performance and more flexibility.&lt;/p&gt;
&lt;h2 class="font-600 text-base font-bold" level="4"&gt;Stateful Prerendering&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;Stateful prerendering allows components to maintain their state between prerendering and interactive rendering:&lt;/p&gt;
&lt;pre&gt;&lt;div class="relative flex flex-col rounded-lg"&gt;&lt;div class="text-text-300 absolute pl-3 pt-2.5 text-xs"&gt;csharp&lt;/div&gt;&lt;div class="pointer-events-none sticky my-0.5 ml-0.5 flex items-center justify-end px-1.5 py-1 mix-blend-luminosity top-0"&gt;&lt;div class="from-bg-300/90 to-bg-300/70 pointer-events-auto rounded-md bg-gradient-to-b p-0.5 backdrop-blur-md"&gt;&lt;button class="flex flex-row items-center gap-1 rounded-md p-1 py-0.5 text-xs transition-opacity delay-100 hover:bg-bg-200 opacity-60 hover:opacity-100"&gt;&lt;svg class="text-text-500 mr-px -translate-y-[0.5px]" fill="currentColor" height="14" viewbox="0 0 256 256" width="14" xmlns="http://www.w3.org/2000/svg"&gt;&lt;path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;span class="text-text-200 pr-0.5"&gt;Copy&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div class="code-block__code !my-0 !rounded-lg !text-sm !leading-relaxed" style="background: rgb(40, 44, 52); border-radius: 0.3em; color: #abb2bf; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; margin: 0.5em 0px; overflow: auto; padding: 1em; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;&lt;code class="language-csharp" style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; direction: ltr; font-family: &amp;quot;Fira Code&amp;quot;, &amp;quot;Fira Mono&amp;quot;, Menlo, Consolas, &amp;quot;DejaVu Sans Mono&amp;quot;, monospace; hyphens: none; line-height: 1.5; tab-size: 2; text-shadow: rgba(0, 0, 0, 0.3) 0px 1px; word-break: normal; word-spacing: normal;"&gt;@page &lt;span class="token" style="color: #98c379;"&gt;"/"&lt;/span&gt;
@attribute &lt;span class="token"&gt;[&lt;/span&gt;PreserveState&lt;span class="token"&gt;]&lt;/span&gt;

&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;h1&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;Counter&lt;span class="token"&gt;:&lt;/span&gt; @count&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;/&lt;/span&gt;h1&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #d19a66;"&gt;button&lt;/span&gt; @onclick&lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt;&lt;span class="token" style="color: #98c379;"&gt;"IncrementCount"&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;Increment&lt;span class="token" style="color: #61afef;"&gt;&amp;lt;&lt;/span&gt;&lt;span class="token" style="color: #61afef;"&gt;/&lt;/span&gt;button&lt;span class="token" style="color: #61afef;"&gt;&amp;gt;&lt;/span&gt;

@code &lt;span class="token"&gt;{&lt;/span&gt;
    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token" style="color: #c678dd;"&gt;int&lt;/span&gt; count &lt;span class="token" style="color: #61afef;"&gt;=&lt;/span&gt; &lt;span class="token" style="color: #d19a66;"&gt;0&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;

    &lt;span class="token" style="color: #c678dd;"&gt;private&lt;/span&gt; &lt;span class="token return-type" style="color: #c678dd;"&gt;void&lt;/span&gt; &lt;span class="token" style="color: #61afef;"&gt;IncrementCount&lt;/span&gt;&lt;span class="token"&gt;(&lt;/span&gt;&lt;span class="token"&gt;)&lt;/span&gt;
    &lt;span class="token"&gt;{&lt;/span&gt;
        count&lt;span class="token" style="color: #61afef;"&gt;++&lt;/span&gt;&lt;span class="token"&gt;;&lt;/span&gt;
    &lt;span class="token"&gt;}&lt;/span&gt;
&lt;span class="token"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;With the &lt;code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.3rem] px-1 py-px text-[0.9rem]"&gt;[PreserveState]&lt;/code&gt; attribute, the component's state will be preserved when the page becomes interactive, providing a seamless user experience.&lt;/p&gt;
&lt;h2 class="font-600 text-xl font-bold" level="2"&gt;Conclusion&lt;/h2&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;.NET 9.0 and the latest Blazor updates bring a wealth of new features and improvements to the .NET ecosystem. From performance enhancements like profile-guided optimization and improved Native AOT support to new C# language features and Blazor's unified model, developers have powerful new tools at their disposal.&lt;/p&gt;
&lt;p class="whitespace-pre-wrap break-words"&gt;As you explore these new features, remember to benchmark your applications and carefully consider which improvements make the most sense for your specific use cases. The .NET team continues to push the boundaries of what's possible with the framework, and it's an exciting time to be a .NET developer.&lt;/p&gt;
&lt;p&gt;Happy coding, and may your .NET 9.0 and Blazor projects be faster, more efficient, and more enjoyable to develop than ever before&amp;nbsp;&lt;/p&gt;</description><link>http://www.sharepointfix.com/2024/09/exploring-net-90-features-and-latest.html</link><author>noreply@blogger.com (Mehul K Bhuva)</author></item></channel></rss>