<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Diagrid</title>
    <description>The latest articles on DEV Community by Diagrid (diagrid).</description>
    <link>https://dev.to/diagrid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F6621%2Fca07de48-8345-4222-95f4-7c01627ee72e.png</url>
      <title>DEV Community: Diagrid</title>
      <link>https://dev.to/diagrid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/diagrid"/>
    <language>en</language>
    <item>
      <title>Durable Execution, Now Built for Agents</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Tue, 28 Jul 2026 15:38:38 +0000</pubDate>
      <link>https://dev.to/diagrid/what-verifiable-execution-adds-on-top-of-durable-execution-24k1</link>
      <guid>https://dev.to/diagrid/what-verifiable-execution-adds-on-top-of-durable-execution-24k1</guid>
      <description>&lt;p&gt;Durable execution has become an expectation for agent workloads. If the process dies halfway through a refund, the run resumes at the last completed step instead of re-issuing it. What it does not give you is proof. Replaying a run is not the same as proving what ran.&lt;/p&gt;

&lt;h3&gt;
  
  
  The missing piece is verifiability
&lt;/h3&gt;

&lt;p&gt;Verifiable execution is a record of what ran, in what order, and what it produced, where every LLM call, tool call and decision is cryptographically signed and traceable to its source. Durability keeps work alive. Verifiability makes it checkable by someone who was not there.&lt;/p&gt;

&lt;h3&gt;
  
  
  More autonomy, less reproducibility
&lt;/h3&gt;

&lt;p&gt;In a deterministic workflow the steps live in your code. You can diff them and point at the line that made a decision. As you hand control to the model, that structure moves out of the code and into the run itself. The model picks which tools to call and in what order, so two runs on the same input can take different paths, and nothing in your repository records which path a given run took.&lt;/p&gt;

&lt;p&gt;Most teams make that trade on purpose. The flexibility is what lets an agent settle a messy dispute that no if-statement anticipated. The cost arrives later, when someone asks why a particular refund was denied. A stack trace tells you what your code did. It cannot tell you why the model chose one tool over another, and re-running the agent produces a fresh set of decisions rather than the ones you need to account for.&lt;/p&gt;

&lt;p&gt;So the structure you take out of your code has to reappear underneath it, as a record rather than as more branching logic: every call the agent made, in order, with the inputs and outputs that led to the next step, each entry signed so it can be verified later.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Catalyst is built for
&lt;/h3&gt;

&lt;p&gt;Declarative workflow engines, where the flow lives outside your code, do not integrate natively with agent frameworks. Code-first engines integrate, but leave the run unverifiable, so you can resume it without being able to prove it. Agentic durable execution takes a third route: keep the framework you already use and make its execution durable and verifiable.&lt;/p&gt;

&lt;p&gt;That is what Diagrid Catalyst is built for. Add a package to LangGraph, Microsoft Agent Framework, Google ADK, AWS Strands, OpenAI Agents SDK or CrewAI, and you get durable and verifiable execution through workflows, attestation, cryptographic signing, and SPIFFE-based workload identity.&lt;/p&gt;

&lt;p&gt;Durable execution is becoming table stakes for agents. Verifiable execution is what makes them trusted.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href="https://www.diagrid.io/blog/what-is-agentic-durable-execution?utm_source=devto&amp;amp;utm_campaign=catalyst-2-0-release" rel="noopener noreferrer"&gt;full post&lt;/a&gt; on diagrid.io to learn more.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Durable execution for LangGraph agents: resuming from the exact failed step</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Tue, 28 Jul 2026 13:30:22 +0000</pubDate>
      <link>https://dev.to/diagrid/durable-execution-for-langgraph-agents-resuming-from-the-exact-failed-step-e0a</link>
      <guid>https://dev.to/diagrid/durable-execution-for-langgraph-agents-resuming-from-the-exact-failed-step-e0a</guid>
      <description>&lt;p&gt;LangGraph checkpointing lets an agent resume from saved state. In production that leaves a gap: when a model call times out or a tool fails mid-run, something has to notice, decide where to restart, and finish the run. That is usually code you wrote.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where checkpointing stops
&lt;/h3&gt;

&lt;p&gt;A checkpoint records what the graph completed before the failure. It does not retry the failed step, know which side effects already ran, or restart a process that died. That logic becomes your own layer of retry wrappers and status flags.&lt;/p&gt;

&lt;h3&gt;
  
  
  What durable execution adds
&lt;/h3&gt;

&lt;p&gt;Diagrid Catalyst records each step durably, so the runtime owns recovery:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the run resumes at the failed step, not at the start of the graph&lt;/li&gt;
&lt;li&gt;completed steps are not re-executed, so you skip repeat model calls&lt;/li&gt;
&lt;li&gt;every step lands in a signed record you can audit&lt;/li&gt;
&lt;li&gt;one reliability layer covers cloud, edge, and on-prem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What the webinar covers
&lt;/h3&gt;

&lt;p&gt;On Aug 11 we take a working LangGraph agent, force a failure mid-run, then add Catalyst and trigger the same failure. This time it resumes and finishes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.diagrid.io/webinars/durable-langgraph-agents?utm_source=dev-to&amp;amp;utm_medium=social&amp;amp;utm_campaign=webinars" rel="noopener noreferrer"&gt;Save your seat at www.diagrid.io/webinars/durable-langgraph-agents&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>Temporal vs. Diagrid Catalyst: Which Durable Execution Approach Fits a Long-Running AI Research Agent?</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Tue, 28 Jul 2026 12:59:17 +0000</pubDate>
      <link>https://dev.to/diagrid/temporal-vs-diagrid-catalyst-which-durable-execution-approach-fits-a-long-running-ai-research-37j7</link>
      <guid>https://dev.to/diagrid/temporal-vs-diagrid-catalyst-which-durable-execution-approach-fits-a-long-running-ai-research-37j7</guid>
      <description>&lt;p&gt;Getting a research agent to call three tools in a demo is easy. The hard part starts when the seventh tool call times out and the first six have already spent money and changed state somewhere.&lt;/p&gt;

&lt;p&gt;So this is a question about recovery, not about AI frameworks. Temporal and &lt;a href="https://www.diagrid.io/catalyst" rel="noopener noreferrer"&gt;Diagrid Catalyst&lt;/a&gt; both do durable execution, and both position themselves for AI workloads. What separates them is what each one asks you to build and operate around your agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the failure contract
&lt;/h2&gt;

&lt;p&gt;Say your agent searches internal documents, calls an external research API, asks an LLM to synthesize the evidence, and then waits for a human to approve the result. Before that design goes to production, you need answers to four questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which completed steps will not run again after a crash?&lt;/li&gt;
&lt;li&gt;How do you stop non-idempotent tool calls from firing twice?&lt;/li&gt;
&lt;li&gt;Can the agent wait for hours without holding a process open?&lt;/li&gt;
&lt;li&gt;Can an operator reconstruct what the agent did, and why?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Temporal treats failure-prone work as activities, coordinated by durable workflows. It persists workflow state and rebuilds it by replaying history. You can self-host Temporal or use Temporal Cloud, and Temporal's current materials cover agentic applications and framework integrations directly.&lt;/p&gt;

&lt;p&gt;Catalyst builds on Dapr Workflows. Your agent runs as a durable workflow, and Catalyst ships runners for established agent frameworks. Diagrid's documentation describes a shared runtime layer that handles durability, workload identity, policy enforcement, and operational visibility across agents, workflows, MCP servers, and applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the approaches diverge
&lt;/h2&gt;

&lt;p&gt;Temporal fits when you want your application logic written in its workflow-and-activity model. The conceptual model is mature, language support is broad, and there is a large body of distributed-systems guidance to learn from. The cost is fluency. Someone on your team has to understand Temporal's execution semantics well enough to reason about replay, and you still decide separately where agent identity, access policy, and platform governance live.&lt;/p&gt;

&lt;p&gt;Catalyst fits when your agents already exist in LangGraph, CrewAI, Microsoft Agent Framework, Google ADK, OpenAI Agents, or another supported framework, and you want to keep that choice. It sits underneath those frameworks as a shared execution and governance layer rather than replacing them.&lt;/p&gt;

&lt;p&gt;That difference grows with the number of agent teams you have. A single research-agent project can standardize on a workflow SDK and be done. A platform team supporting Python, .NET, and TypeScript agents at the same time will care more about a framework-agnostic layer and policies it can set in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would take to architecture review
&lt;/h2&gt;

&lt;p&gt;Pick Temporal if workflow-as-code is the application model you actually want, you are willing to build around its abstractions, and its ecosystem and operating model match your platform strategy.&lt;/p&gt;

&lt;p&gt;Select Catalyst if keeping your agent-framework choice matters, if you need workload identity and policy applied to tool calls, or if you have to govern agents across several deployment environments.&lt;/p&gt;

&lt;p&gt;Neither choice saves you from designing idempotent side effects or deciding when a human gets pulled in. Durable execution changes what happens after a failure. It does not make a dangerous tool call safe.&lt;/p&gt;

&lt;p&gt;Then run an experiment with either platform. Kill the agent after an expensive model call but before a state-changing tool call, and look at what resumes, what runs twice, and what evidence is left behind. Whichever platform makes that behavior easiest to explain to your developers, your operators, and your security reviewers is the one to pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Official sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.diagrid.io/catalyst" rel="noopener noreferrer"&gt;Diagrid Catalyst&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.diagrid.io/concepts/durable-execution/" rel="noopener noreferrer"&gt;Diagrid durable execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.diagrid.io/concepts/verifiable-execution/" rel="noopener noreferrer"&gt;Diagrid verifiably execution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.diagrid.io/concepts/ai-agents/" rel="noopener noreferrer"&gt;Diagrid AI agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://temporal.io/" rel="noopener noreferrer"&gt;Temporal&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>A free, open-source Dev Dashboard for local Dapr development</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Mon, 20 Jul 2026 15:25:25 +0000</pubDate>
      <link>https://dev.to/diagrid/a-free-open-source-dev-dashboard-for-local-dapr-development-11ip</link>
      <guid>https://dev.to/diagrid/a-free-open-source-dev-dashboard-for-local-dapr-development-11ip</guid>
      <description>&lt;p&gt;Developing Dapr applications means you're dealing with multiple apps and sidecars, looking at several terminals for log output and component files. There is now a free, open-source Dev Dashboard that brings it together in one live view. It runs as a single binary and auto-discovers apps started with dapr run, .NET Aspire, Docker Compose, or Testcontainers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56mtaqemtqyxfe14x534.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56mtaqemtqyxfe14x534.png" alt="Application overview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  See everything Dapr at a glance
&lt;/h2&gt;

&lt;p&gt;The dashboard shows your running apps with health, ports, and process IDs, plus their loaded components, actor types, and pub/sub subscriptions. You can also tail sidecar and application logs in the same window, with level coloring and keyword highlighting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debug workflows without guesswork
&lt;/h2&gt;

&lt;p&gt;For Dapr Workflows you can list executions across your apps, inspect event history and input/output per step, and terminate or purge instances. The data is read straight from your local state store, so you see the real state rather than a copy.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffp4svcpzbevs2dp3dr04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffp4svcpzbevs2dp3dr04.png" alt="Workflow overview" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrzbh8f2qz0r4ak2erpc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqrzbh8f2qz0r4ak2erpc.png" alt="Workflow detail" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Build components and policies in a UI
&lt;/h2&gt;

&lt;p&gt;Two guided builders generate Dapr component and resiliency YAML from the full catalog, so you can skip hand-editing files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Download &amp;amp; Install
&lt;/h2&gt;

&lt;p&gt;You can view the project on GitHub: &lt;a href="https://github.com/diagridio/dev-dashboard" rel="noopener noreferrer"&gt;https://github.com/diagridio/dev-dashboard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can install the dashboard directly via the terminal:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Install (macOS / Linux)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; https://raw.githubusercontent.com/diagridio/dev-dashboard/main/scripts/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Install (Windows, PowerShell)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;iwr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-useb&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://raw.githubusercontent.com/diagridio/dev-dashboard/main/scripts/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give it a try when you're developing and testing your Dapr applications. Once you have it running, come share how it works for you in the &lt;a href="https://diagrid.ws/dapr-discord" rel="noopener noreferrer"&gt;Dapr Discord&lt;/a&gt;. If you hit a bug or have an idea to make it better, open an issue on the &lt;a href="https://github.com/diagridio/dev-dashboard/issues" rel="noopener noreferrer"&gt;dev-dashboard repository&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>dapr</category>
    </item>
    <item>
      <title>Making Microsoft Agent Framework agents durable with Dapr Workflow</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Tue, 07 Jul 2026 15:48:50 +0000</pubDate>
      <link>https://dev.to/diagrid/making-microsoft-agent-framework-agents-durable-with-dapr-workflow-48j0</link>
      <guid>https://dev.to/diagrid/making-microsoft-agent-framework-agents-durable-with-dapr-workflow-48j0</guid>
      <description>&lt;p&gt;LLM calls are slow, costly, and non-deterministic, so a multi-agent app that crashes halfway through wastes time and money re-running everything. Dapr Workflow turns a set of MAF agents into a durable, fault-tolerant app that resumes from saved state and replays completed agent calls instead of hitting the LLM again.&lt;/p&gt;

&lt;p&gt;There's a new free Dapr University track uses &lt;code&gt;PrDigest&lt;/code&gt;, a .NET Aspire app that triages open Dapr PRs. You'll inspect the AppHost configuration, MAF agent registration, and the agent orchestration.&lt;/p&gt;

&lt;p&gt;Try the track &lt;a href="https://www.diagrid.io/university/ai-agents-maf?utm_source=dev-to&amp;amp;utm_medium=social&amp;amp;utm_campaign=agents" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>dapr</category>
      <category>ai</category>
      <category>maf</category>
    </item>
    <item>
      <title>Keep your Dapr Agent's answers current with a Tavily web search tool</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Tue, 16 Jun 2026 13:46:15 +0000</pubDate>
      <link>https://dev.to/diagrid/keep-your-dapr-agents-answers-current-with-a-tavily-web-search-tool-30d0</link>
      <guid>https://dev.to/diagrid/keep-your-dapr-agents-answers-current-with-a-tavily-web-search-tool-30d0</guid>
      <description>&lt;p&gt;LLMs are frozen at training time, so they return confident answers that may already be out of date. &lt;a href="https://www.diagrid.io/university/dapr-agents-web-context?utm_source=dev-to&amp;amp;utm_medium=social&amp;amp;utm_campaign=agents" rel="noopener noreferrer"&gt;This free, self-paced Dapr University track&lt;/a&gt; shows you how to close that gap in Python by giving an agent access to the live web.&lt;/p&gt;

&lt;p&gt;You'll build an expert agent with Dapr Agents that calls a Tavily search tool to fetch current information, then reasons over those results through the provider-agnostic Dapr Conversation API. Combining tool calls with agent reasoning keeps answers grounded in today's data.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This university track requires an OpenAI API key and a free Tavily key.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Start the free &lt;a href="https://www.diagrid.io/university/dapr-agents-web-context?utm_source=dev-to&amp;amp;utm_medium=social&amp;amp;utm_campaign=agents" rel="noopener noreferrer"&gt;track here&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>dapr</category>
    </item>
    <item>
      <title>State of Dapr 2026 report is out</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Thu, 30 Apr 2026 09:18:52 +0000</pubDate>
      <link>https://dev.to/diagrid/state-of-dapr-2026-report-is-out-2f13</link>
      <guid>https://dev.to/diagrid/state-of-dapr-2026-report-is-out-2f13</guid>
      <description>&lt;p&gt;The 2026 State of Dapr report is out. Workflow API usage doubled year over year. 34% of developers are building AI agents on Dapr, 28% already in production. Durable workflows and reliable agents on one runtime.&lt;/p&gt;

&lt;p&gt;Download the report now to get all the insights: &lt;a href="https://www.diagrid.io/reports-and-ebooks/state-of-dapr-2026?utm_source=dev-to&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;https://www.diagrid.io/reports-and-ebooks/state-of-dapr-2026?utm_source=dev-to&amp;amp;utm_medium=social&lt;/a&gt;&lt;/p&gt;

</description>
      <category>microservices</category>
      <category>dapr</category>
      <category>opensource</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Webinar: Build Reliable Agentic Apps with Aspire, MAF, and Catalyst</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Tue, 28 Apr 2026 16:23:18 +0000</pubDate>
      <link>https://dev.to/diagrid/webinar-build-reliable-agentic-apps-with-aspire-maf-and-catalyst-5hn3</link>
      <guid>https://dev.to/diagrid/webinar-build-reliable-agentic-apps-with-aspire-maf-and-catalyst-5hn3</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; &lt;a href="https://www.diagrid.io/webinars/webinar-build-reliable-agentic-apps-aspire-maf-catalyst?utm_source=dev-to&amp;amp;utm_medium=social&amp;amp;utm_campaign=webinars" rel="noopener noreferrer"&gt;Register here&lt;/a&gt; for the webinar on May 7th.&lt;/p&gt;

&lt;p&gt;Join Marc Duiker and Whit Waldo for a live webinar on building reliable agentic applications in .NET.&lt;/p&gt;

&lt;p&gt;Agentic apps look impressive in a demo, but most struggle the moment a tool call fails or a long-running task needs to survive a restart. The Microsoft Agent Framework by itself does not solve this. In this session you will see how three tools work together to close that gap: Aspire for local orchestration and observability, the Microsoft Agent Framework for building agents, and Diagrid Catalyst for durable execution and state.&lt;/p&gt;

&lt;p&gt;If you are a .NET developer exploring agentic AI, this webinar will give you a clear picture of the moving parts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📅 May 7th&lt;/li&gt;
&lt;li&gt;🕑 8:00 AM PDT / 17:00 CEST&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.diagrid.io/webinars/webinar-build-reliable-agentic-apps-aspire-maf-catalyst?utm_source=dev-to&amp;amp;utm_medium=social&amp;amp;utm_campaign=webinars" rel="noopener noreferrer"&gt;&lt;strong&gt;Register here&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who should attend&lt;/strong&gt;&lt;br&gt;
This session is for .NET developers who are building or planning to build agentic applications and want to take them beyond the demo stage. No prior experience with Aspire, MAF, or Catalyst is required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you will learn&lt;/strong&gt;&lt;br&gt;
By the end of the session you will understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where reliability tends to break in agentic apps, including failed tool calls, timeouts, and long-running tasks that need to survive restarts&lt;/li&gt;
&lt;li&gt;How Aspire improves local development and observability for distributed .NET apps&lt;/li&gt;
&lt;li&gt;How the Microsoft Agent Framework helps you define and compose agents in .NET&lt;/li&gt;
&lt;li&gt;How Diagrid Catalyst adds durable execution so your agents keep running through crashes, retries, and deployments&lt;/li&gt;
&lt;li&gt;How the three fit together in a single project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Registration is free. Everyone who signs up will receive the recording after the event.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>dotnet</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Join the Diagrid Catalyst AWS Hackathon!</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Mon, 29 Apr 2024 08:13:50 +0000</pubDate>
      <link>https://dev.to/diagrid/join-the-diagrid-catalyst-aws-hackathon-4849</link>
      <guid>https://dev.to/diagrid/join-the-diagrid-catalyst-aws-hackathon-4849</guid>
      <description>&lt;p&gt;We are excited to invite you to the Diagrid Catalyst AWS Hackathon—a four-week, virtual event where you can unleash your creativity and showcase your coding skills by building or modernizing a cutting-edge application using the powerful Diagrid Catalyst platform. Get ready to collaborate, compete, and win cash prizes! &lt;a href="http://pages.diagrid.io/catalyst-hackathon"&gt;Register now&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Diagrid Catalyst?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.diagrid.io/catalyst"&gt;Diagrid Catalyst&lt;/a&gt; is a Developer API platform providing a brand-new approach to distributed application development. Using the Catalyst APIs, powered by the &lt;a href="https://dapr.io/"&gt;Dapr&lt;/a&gt; open source project, developers can overcome the complexity of rewriting common software patterns and achieve higher productivity by offloading infrastructure concerns from their code to Catalyst.&lt;/p&gt;

&lt;p&gt;Say hello to making API calls from any platform, in any language to build modern, cloud-applications with ease. This hackathon is your chance to explore the potential of Diagrid Catalyst while bringing your solution ideas to life! For more on Catalyst, watch our most recent &lt;a href="https://youtu.be/mLpIfX3hcwg?list=PLdl4NkEiMsJscq00RLRrN4ip_VpzvuwUC"&gt;webinar&lt;/a&gt; for a platform overview and API deep dive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Participate?
&lt;/h2&gt;

&lt;p&gt;Join the Diagrid Catalyst Hackathon to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Innovate with an Emerging Product:&lt;/strong&gt; Explore the ways Diagrid Catalyst can expedite your development process by building an application to solve real-world challenges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaborate with Peers:&lt;/strong&gt; Connect with fellow developers, designers, and entrepreneurs. Collaborate, share ideas, and learn from each other's experiences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enhance Your Skills:&lt;/strong&gt; Sharpen your application development and architecture skills using the coding languages of your choice and deploying your solution on Amazon Web Services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Win Prizes:&lt;/strong&gt; Compete for impressive cash prizes! We have rewards lined up for the most exceptional projects and for providing product feedback.
‍
All participation is evaluated based on the criteria in the Hackathon &lt;a href="https://22146261.fs1.hubspotusercontent-na1.net/hubfs/22146261/Catalyst%20Hackathon/Diagrid%20Catalyst%20AWS%20Hackathon%20Rules.docx.pdf"&gt;Rules, Terms &amp;amp; Conditions&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zUbCl5_OHOU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Build?
&lt;/h2&gt;

&lt;p&gt;Build or update an open-source microservice-based software solution utilizing at least two Diagrid Catalyst APIs. The solution should be composed of multiple application services and either be newly written or significantly enhanced to utilize Diagrid Catalyst. The solution should be architected using AWS infrastructure and hosting services. The solution must align with one of the areas below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Polyglot compute/ Cross-platform service discovery:&lt;/strong&gt; Application services are deployed to different AWS hosting platforms, which interact via the Catalyst APIs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stateful business process orchestration:&lt;/strong&gt; Application services are instrumented as part of a Dapr Workflow using the Dapr Workflow authoring SDK paired with the Catalyst Workflow API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serverless architecture:&lt;/strong&gt; Application services are optimized to run on AWS PaaS/SaaS services, which abstracts infrastructure concerns and enables high-scalability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hackathon Timeline
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Registration Open:&lt;/strong&gt; April 19th 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Submissions Open:&lt;/strong&gt; May 10th 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback Submissions Open:&lt;/strong&gt; May 24th 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registration Closes:&lt;/strong&gt; May 17th 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project Submissions Deadline:&lt;/strong&gt; June 7th 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback Submissions Deadline:&lt;/strong&gt; June 14th 2024&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location:&lt;/strong&gt; Virtual Only&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Catalyst Reference Apps
&lt;/h2&gt;

&lt;p&gt;Looking for inspiration? See below for a couple of sample projects we’ve built using Diagrid Catalyst. More samples, including an AWS-specific reference, will be available to participants on the Hackathon site.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tetris Game
&lt;/h3&gt;

&lt;p&gt;The classic “blocks falling from the sky” game! The &lt;a href="https://github.com/diagrid-labs/catalyst-tetris"&gt;solution&lt;/a&gt; consists of two services:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Python Flask &lt;em&gt;user&lt;/em&gt; service which serves the JavaScript/HTML front-end for the user sign up and leaderboard and handles user state management and leaderboard updates.&lt;/li&gt;
&lt;li&gt;A &lt;em&gt;game&lt;/em&gt; service written in Go, which serves the JavaScript/HTML frontend for the game itself and manages the game session lifecycle.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These two services need to manage state and communicate to ensure games are started with the appropriate users, and user profiles are updated with the game results. The service interaction and data storage is all implemented using the APIs provided by Catalyst. Read the &lt;a href="https://www.diagrid.io/blog/build-multiplayer-tetris-in-the-browser-using-python-and-go"&gt;blog post&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/VS036hE6cvg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Pizza Store Management System
&lt;/h3&gt;

&lt;p&gt;A distributed pizza store with Catalyst APIs. The solution comprises two .NET microservices, two serverless JavaScript functions and a Vue front-end. The applications depend on Diagrid Catalyst as the serverless API layer to connect to the underlying data and messaging infrastructure. Read the blog.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/SVEXCUUlqsk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Participate?
&lt;/h2&gt;

&lt;p&gt;Participation is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Register:&lt;/strong&gt; Submit a registration request form for the hackathon. Eligible participants will receive a direct invite to the Hackathon site, hosted on Devpost. Accept your invitation to Devpost and click the blue “Register” button on the Hackathon landing page to register.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a project:&lt;/strong&gt; Create a project to frame out your hackathon solution ideas for others to see and potentially join in to help execute. You have a few options when it comes to projects:

&lt;ol&gt;
&lt;li&gt;Create a closed project to participate as an individual.&lt;/li&gt;
&lt;li&gt;Create an open project to enable other Hackathon participants to join you in your mission. You can even choose to invite people to participate in your project.&lt;/li&gt;
&lt;li&gt;Join an existing, open project if one is available and intrigues you.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Learn:&lt;/strong&gt; Join our ongoing &lt;a href="https://pages.diagrid.io/diagrid-webinar-registration-catalyst"&gt;Catalyst webinar series&lt;/a&gt; or &lt;a href="https://www.youtube.com/playlist?list=PLdl4NkEiMsJscq00RLRrN4ip_VpzvuwUC"&gt;watch on-demand&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build:&lt;/strong&gt; Develop your application using Diagrid Catalyst. Let your creativity shine, and don't forget to integrate innovative features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit:&lt;/strong&gt; Submit your project with the required deliverables by the deadline, June 7&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more information on resource access, project requirements and judging criteria, view the Hackathon &lt;a href="https://22146261.fs1.hubspotusercontent-na1.net/hubfs/22146261/Catalyst%20Hackathon/Diagrid%20Catalyst%20AWS%20Hackathon%20Rules.docx.pdf"&gt;Rules, Terms &amp;amp; Conditions&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prizes
&lt;/h2&gt;

&lt;p&gt;We have exciting cash prizes up for grabs! Prizes range from a Grand Prize of $2000 to Runner-up Prizes of $1000 each and Bonus Prizes from $250-$500! Get swag for participating &amp;amp; provide valuable product feedback for the chance to win another $100.&lt;/p&gt;

&lt;p&gt;If you participate in the hackathon, you are also eligible for a $100 referral bonus for spreading the word! Share the Hackathon details with your friends and encourage them to sign up. The participant with the most referrals wins!&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Ready to Hack
&lt;/h2&gt;

&lt;p&gt;Don’t miss this unique opportunity to explore Diagrid Catalyst, build innovative apps, and compete for cash prizes. Whether you're a seasoned developer or a curious beginner, the Diagrid Catalyst Hackathon is your time to shine.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://pages.diagrid.io/catalyst-hackathon"&gt;Sign up&lt;/a&gt; to participate today.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>programming</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Building a distributed pizza store in .NET with serverless Dapr APIs</title>
      <dc:creator>Marc Duiker</dc:creator>
      <pubDate>Thu, 01 Feb 2024 10:57:11 +0000</pubDate>
      <link>https://dev.to/diagrid/building-a-distributed-pizza-store-in-net-with-serverless-dapr-apis-j1j</link>
      <guid>https://dev.to/diagrid/building-a-distributed-pizza-store-in-net-with-serverless-dapr-apis-j1j</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;When developers build distributed systems, they need to think about cross-cutting concerns such as security, observability, and resiliency. Developers also write a lot of glue code to orchestrate services, create long-running and durable workflows, and connect to external resources, such as message brokers and state stores. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dapr.io/" rel="noopener noreferrer"&gt;Dapr&lt;/a&gt;, the Distributed Application Runtime, is ideal for building distributed systems since it has built-in support for cross-cutting concerns, and it offers a suite of APIs for communication, state and workflow, that make developers more efficient.  According to the &lt;a href="https://www.diagrid.io/blog/the-state-of-dapr-2023-report" rel="noopener noreferrer"&gt;State of Dapr Report&lt;/a&gt;, 95% of Dapr developers claim that Dapr saves time, and 55% of the developers surveyed claimed it saved them more than 30% of development time.&lt;/p&gt;

&lt;p&gt;The usage of Dapr is also increasing thanks to a growing number of platforms that support the Dapr APIs. Dapr is no longer limited to running as a sidecar in Kubernetes, as is described in &lt;a href="https://www.diagrid.io/blog/dapr-deployment-models" rel="noopener noreferrer"&gt;Dapr Deployment Models&lt;/a&gt;. In this article, &lt;a href="https://www.diagrid.io/catalyst" rel="noopener noreferrer"&gt;Diagrid Catalyst&lt;/a&gt;, a suite of serverless Dapr APIs, is used to orchestrate services with &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/workflow/workflow-overview/" rel="noopener noreferrer"&gt;Dapr workflow&lt;/a&gt;, and interact with message brokers and key-value stores.&lt;/p&gt;

&lt;p&gt;Throughout this article, you’ll be using the following to configure a distributed system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two Dapr services (.NET)&lt;/li&gt;
&lt;li&gt;Two serverless functions (JavaScript)&lt;/li&gt;
&lt;li&gt;A front-end (Vue)&lt;/li&gt;
&lt;li&gt;A key value state store&lt;/li&gt;
&lt;li&gt;A pub/sub message broker&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.diagrid.io/catalyst" rel="noopener noreferrer"&gt;Diagrid Catalyst&lt;/a&gt; as the serverless API layer to connect everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; Check the code on &lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and join the &lt;a href="https://pages.diagrid.io/catalyst-early-access-waitlist" rel="noopener noreferrer"&gt;Catalyst early access program&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagrid Pizza Store
&lt;/h2&gt;

&lt;p&gt;The demo that is used in this article revolves around an online pizza store, where the user selects pizzas, orders them, and follows the progress of the order in realtime. It’s a simplified example where the durable workflow focuses on the inventory of ingredients, and communicating with the kitchen. The source code is &lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7abjviwgbse7hnhc36g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7abjviwgbse7hnhc36g.gif" alt="Pizza store front-end" width="1200" height="1019"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The solution includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two&amp;nbsp;&lt;a href="http://dapr.io/" rel="noopener noreferrer"&gt;Dapr&lt;/a&gt;&amp;nbsp;web services written in .NET,&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;KitchenService&lt;/em&gt;. In this demo, they’re running locally, but these can be hosted in any cloud that supports ASP.NET services.&lt;/li&gt;
&lt;li&gt;The website (based on Vue) and two serverless functions written in JavaScript, &lt;em&gt;getAblyToken&lt;/em&gt; and &lt;em&gt;placeOrder&lt;/em&gt;. These are hosted on &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ably.com/" rel="noopener noreferrer"&gt;Ably&lt;/a&gt; as the realtime communication component between the&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt;&amp;nbsp;and the website.&lt;/li&gt;
&lt;li&gt;A key/value store to manage inventory (managed by Diagrid).&lt;/li&gt;
&lt;li&gt;A pub/sub message broker to communicate between the&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt;&amp;nbsp;and the&amp;nbsp;&lt;em&gt;KitchenService&lt;/em&gt;&amp;nbsp;(managed by Diagrid).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.diagrid.io/catalyst" rel="noopener noreferrer"&gt;Diagrid Catalyst&lt;/a&gt; that offers serverless APIs for communication, state, and workflow powered by Dapr.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1ornquwh30esbeu2k8d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1ornquwh30esbeu2k8d.png" alt="Pizza store architecture" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow
&lt;/h3&gt;

&lt;p&gt;The &lt;em&gt;PizzaOrderService&lt;/em&gt; contains a Dapr workflow that orchestrates the activities for checking the inventory and communicating with the &lt;em&gt;KitchenService.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1gdgcp6n4hiq9plzxrm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp1gdgcp6n4hiq9plzxrm.png" alt="Pizza store workflow" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The workflow also contains activities for sending realtime messages to the website, these have been omitted from the workflow diagram to keep it concise.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the Pizza Store locally
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;The following services, tools, and frameworks are required for this demo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.diagrid.io/catalyst" rel="noopener noreferrer"&gt;Diagrid Catalyst account&lt;/a&gt;&amp;nbsp;(&lt;a href="https://pages.diagrid.io/catalyst-early-access-waitlist" rel="noopener noreferrer"&gt;sign up&lt;/a&gt; for early access) and the&amp;nbsp;&lt;a href="https://docs.diagrid.io/catalyst/references/cli-reference/intro" rel="noopener noreferrer"&gt;Diagrid CLI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vercel.com/signup" rel="noopener noreferrer"&gt;Vercel account (hobby)&lt;/a&gt;&amp;nbsp;and the&amp;nbsp;&lt;a href="https://vercel.com/docs/cli" rel="noopener noreferrer"&gt;Vercel CLI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ably.com/signup" rel="noopener noreferrer"&gt;Ably account (free)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dotnet.microsoft.com/download/dotnet/8.0" rel="noopener noreferrer"&gt;.NET 8 SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;Node 18&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the code for the website, serverless functions, and back-end services is available in the &lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo" rel="noopener noreferrer"&gt;catalyst-pizza-demo&lt;/a&gt; GitHub repository.  This repository contains a devcontainer configuration that has the following preinstalled: .NET 8, Node LTS, Vercel CLI, Diagrid CLI. &lt;/p&gt;

&lt;p&gt;You can use this devcontainer&amp;nbsp;&lt;a href="https://code.visualstudio.com/docs/devcontainers/containers" rel="noopener noreferrer"&gt;locally in VSCode&lt;/a&gt;&amp;nbsp;(requires&amp;nbsp;&lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;Docker Desktop&lt;/a&gt;) or directly in&amp;nbsp;&lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt;. The&amp;nbsp;&lt;em&gt;npm install&lt;/em&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;dotnet build&lt;/em&gt;&amp;nbsp;commands described in this article can be skipped if the devcontainer is used.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo/fork" rel="noopener noreferrer"&gt;Fork&lt;/a&gt;&amp;nbsp;the &lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo" rel="noopener noreferrer"&gt;catalyst-pizza-demo&lt;/a&gt; and clone it locally, or use GitHub Codespaces (recommended).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Ably
&lt;/h3&gt;

&lt;p&gt;Ably is used as the serverless realtime messaging component. There is a default Ably app when you sign up for an account that can be used for this demo. Alternatively, you can create a new Ably app.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log into the&amp;nbsp;&lt;a href="https://ably.com/accounts/" rel="noopener noreferrer"&gt;Ably portal&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Using the Ably portal: copy the&amp;nbsp;&lt;a href="https://ably.com/docs/ids-and-keys#api-key" rel="noopener noreferrer"&gt;Root API key&lt;/a&gt;&amp;nbsp;from the Ably app. This will be copied later as an environment variable for both Vercel and Diagrid.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Vercel
&lt;/h3&gt;

&lt;p&gt;The Vue-based&amp;nbsp;&lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo/tree/main/front-end/src" rel="noopener noreferrer"&gt;front-end&lt;/a&gt;&amp;nbsp;and two&amp;nbsp;&lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo/tree/main/front-end/api" rel="noopener noreferrer"&gt;JavaScript functions&lt;/a&gt;&amp;nbsp;are hosted on Vercel. The &lt;a href="https://vercel.com/docs/cli" rel="noopener noreferrer"&gt;Vercel CLI&lt;/a&gt; is used to configure and run these resources locally.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open a terminal in the root of the repository and login with the Vercel CLI:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel login
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to the&amp;nbsp;&lt;em&gt;front-end&lt;/em&gt;&amp;nbsp;folder and run:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go back to the root of the repository and set up the Vercel project by running:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Follow the CLI prompts, and select the following options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup and deploy:&amp;nbsp;&lt;code&gt;Y&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Scope:&amp;nbsp;&lt;code&gt;&amp;lt;account name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Link to existing project:&amp;nbsp;&lt;code&gt;N&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;What's your project's name?&amp;nbsp;&lt;code&gt;catalyst-pizza-project&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In which directory is your code located?&amp;nbsp;&lt;code&gt;./front-end&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Want to modify these settings? [y/N]&amp;nbsp;&lt;code&gt;n&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Wait for the deployment to complete.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;An environment variable is used in the&amp;nbsp;&lt;em&gt;getAblyToken&lt;/em&gt;&amp;nbsp;function to generate a token for the website to communicate with the Ably realtime service. Add the&amp;nbsp;&lt;em&gt;Ably API token&lt;/em&gt;&amp;nbsp;variable by running&amp;nbsp;&lt;code&gt;vercel env add&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variable name:&amp;nbsp;&lt;code&gt;ABLY_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Variable value:&amp;nbsp;&lt;em&gt;Use the Ably API key obtained from the Ably portal earlier&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Select&amp;nbsp;&lt;code&gt;Development&lt;/code&gt;&amp;nbsp;as the environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another environment variable is used in the&amp;nbsp;&lt;em&gt;placeOrder&lt;/em&gt;&amp;nbsp;function to send a request to the&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt; that will start the workflow. Add the&amp;nbsp;&lt;em&gt;WORKFLOW_URL&lt;/em&gt;&amp;nbsp;variable by running&amp;nbsp;&lt;code&gt;vercel env add&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variable name:&amp;nbsp;&lt;code&gt;WORKFLOW_URL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Variable value:&amp;nbsp;&lt;code&gt;http://localhost:5064/workflow/orderReceived&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select&amp;nbsp;&lt;code&gt;Development&lt;/code&gt;&amp;nbsp;as the environment.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run&amp;nbsp;&lt;code&gt;vercel pull&lt;/code&gt;&amp;nbsp;to pull the configuration from Vercel to your local environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run&amp;nbsp;&lt;code&gt;vercel build&lt;/code&gt;&amp;nbsp;to build the website and the serverless functions to ensure there are no errors.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Diagrid &lt;strong&gt;Catalyst&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Diagrid Catalyst provides serverless Dapr APIs that enables developers to quickly build distributed applications with workflow, pub/sub messaging, service invocation, and state management capabilities. Diagrid also provides managed infrastructure for storing data in a key/value store, pub/sub messaging, and workflow, which are all used in this solution.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.diagrid.io/catalyst/references/cli-reference/intro" rel="noopener noreferrer"&gt;Diagrid CLI&lt;/a&gt; is used to configure the resources and run the .NET services locally.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open another terminal in the root of the repository and use the Diagrid CLI to log in to Diagrid:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid login
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new Catalyst project named&amp;nbsp;&lt;em&gt;catalyst-pizza-project&lt;/em&gt;&amp;nbsp;and use the Diagrid managed pub/sub broker &amp;amp; KV store, and enable the managed workflow API:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid project create catalyst-pizza-project &lt;span class="nt"&gt;--deploy-managed-pubsub&lt;/span&gt; &lt;span class="nt"&gt;--deploy-managed-kv&lt;/span&gt; &lt;span class="nt"&gt;--enable-managed-workflow&lt;/span&gt; &lt;span class="nt"&gt;--wait&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To set this project as the default in the CLI run:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid project use catalyst-pizza-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new App ID for the&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid appid create pizzaorderservice
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new App ID for the&amp;nbsp;&lt;em&gt;KitchenService&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid appid create kitchenservice
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Before continuing, check the App ID status to make sure they are ready:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid appid list
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a pub/sub subscription for the&amp;nbsp;&lt;em&gt;KitchenService&lt;/em&gt;&amp;nbsp;to receive messages from the&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid subscription create pizzaorderssub &lt;span class="nt"&gt;--connection&lt;/span&gt; pubsub &lt;span class="nt"&gt;--topic&lt;/span&gt; pizza-orders &lt;span class="nt"&gt;--route&lt;/span&gt; /prepare &lt;span class="nt"&gt;--scopes&lt;/span&gt; kitchenservice
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a pub/sub subscription for the&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt;&amp;nbsp;to receive messages from the&amp;nbsp;&lt;em&gt;KitchenService&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid subscription create preparedorderssub &lt;span class="nt"&gt;--connection&lt;/span&gt; pubsub &lt;span class="nt"&gt;--topic&lt;/span&gt; prepared-orders &lt;span class="nt"&gt;--route&lt;/span&gt; /workflow/orderPrepared &lt;span class="nt"&gt;--scopes&lt;/span&gt; pizzaorderservice
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Verify that creation of the subscriptions is completed:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid subscription list
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run&amp;nbsp;&lt;code&gt;diagrid dev scaffold&lt;/code&gt;&amp;nbsp;to create a new local dev environment file. This creates a yaml file, named&amp;nbsp;&lt;em&gt;dev-.yaml&lt;/em&gt;&amp;nbsp;with the following content:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;catalyst-pizza-project&lt;/span&gt;
&lt;span class="na"&gt;apps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;appId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kitchenservice&lt;/span&gt;
&lt;span class="na"&gt;appPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_API_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;diagrid://&amp;lt;dapr_api_token&amp;gt;&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_APP_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kitchenservice&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_GRPC_ENDPOINT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://&amp;lt;grpc_endpoint&amp;gt;&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_HTTP_ENDPOINT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://&amp;lt;http_endpoint&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;workDir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kitchenservice&lt;/span&gt;
&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;appId&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pizzaorderservice&lt;/span&gt;
&lt;span class="na"&gt;appPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_API_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;diagrid://&amp;lt;dapr_api_token&amp;gt;&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_APP_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pizzaorderservice&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_GRPC_ENDPOINT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://&amp;lt;grpc_endpoint&amp;gt;&lt;/span&gt;
    &lt;span class="na"&gt;DAPR_HTTP_ENDPOINT&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://&amp;lt;http_endpoint&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;workDir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pizzaorderservice&lt;/span&gt;
&lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;appLogDestination&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This file is gitignored since it contains secrets from Diagrid Catalyst. The &lt;em&gt;appPort&lt;/em&gt;, &lt;em&gt;command&lt;/em&gt;, and &lt;em&gt;workDir&lt;/em&gt; attributes still need to be updated as follows: &lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Update the&amp;nbsp;&lt;em&gt;appPort&lt;/em&gt;&amp;nbsp;for the&amp;nbsp;&lt;em&gt;kitchenservice&lt;/em&gt;&amp;nbsp;to&amp;nbsp;&lt;code&gt;5066&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Update the&amp;nbsp;&lt;em&gt;appPort&lt;/em&gt;&amp;nbsp;for the&amp;nbsp;&lt;em&gt;pizzaorderservice&lt;/em&gt;&amp;nbsp;to&amp;nbsp;&lt;code&gt;5064&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Update the&amp;nbsp;&lt;em&gt;command&lt;/em&gt;&amp;nbsp;arguments to&amp;nbsp;&lt;code&gt;["dotnet", "run"]&lt;/code&gt;&amp;nbsp;for both apps.&lt;/li&gt;
&lt;li&gt;Update the&amp;nbsp;&lt;em&gt;workDir&lt;/em&gt;&amp;nbsp;argument to point to&amp;nbsp;&lt;code&gt;back-end/KitchenService&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code&gt;back-end/PizzaOrderService&lt;/code&gt;&amp;nbsp;respectively.&lt;/li&gt;
&lt;li&gt;Update the&amp;nbsp;&lt;em&gt;appLogDestination&lt;/em&gt;&amp;nbsp;to&amp;nbsp;&lt;code&gt;console&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add an&amp;nbsp;&lt;code&gt;ABLY_API_KEY&lt;/code&gt;&amp;nbsp;environment variable for the&amp;nbsp;&lt;em&gt;pizzaorderservice&lt;/em&gt;&amp;nbsp;appId and set the value to the Ably API key obtained from the Ably portal.&lt;/li&gt;
&lt;li&gt;Save the changes to the file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Update the key/value store to allow shared state&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The two .NET services share the same state in the key/value store to manage inventory and orders. Since this is not the default usage of state stores and services when using Dapr, an attribute needs to be set to enable this. The default behavior is that a key is prefixed with the app ID of the service that is using it. In this case, however, the&amp;nbsp;&lt;em&gt;keyPrefix&lt;/em&gt;&amp;nbsp;is set to&amp;nbsp;&lt;em&gt;name&lt;/em&gt;&amp;nbsp;to make sure both services use the same keys.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Run the following command to update the managed key/value store:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diagrid connection apply &lt;span class="nt"&gt;-f&lt;/span&gt; ./infra/kv.yml
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This will upload the&amp;nbsp;&lt;em&gt;kv.yml&lt;/em&gt;&amp;nbsp;file to Diagrid and update the configuration of the&amp;nbsp;&lt;em&gt;kvstore&lt;/em&gt;&amp;nbsp;connection so&amp;nbsp;&lt;em&gt;keyPrefix&lt;/em&gt;&amp;nbsp;is set to&amp;nbsp;&lt;em&gt;name&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Inspect the DaprClient configuration
&lt;/h3&gt;

&lt;p&gt;The two .NET services use the Dapr .NET client SDK for workflow, state management and pub/sub messaging. The&amp;nbsp;&lt;em&gt;DaprClient&lt;/em&gt;&amp;nbsp;is configured to use the endpoints provided by Diagrid Catalyst in the&amp;nbsp;&lt;em&gt;&lt;a href="https://github.com/diagrid-labs/catalyst-pizza-demo/blob/main/back-end/PizzaOrderService/Program.cs" rel="noopener noreferrer"&gt;Program.cs&lt;/a&gt;&lt;/em&gt;&amp;nbsp;file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;apiToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DAPR_API_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;grpcEndpoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DAPR_GRPC_ENDPOINT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;httpEndpoint&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DAPR_HTTP_ENDPOINT"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddDaprClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseDaprApiToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseGrpcEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grpcEndpoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;UseHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpEndpoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To use service invocation with the HTTP API, the&amp;nbsp;&lt;em&gt;HttpClient&lt;/em&gt;&amp;nbsp;is configured with the&amp;nbsp;&lt;em&gt;DAPR_APP_ID&lt;/em&gt;&amp;nbsp;and&amp;nbsp;&lt;em&gt;DAPR_API_TOKEN&lt;/em&gt;&amp;nbsp;environment variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;appId&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DAPR_APP_ID"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;apiToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetEnvironmentVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DAPR_API_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AddHttpClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"daprEndpoint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseAddress&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;httpEndpoint&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultRequestHeaders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;MediaTypeWithQualityHeaderValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultRequestHeaders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dapr-app-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;appId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DefaultRequestHeaders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dapr-api-token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;apiToken&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running &amp;amp; testing the solution
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open a terminal in the root of the repository.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To restore and build the .NET projects run:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet build ./back-end/PizzaOrderService
dotnet build ./back-end/KitchenService
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run&amp;nbsp;&lt;code&gt;diagrid dev start&lt;/code&gt;&amp;nbsp;to start the&amp;nbsp;&lt;em&gt;PizzaOrderService&lt;/em&gt;&amp;nbsp;and the&amp;nbsp;&lt;em&gt;KitchenService&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using another terminal in the root of the repository, run&amp;nbsp;&lt;code&gt;vercel dev&lt;/code&gt;&amp;nbsp;to start the website and the serverless functions locally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to the URL provided by the Vercel CLI to view the website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select some pizzas, place an order, and watch the progress of the workflow in realtime.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Using the Catalyst API explorer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You can use the API explorer in the Catalyst web UI to interact with the APIs. If you want to retrieve the order item from the key/value store that has just been processed, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the developer tools console of the browser that is running the demo (a pizza order must be started or completed).&lt;/li&gt;
&lt;li&gt;The order is logged to the console as a JSON object. Copy the&amp;nbsp;&lt;em&gt;OrderId&lt;/em&gt;&amp;nbsp;property value.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F82q8tifruveh69ym3ek1.png" alt="Console order" width="800" height="199"&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to the&amp;nbsp;&lt;a href="https://catalyst.diagrid.io/" rel="noopener noreferrer"&gt;Catalyst web UI&lt;/a&gt;. Ensure you're in the&amp;nbsp;&lt;em&gt;catalyst-pizza-project&lt;/em&gt;&amp;nbsp;project.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg58vyhxqrhxj63rntjp0.png" alt="Catalyst API explorer" width="800" height="557"&gt;
&lt;/li&gt;
&lt;li&gt;Select&amp;nbsp;&lt;em&gt;App IDs&lt;/em&gt;&amp;nbsp;in and click on the&amp;nbsp;&lt;em&gt;&lt;a href="https://catalyst.diagrid.io/app-ids/api-explorer/state-api/" rel="noopener noreferrer"&gt;API explorer&lt;/a&gt;&lt;/em&gt;&amp;nbsp;tab.

&lt;ul&gt;
&lt;li&gt;Select the&amp;nbsp;&lt;em&gt;State API&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Select the&amp;nbsp;&lt;em&gt;pizzaorderservice&lt;/em&gt;&amp;nbsp;as the app ID.&lt;/li&gt;
&lt;li&gt;Select&amp;nbsp;&lt;em&gt;GET&lt;/em&gt;&amp;nbsp;as the API operation.&lt;/li&gt;
&lt;li&gt;Select&amp;nbsp;&lt;em&gt;kvstore&lt;/em&gt;&amp;nbsp;as the state connection.&lt;/li&gt;
&lt;li&gt;Enter&amp;nbsp;&lt;em&gt;Order-&lt;/em&gt;&amp;nbsp;as the key, where &lt;em&gt;&lt;/em&gt;&amp;nbsp;is substituted with the value copied from the developer tools console.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Click&amp;nbsp;&lt;em&gt;Send&lt;/em&gt;. The response should show the state of the order item.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;Congratulations! You’ve now used the Diagrid Catalyst serverless Dapr APIs for workflow, pub/sub messaging, service invocation, and state management. The ability to use these APIs from anywhere, without the overhead of managing Kubernetes clusters, brings great flexibility to developers on any platform to build distributed applications. The Dapr applications used in this demo can be hosted on any cloud. The demo uses the Diagrid managed infrastructure for key/value storage and pub/sub messaging, but these can be swapped out for other cloud-based resources, similarly to switching open-source Dapr components. You can extend this demo with an alternative pub/sub broker or state store by configuring other &lt;a href="https://docs.diagrid.io/catalyst/concepts/connections" rel="noopener noreferrer"&gt;infrastructure connections&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Any questions or comments about this demo? Join the&amp;nbsp;&lt;a href="https://bit.ly/dapr-discord" rel="noopener noreferrer"&gt;Dapr Discord&lt;/a&gt; and drop us a message in the #diagrid channel!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>dapr</category>
      <category>tutorial</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Dapr as the Ultimate Microservices Patterns Framework</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Wed, 27 Sep 2023 09:06:20 +0000</pubDate>
      <link>https://dev.to/diagrid/dapr-as-the-ultimate-microservices-patterns-framework-20bj</link>
      <guid>https://dev.to/diagrid/dapr-as-the-ultimate-microservices-patterns-framework-20bj</guid>
      <description>&lt;p&gt;In the world of software development, microservices architecture stands out as the industry benchmark. This architectural style segments applications into distinct services, each deployable independently and organized around specific business capabilities. Such a design ensures flexibility, scalability, and resilience, with each service typically overseen by a specialized team. However, while this approach offers numerous benefits, it also introduces complexities. To navigate these challenges, developers turn to patterns, drawing parallels to time-tested design patterns from traditional software development, providing solutions for building robust distributed systems. For those seeking a comprehensive guide on these patterns, Chris Richardson’s &lt;a href="https://microservices.io/patterns/index.html" rel="noopener noreferrer"&gt;microservices.io&lt;/a&gt; stands as a trusted repository, rich with insights and best practices from industry experts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feedd9afboxcjv3xznf5n.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feedd9afboxcjv3xznf5n.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A pattern language for microservices by Chris Richardson&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;However, understanding patterns is just one part of the equation. Implementing them in real-world scenarios requires tools and frameworks. Positioned as a premier microservices chassis, &lt;a href="http://dapr.io/" rel="noopener noreferrer"&gt;Dapr&lt;/a&gt; is crafted for creating distributed applications that are secure, resilient, scalable, and observable. It doesn't merely align with the microservices patterns; it amplifies their potential, refining and simplifying their real-world implementation. &lt;/p&gt;

&lt;p&gt;In the subsequent sections, I'll go through the patterns outlined in microservices.io, shedding light on how Dapr helps implement each. While numerous frameworks aim to address the cross-cutting concerns inherent in microservices, Dapr distinguishes itself. Its polyglot nature, sidecar operational mode, and non-restrictive stance on application architecture make it a unique and invaluable asset in the microservices toolkit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microservice Chassis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When embarking on the development of an application, developers often find themselves investing significant time in addressing cross-cutting concerns such as security, externalized configuration, logging, health checks, metrics, and distributed tracing. While these elements might seem straightforward, defining a curated set of dependencies that will be used in tens or hundreds of services can be a complex endeavor. The challenge amplifies when adopting a microservices architecture, given the multitude of services and the frequent creation of new ones. The &lt;a href="https://microservices.io/patterns/microservice-chassis.html" rel="noopener noreferrer"&gt;Microservice Chassis&lt;/a&gt; pattern offers a solution by proposing the creation of a framework that serves as the foundation for microservices development. This chassis provides reusable build logic and mechanisms to handle these cross-cutting concerns, streamlining the development process.&lt;/p&gt;

&lt;p&gt;As a polyglot framework, Dapr seamlessly handles cross-cutting concerns, allowing developers to focus on core functionalities without getting entangled in complexities. It provides built-in mechanisms for security, configuration management, logging, and more. With features like the Access Control capabilities for security, Configuration API for externalized settings, and health API endpoints for monitoring, Dapr ensures that these foundational concerns are seamlessly integrated, allowing developers to focus on core business logic without getting mired in the intricacies of these concerns. Unlike other frameworks, Dapr doesn't impose constraints on the application, granting developers the freedom to choose their preferred language, runtime, and programming style. In essence, Dapr transforms the theoretical benefits of the Microservice Chassis pattern into tangible results for real-world applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sidecar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In microservices, there's often a need to augment services with additional capabilities without modifying the core service logic. The &lt;a href="https://microservices.io/patterns/deployment/sidecar.html" rel="noopener noreferrer"&gt;Sidecar pattern&lt;/a&gt; addresses this requirement. It involves deploying components of an application into separate processes or containers to provide a modular and scalable architecture. The main service runs in one container, and the sidecar service, which extends or enhances the main service, runs in a separate container but in the same network namespace. This ensures that the main service and the sidecar can communicate as if they are in the same process while being isolated from each other. The primary advantage of this pattern is the ability to separate concerns, modularize your application, and ensure that each component is focused on a specific responsibility.&lt;/p&gt;

&lt;p&gt;Dapr is among the most popular implementations of the Sidecar pattern. When integrated into a microservices environment, Dapr runs as a sidecar alongside your service, providing a plethora of additional capabilities without requiring any changes to the main service. This includes features like state management, service-to-service invocation, pub/sub messaging, and more. By leveraging Dapr's sidecar architecture, developers can augment their services with powerful features, ensuring a robust, scalable, and feature-rich microservices ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Mesh&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As the number of services grows, managing inter-service communication, security, and observability becomes increasingly complex. A Service Mesh is a dedicated infrastructure layer built to handle service-to-service communication in a transparent and technology-agnostic manner. It provides features like load balancing, service discovery, observability, and security without requiring changes to the application code. By offloading these concerns to the Service Mesh, developers can focus on building business logic, while the mesh ensures that services can securely and efficiently communicate with each other.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fja2mwgi1o8lmnzuli8wa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fja2mwgi1o8lmnzuli8wa.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How Dapr and service meshes compare&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr operates as a &lt;a href="https://docs.dapr.io/concepts/service-mesh/" rel="noopener noreferrer"&gt;lightweight service mesh&lt;/a&gt;, providing a network layer that facilitates service discovery and ensures secure service-to-service interactions. While there are overlapping capabilities between Dapr and traditional service meshes, Dapr distinguishes itself by being developer-centric, focusing on building blocks that simplify microservices development. Unlike service meshes which are primarily infrastructure-centric and deal with network concepts like IP and DNS addresses, Dapr offers service discovery and invocation via names, a more developer-friendly approach. Beyond the common features like mTLS encryption, metric collection, and distributed tracing, Dapr introduces application-level building blocks for state management, pub/sub messaging, actors, and more. This ensures that developers gain a comprehensive toolset, not just for networking, but for holistic microservices development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saga&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the world of microservices, ensuring data consistency across services can be a challenge, especially when each service has its own database. The Saga pattern provides a solution to this challenge. Instead of relying on traditional distributed transactions, the &lt;a href="https://microservices.io/patterns/data/saga.html" rel="noopener noreferrer"&gt;Saga pattern&lt;/a&gt; breaks the transaction into a series of local transactions, each executed within its own service and database. These local transactions are coordinated in a specific sequence to ensure overall data consistency. If one local transaction fails, compensating transactions are executed to revert the changes made by the previous transactions. This approach offers a way to maintain data consistency without the need for distributed transactions, which are often not feasible in microservices architectures.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4iu1ug9pew2vj7uht52s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4iu1ug9pew2vj7uht52s.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr workflow overview&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr offers a concrete solution to implement the Saga pattern through its Workflow API. This API allows developers to sequence local transactions, or implement other &lt;a href="https://www.diagrid.io/blog/in-depth-guide-to-dapr-workflow-patterns" rel="noopener noreferrer"&gt;stateful workflow patterns&lt;/a&gt; ensuring that data remains consistent across services. &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/workflow/workflow-overview/" rel="noopener noreferrer"&gt;Dapr Workflow API&lt;/a&gt; serves as a foundational tool in this regard, streamlining the process and ensuring reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transactional Outbox&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In microservices architectures, a common challenge arises when a service command needs to update aggregates in the database and simultaneously send messages or events to a message broker. The goal is to ensure atomicity - if the database transaction commits, the messages must be sent; if the database rolls back, the messages must not be sent. Traditional distributed transactions (2PC) are often not feasible or desirable due to various constraints. The &lt;a href="https://www.infoq.com/articles/saga-orchestration-outbox/" rel="noopener noreferrer"&gt;Transactional Outbox&lt;/a&gt; pattern addresses this issue. It suggests that the service stores the message in the database as part of the transaction that updates the business entities. A separate process then retrieves and sends these messages to the message broker. This ensures that messages are sent only if the database transaction commits, preserving data consistency and order of operations.&lt;/p&gt;

&lt;p&gt;Dapr provides a robust solution to this challenge with its &lt;a href="https://github.com/dapr/dapr/issues/4233" rel="noopener noreferrer"&gt;Outbox feature&lt;/a&gt; in StateStore API. This feature allows for atomic updates to the database while also sending messages to the designated broker. By utilizing the StateStore API, developers can seamlessly integrate the Transactional Outbox pattern into their microservices, ensuring data consistency and reliable message delivery across large number of databases and message brokers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Messaging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the realm of microservices, reliable asynchronous communication between services is paramount. Instead of services communicating directly with synchronous calls, they exchange messages via message channels. This &lt;a href="https://microservices.io/patterns/communication-style/messaging.html" rel="noopener noreferrer"&gt;asynchronous mode&lt;/a&gt; of communication decouples services, allowing them to operate independently. It ensures that even if one service is slow or unavailable, others can continue their operations without being directly affected. This approach enhances the system's resilience, scalability, and flexibility. &lt;/p&gt;

&lt;p&gt;Dapr's &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/pubsub/howto-publish-subscribe/" rel="noopener noreferrer"&gt;PubSub API&lt;/a&gt; is tailored to harness the power of asynchronous messaging for inter-service communication. By leveraging this API, developers can easily implement messaging patterns in their microservices architecture. The PubSub API ensures reliable message delivery, supports multiple messaging brokers, and abstracts the complexities of direct broker interactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request/Reply Interaction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://microservices.io/patterns/communication-style/rpi.html" rel="noopener noreferrer"&gt;Remote Procedure Invocation&lt;/a&gt; (RPI) is a communication style that enables services in a microservices architecture to communicate with each other by invoking methods in a remote service. The primary advantage of RPI is its straightforwardness, allowing for direct, point-to-point communication between services. However, it's essential to manage the associated challenges, such as service discovery, reliability, encryption, to ensure the system remains resilient and secure.&lt;/p&gt;

&lt;p&gt;Dapr addresses the challenges with its &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/" rel="noopener noreferrer"&gt;Service Invocation API&lt;/a&gt;. This API provides an RPI-based protocol tailored for inter-service communication in a microservices setup. By abstracting the underlying complexities, Dapr ensures that services can communicate synchronously without getting entangled in the intricacies of direct service-to-service calls. Moreover, Dapr's Service Invocation API offers built-in features like retries, error handling, and traffic control, ensuring that communications are both reliable and secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Circuit Breaker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a microservices architecture, services often collaborate to handle requests. However, when one service synchronously invokes another, there's a risk that the called service might be unavailable or might exhibit high latency, rendering it essentially unusable. Such scenarios can lead to resource exhaustion in the calling service, making it unable to handle other requests. This can further cascade the failure to other services throughout the application. The &lt;a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker" rel="noopener noreferrer"&gt;Circuit Breaker pattern&lt;/a&gt; addresses this challenge. It functions similarly to an electrical circuit breaker. When consecutive failures cross a certain threshold, the circuit breaker "trips." For a set timeout period, all attempts to invoke the problematic service fail immediately. After this period, the circuit breaker allows a few test requests. If these succeed, normal operation resumes; if not, the timeout period restarts.&lt;/p&gt;

&lt;p&gt;Dapr offers a concrete solution to this challenge with its &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/#resilience" rel="noopener noreferrer"&gt;Resiliency policy&lt;/a&gt;. This policy ensures that when the failure rate of a call exceeds a certain threshold, the call fails immediately, preventing resource exhaustion and potential cascading failures. By leveraging Dapr's resiliency policy, developers can implement the Circuit Breaker pattern efficiently, ensuring that their microservices architecture remains robust and resilient against unexpected service failures or latencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access Token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the intricate landscape of microservices, ensuring secure communication and access between services is paramount. The &lt;a href="https://microservices.io/patterns/security/access-token.html" rel="noopener noreferrer"&gt;Access Token pattern&lt;/a&gt; involves issuing tokens to clients, granting them limited access to a service. These tokens encapsulate the information required to determine whether a client is authorized to perform a given operation. The primary advantage of using access tokens is that they provide a way to ensure that only authenticated and authorized clients can access services or specific operations within those services. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6ivoxf3oet988fk46qx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6ivoxf3oet988fk46qx.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr secure communications architecture&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr provides a robust mechanism to implement this pattern through its &lt;a href="https://docs.dapr.io/operations/configuration/invoke-allowlist/" rel="noopener noreferrer"&gt;Access Control&lt;/a&gt; capabilities based on &lt;a href="https://spiffe.io/" rel="noopener noreferrer"&gt;SPIFFE  Ids&lt;/a&gt;. With Dapr's Access Control, developers can define and enforce policies that restrict what operations calling applications can perform on the called app. This ensures a fine-grained control over service interactions, making the system more secure and resilient against potential threats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Instance per Container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://microservices.io/patterns/deployment/service-per-container.html" rel="noopener noreferrer"&gt;Service Instance per Container pattern&lt;/a&gt; deployment strategy, places each service instance in its own container. Containers, being lightweight and isolated, provide an environment where the service can run with its dependencies, ensuring consistency across different stages of deployment. This approach offers several benefits: it ensures isolation, making each service instance independent of others; it provides scalability, as new instances can be spun up quickly; and it enhances &lt;a href="https://www.diagrid.io/blog/practical-portability-principles" rel="noopener noreferrer"&gt;portability&lt;/a&gt;, as each service containts its built-time dependencies.&lt;/p&gt;

&lt;p&gt;Dapr aligns perfectly with this deployment model as it  is designed to operate best in containerized environments. When a service is deployed with Dapr, a Dapr sidecar container runs alongside the service container, enhancing its capabilities without intruding into the service's operations. &lt;a href="https://docs.dapr.io/operations/hosting/kubernetes/kubernetes-overview/" rel="noopener noreferrer"&gt;Dapr's deployment model&lt;/a&gt;, ensures that each service instance, along with its Dapr sidecar, remains isolated in its container, benefiting from the inherent advantages of the Service Instance per Container pattern such as scalable, and resilient microservices deployments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Instance per VM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In certain deployment scenarios, especially when dealing with large-scale applications or when containers might not be the optimal choice, deploying each service instance on its own Virtual Machine (VM) becomes a viable strategy. The &lt;a href="https://microservices.io/patterns/deployment/service-per-vm.html" rel="noopener noreferrer"&gt;Service Instance per VM pattern&lt;/a&gt; emphasizes this approach. By allocating a dedicated VM for each service instance, you ensure that the service has a dedicated set of resources, leading to predictable performance. This isolation also means that failures or resource contention in one service won't directly impact others. Moreover, VMs provide a higher degree of isolation compared to containers, which can be crucial for certain security or compliance requirements.&lt;/p&gt;

&lt;p&gt;Dapr is versatile and can be seamlessly deployed in a VM-based environment. Whether you're deploying Dapr on its own dedicated VM or using &lt;a href="https://github.com/dapr-sandbox/dapr-ambient" rel="noopener noreferrer"&gt;Dapr Ambient&lt;/a&gt; to share its capabilities among multiple Pods, Dapr ensures that microservices can communicate and operate efficiently. This flexibility means that developers aren't confined to containerized environments and can leverage Dapr's capabilities in VM-based deployments, ensuring that the benefits of Dapr, such as state management, service invocation, and pub/sub messaging, are available regardless of the deployment strategy. &lt;a href="https://docs.dapr.io/operations/hosting/" rel="noopener noreferrer"&gt;Dapr's deployment documentation&lt;/a&gt; provides insights into how it can be integrated into various environments, including VMs, or &lt;a href="https://twitter.com/daprdev/status/1529862546789785602" rel="noopener noreferrer"&gt;the real edge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Discovery&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In microservices architectures, the dynamic nature of service instances and their locations, especially in containerized environments, presents a challenge: how does a client of a service discover the location of a service instance? Two prevalent patterns address this challenge: &lt;a href="https://microservices.io/patterns/client-side-discovery.html" rel="noopener noreferrer"&gt;Client-side Discovery&lt;/a&gt; and &lt;a href="https://microservices.io/patterns/server-side-discovery.html" rel="noopener noreferrer"&gt;Server-side Discovery&lt;/a&gt;. The former involves clients querying a Service Registry to discover the current locations of service instances, ensuring they always communicate with available and healthy instances. On the other hand, the Server-side Discovery pattern simplifies client code by routing requests via a knowledgeable router, often a load balancer, which interacts with the service registry.&lt;/p&gt;

&lt;p&gt;Dapr's sidecar architecture adeptly addresses both these patterns. While the sidecar operates alongside a service, akin to a client, it isn't embedded within the application. This unique positioning allows it to query a service registry, discovering other service instances' locations, and also act as a router for inter-service calls. By offloading the intricacies of service discovery to the Dapr &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/" rel="noopener noreferrer"&gt;Service Invocation API&lt;/a&gt;, developers can ensure reliable service-to-service communication, even in environments where service locations change dynamically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service Registry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In dynamic microservices environments, the locations and number of service instances can frequently change. This poses a challenge: how can clients or routers be aware of the current available instances of a service? The &lt;a href="https://microservices.io/patterns/service-registry.html" rel="noopener noreferrer"&gt;Service Registry pattern&lt;/a&gt; offers a solution. It proposes a centralized registry where service instances register themselves upon startup and deregister upon shutdown. This registry acts as a database of services, their instances, and their locations. Clients or routers can then query this registry to discover the current locations of service instances. &lt;/p&gt;

&lt;p&gt;Dapr offers a seamless integration with the Service Registry concept, providing a unified interface to various service registry implementations. Dapr's pluggable &lt;a href="https://docs.dapr.io/reference/components-reference/supported-name-resolution/" rel="noopener noreferrer"&gt;name resolution&lt;/a&gt; components used in Service Invocation API cater to diverse hosting platforms, from Kubernetes, which utilizes its DNS service, to self-hosted machines using mDNS or even HashiCorp's Consul in varied environments. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Self Registration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://microservices.io/patterns/self-registration.html" rel="noopener noreferrer"&gt;Self Registration pattern&lt;/a&gt; ensures that services can discover each other in  inter-service communication. When a service instance starts up, instead of relying on an external agent or system to register it with a service registry, the service instance itself takes the responsibility of registering. This ensures that the service registry always has the most up-to-date information about available service instances. By automating the registration process, the Self Registration pattern reduces manual intervention, potential errors, and ensures that the service registry is always current.&lt;/p&gt;

&lt;p&gt;When a service with a Dapr sidecar is deployed, the Dapr sidecar takes the initiative to register itself with the service registry. This automated process ensures that the service is immediately discoverable by other services in the ecosystem. This not only simplifies the deployment process but also enhances the reliability and efficiency of service-to-service communication in architectures built with Dapr.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3rd Party Registration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In some microservices architectures, not all services or endpoints are created or managed by the same team or entity. There might be third-party services or endpoints that need to be integrated into the system. These third-party services might not follow the same registration patterns as internal services. With the &lt;a href="https://microservices.io/patterns/3rd-party-registration.html" rel="noopener noreferrer"&gt;3rd Party Registration pattern&lt;/a&gt;, instead of the service registering itself (as in Self Registration), an external agent or system is responsible for registering the service with the service registry. This ensures that third-party services, which might not have the capability or permission to register themselves, are still discoverable and can be integrated seamlessly into the system.&lt;/p&gt;

&lt;p&gt;Dapr offers flexibility in this regard too. Even &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-non-dapr-endpoints/" rel="noopener noreferrer"&gt;non-Dapr 3rd party endpoints&lt;/a&gt; can be registered within the Dapr runtime, ensuring they benefit from service discovery, resiliency, and observability features that Dapr provides. This means that developers can integrate third-party services into their Dapr-enabled microservices architecture without those services being Dapr-aware. This allows a more cohesive and resilient microservices ecosystem, irrespective of the origin of the services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Externalized Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the world of microservices, applications often interact with various infrastructure and third-party services. Examples include service registries, message brokers, databases, payment processors, and more. A significant challenge arises when trying to ensure that a service can run across multiple environments (like dev, test, staging, production) without any modifications. The &lt;a href="https://microservices.io/patterns/externalized-configuration.html" rel="noopener noreferrer"&gt;Externalized Configuration pattern&lt;/a&gt; recommends externalizing all application configurations. This ensures that the service remains environment-agnostic and can adapt to different setups without any code changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nhlz8oe3fpin93xrktk.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8nhlz8oe3fpin93xrktk.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr secrets stores overview&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr provides a robust solution to this challenge with its &lt;a href="https://docs.dapr.io/developing-applications/building-blocks/secrets/secrets-overview/" rel="noopener noreferrer"&gt;Secrets and Configuration APIs&lt;/a&gt;. These APIs allow developers to externalize configurations, including sensitive information like database credentials. Instead of hardcoding configurations or placing them in easily accessible files, Dapr ensures that they are securely stored and can be fetched dynamically when needed. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Health Check API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a microservices architecture, ensuring the health, availability, and self-healing of service instances is paramount. The &lt;a href="https://microservices.io/patterns/observability/health-check-api.html" rel="noopener noreferrer"&gt;Health Check API pattern&lt;/a&gt; proposes that each service should expose an API endpoint (e.g., HTTP /health) that indicates the health status of the service. This endpoint performs various checks, such as the status of connections to infrastructure services, the health of the host (e.g., disk space), and any application-specific logic. By periodically querying this endpoint, monitoring systems, service registries, or load balancers can determine the health of a service instance. This ensures that alerts are generated for unhealthy instances, and requests are only routed to healthy service instances, enhancing the reliability and efficiency of the system.&lt;/p&gt;

&lt;p&gt;Dapr elevates the health check pattern by conducting periodic health checks on your service, ensuring its optimal functioning. Once  &lt;a href="https://docs.dapr.io/operations/resiliency/health-checks/app-health/" rel="noopener noreferrer"&gt;app health checks&lt;/a&gt; are enabled, the Dapr sidecar routinely polls the application. If a health issue is detected, Dapr takes proactive measures: it unsubscribes from all pub/sub subscriptions, halts all input bindings, and short-circuits service-invocation requests, ensuring they aren't forwarded to the application. This comprehensive approach ensures that any potential issues are swiftly identified and mitigated, fostering a robust and resilient system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Distributed Tracing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In complex microservices architectures, understanding the flow of requests across multiple services can be challenging. The &lt;a href="https://microservices.io/patterns/observability/distributed-tracing.html" rel="noopener noreferrer"&gt;Distributed Tracing pattern&lt;/a&gt; involves instrumenting services with code that assigns each external request a unique identifier. This identifier is then passed to all services involved in handling the request. By doing so, it becomes possible to trace the journey of a request across various services, recording information such as start time, end time, and other relevant metrics providing invaluable insights into the behavior of the system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6243nigohsy948empa4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6243nigohsy948empa4.jpeg" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Dapr distributed tracing overview&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dapr automatically takes care of creating trace headers and ensures they are captured and forwarded appropriately. With Dapr’s &lt;a href="https://docs.dapr.io/operations/observability/tracing/tracing-overview/" rel="noopener noreferrer"&gt;observability capabilities&lt;/a&gt;, developers don't need to manually instrument their code for tracing; Dapr handles it seamlessly. Moreover, Dapr integrates with popular tracing systems, ensuring that the traces can be visualized and analyzed in a centralized manner. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application Metrics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://microservices.io/patterns/observability/application-metrics.html" rel="noopener noreferrer"&gt;Application Metrics&lt;/a&gt; are a set of quantitative data points that provide insights into the performance, behavior, and health of an application or service. By collecting and analyzing these metrics, developers and operations teams can identify bottlenecks, detect anomalies, and optimize the performance of their services, enabling proactive monitoring and ensuring optimal system health.&lt;/p&gt;

&lt;p&gt;Dapr automatically gathers a wide range of &lt;a href="https://docs.dapr.io/operations/observability/metrics/metrics-overview/" rel="noopener noreferrer"&gt;networking metrics&lt;/a&gt;, capturing data related to request rates, error rates, and latency, among others. Dapr ensures that these metrics are delivered to a centralized metrics service, allowing for comprehensive monitoring and analysis. This means that developers and operations teams can have a unified view of the system's performance, irrespective of the number of services or their complexity. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serverless Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the evolving landscape of software development, the need for scalable, and cost-effective deployment solutions is growing. &lt;a href="https://microservices.io/patterns/deployment/serverless-deployment.html" rel="noopener noreferrer"&gt;Serverless Deployment&lt;/a&gt; refers to a deployment infrastructure that abstracts away any concept of servers, be it physical, virtual hosts, or containers. The primary advantage is that developers can focus solely on their code, without concerning themselves with the underlying infrastructure. The serverless platform automatically scales services based on the load, ensuring optimal resource utilization.&lt;/p&gt;

&lt;p&gt;Dapr is gearing up for the &lt;a href="https://www.diagrid.io/blog/evolution-of-cloud-computing" rel="noopener noreferrer"&gt;serverless era&lt;/a&gt; too. Soon, developers will be able to access Dapr's rich capabilities as serverless APIs. This means that the vast array of features Dapr offers, from state management to messaging, will be available in a serverless context, ensuring developers get the best of both worlds. By integrating Dapr into serverless environments, developers can ensure more robust, scalable, and feature-rich applications without the complexities of managing the Dapr infrastructure. For the updates on this pattern, follow &lt;a href="https://twitter.com/diagridio" rel="noopener noreferrer"&gt;@diagridio&lt;/a&gt; on Twitter and you can be among the first to try it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Patterns play a pivotal role in software development, serving as a shared language to communicate common challenges and best practices. They encapsulate proven solutions to recurring problems, ensuring that developers don't have to reinvent the wheel with each new project. However, while patterns provide a conceptual blueprint, they remain abstract ideas. Historically, the challenges of building reliable applications and the implementations of these patterns were addressed using application servers, service buses, and microservices frameworks like Spring Cloud, among other language-specific solutions. But to truly bring these patterns to life in the modern era, we need cloud-native frameworks and chassis like Dapr. Dapr tackles these common engineering challenges by presenting patterns as polyglot APIs, aligning with the cloud-native philosophy and &lt;a href="https://www.diagrid.io/blog/dapr-as-a-10x-platform" rel="noopener noreferrer"&gt;offering benefits&lt;/a&gt; to the whole organization. This ensures that developers can leverage best practices across multiple languages and platforms, streamlining the development process and enhancing application resilience and scalability.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Top 20 Must-Read Software Trends Reports for 2023</title>
      <dc:creator>Bilgin Ibryam</dc:creator>
      <pubDate>Thu, 20 Jul 2023 09:14:09 +0000</pubDate>
      <link>https://dev.to/diagrid/top-20-must-read-software-trends-reports-for-2023-2bf3</link>
      <guid>https://dev.to/diagrid/top-20-must-read-software-trends-reports-for-2023-2bf3</guid>
      <description>&lt;p&gt;In the rapidly evolving software industry, keeping up with new trends, tools, and best practices can be time-consuming. With so much information available, where do you start, and what sources can you trust? I've curated a list of reports that I follow to stay informed and ahead of the curve. These provide insights into everything from programming languages to DevOps, cloud strategy, and security. If you're interested in the latest trends and fascinating posts I come across, &lt;a href="https://twitter.com/bibryam" rel="noopener noreferrer"&gt;follow me&lt;/a&gt; or check out my latest writing on industry trends over at the Diagrid &lt;a href="https://www.diagrid.io/blog" rel="noopener noreferrer"&gt;blog&lt;/a&gt;. I share anything I find insightful and worth reading in the world of cloud and distributed systems. &lt;/p&gt;

&lt;p&gt;Here are the top 20 reports for 2023 (in no particular order) I came across so far:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.tiobe.com/tiobe-index/" rel="noopener noreferrer"&gt;Programming Community Index for June 2023 - TIOBE
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://redmonk.com/sogrady/2023/05/16/language-rankings-1-23/" rel="noopener noreferrer"&gt;Programming Language Rankings - January 2023 - RedMonk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://survey.stackoverflow.co/2023/" rel="noopener noreferrer"&gt;Developer Survey 2023 - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/articles/cloud-devops-trends-2023/" rel="noopener noreferrer"&gt;DevOps and Cloud Trends Report – July 2023 - InfoQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.infoq.com/podcasts/architecture-trends-report-2023/" rel="noopener noreferrer"&gt;Software Architecture &amp;amp; Design Trends 2023 - InfoQ&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postman.com/state-of-api/" rel="noopener noreferrer"&gt;State of the API Report 2023 - Postman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.datadoghq.com/state-of-application-security/" rel="noopener noreferrer"&gt;State of Application Security Report 2023 - DataDog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thoughtworks.com/radar/platforms/dapr" rel="noopener noreferrer"&gt;Technology Radar Vol 28 - Thoughtworks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learning.oreilly.com/library/view/radar-trends-to/9781098156527/ch01.html" rel="noopener noreferrer"&gt;Radar Trends to Watch: June 2023 - O'Reilly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.hashicorp.com/state-of-the-cloud" rel="noopener noreferrer"&gt;State of Cloud Strategy Survey 2023 - HashiCorp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.redhat.com/en/resources/state-kubernetes-security-report-2023" rel="noopener noreferrer"&gt;State of Kubernetes Security Report 2023 - Red Hat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.puppet.com/resources/state-of-platform-engineering" rel="noopener noreferrer"&gt;The State of Platform Engineering Report - PuppetLabs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tanzu.vmware.com/content/ebooks/stateofkubernetes-2023" rel="noopener noreferrer"&gt;State of Kubernetes 2023 - Vmware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deno.com/blog/state-of-edge-functions-2023" rel="noopener noreferrer"&gt;The State of Edge Functions 2023 - Deno&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://state-of-data.com/" rel="noopener noreferrer"&gt;State of Data 2023 - AirByte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.databricks.com/discover/state-of-data-ai" rel="noopener noreferrer"&gt;State of Data + AI 2023 - Databricks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://octoverse.github.com/" rel="noopener noreferrer"&gt;The State of Open Source Software 2022 - Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stateofapis.com/" rel="noopener noreferrer"&gt;State of APIs 2022 - RapidAPI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cncf.io/reports/cncf-annual-survey-2022/" rel="noopener noreferrer"&gt;CNCF Annual Survey 2022 - CNCF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/products/devops-sre/dora-2022-accelerate-state-of-devops-report-now-out" rel="noopener noreferrer"&gt;State of DevOps Report 2022 - Google&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While these reports offer valuable insights, it's important to keep in mind that they can be opinionated. The key to effectively leveraging these resources lies in cross-verifying trends from multiple sources and using them only as a guide for direction rather than absolute truths. &lt;/p&gt;

&lt;p&gt;Are there any reports that should be on this list? Tag me on Twitter and I'll include them, subject to my checks  I'm always keen to explore new sources! Found this list helpful? Go ahead, &lt;a href="https://twitter.com/intent/tweet?text=Top%2020%20Must-Read%20Software%20Trends%20Reports%20by%20%40bibryam&amp;amp;url=https%3A%2F%2Fwww.ofbizian.com%2F2023%2F07%2Ftop-20-must-read-software-reports.html" rel="noopener noreferrer"&gt;share it&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Call to action: Are you a &lt;a href="https://dapr.io/" rel="noopener noreferrer"&gt;Dapr&lt;/a&gt; user? Your experience is valuable! Contribute your insights and shape the &lt;a href="https://22146261.hs-sites.com/state-of-dapr-2023-survey?utm_medium=social&amp;amp;utm_source=twitter" rel="noopener noreferrer"&gt;State of Dapr Report&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>cloud</category>
      <category>kubernetes</category>
      <category>data</category>
    </item>
  </channel>
</rss>
