<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[rohitmungre | RSS Feed]]></title><description><![CDATA[Software engineer and creator. This is my digital garden.]]></description><link>https://rohitmungre.com</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 03 Apr 2026 17:26:06 GMT</lastBuildDate><item><title><![CDATA[Orchestration using Kubernetes]]></title><description><![CDATA[Kubernetes (abbreviated as K8s) is a portable, extensible, open-source platform for managing containerized applications at scale. Kubernetes…]]></description><link>https://rohitmungre.com/kubernetes/</link><guid isPermaLink="false">https://rohitmungre.com/kubernetes/</guid><pubDate>Sat, 14 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://kubernetes.io/&quot;&gt;Kubernetes&lt;/a&gt; (abbreviated as K8s) is a portable, extensible, open-source platform for managing containerized applications at scale. Kubernetes abstracts infrastructure away from application logic and provides powerful primitives for deploying, scaling, and maintaining containerized workloads. It provides high availability, scalability, resilience for the application. Kuberenetes was originally developed at Google as Bord task scheduler, it&apos;s &lt;a href=&quot;https://cloud.google.com/blog/products/containers-kubernetes/from-google-to-the-world-the-kubernetes-origin-story&quot;&gt;origin story&lt;/a&gt; and the journey to getting open sourced is quite fascinating!&lt;/p&gt;
&lt;p&gt;This guide walks through Kubernetes by demonstrating foundational concepts using &lt;code class=&quot;language-text&quot;&gt;kubectl&lt;/code&gt; to advanced architecture and operational strategies.&lt;/p&gt;
&lt;h2 id=&quot;core-concepts-with-kubectl&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#core-concepts-with-kubectl&quot; aria-label=&quot;core concepts with kubectl permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Core concepts with Kubectl&lt;/h2&gt;
&lt;p&gt;Before running commands below, make sure to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install kubectl on using the &lt;a href=&quot;https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/&quot;&gt;official installation guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Install &lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot;&gt;docker desktop&lt;/a&gt; and enable Kubernetes in settings for starting a local kubernetes server. Other options include &lt;a href=&quot;https://k3d.io/&quot;&gt;k3d&lt;/a&gt; (fast, lightweight), &lt;a href=&quot;https://kind.sigs.k8s.io/&quot;&gt;kind&lt;/a&gt; (quick local testing), &lt;a href=&quot;https://microk8s.io/&quot;&gt;MicroK8s&lt;/a&gt; (full k8s experience with low resource usage) and  &lt;a href=&quot;https://minikube.sigs.k8s.io/docs/start/?arch=%2Flinux%2Fx86-64%2Fstable%2Fbinary+download&quot;&gt;minikube&lt;/a&gt; (full VM style k8s experience).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;cluster&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cluster&quot; aria-label=&quot;cluster permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cluster&lt;/h3&gt;
&lt;p&gt;A Kubernetes deployment consists of multiple nodes managed by a centralized control plane.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl cluster-info&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;nodes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#nodes&quot; aria-label=&quot;nodes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Nodes&lt;/h3&gt;
&lt;p&gt;Worker machines (VMs or physical) where pods are scheduled and run. Nodes are managed by the Kubernetes control plane.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl get nodes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;pods&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#pods&quot; aria-label=&quot;pods permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Pods&lt;/h3&gt;
&lt;p&gt;The smallest deployable unit in Kubernetes. A pod encapsulates one or more containers with shared networking and storage. Pods are ephemeral – they can die and be replaced.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl run my-nginx &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;nginx   &lt;span class=&quot;token comment&quot;&gt;# Creates a pod using nginx&lt;/span&gt;
kubectl get pods                     &lt;span class=&quot;token comment&quot;&gt;# See your pod&lt;/span&gt;
kubectl describe pod my-nginx        &lt;span class=&quot;token comment&quot;&gt;# Get detailed info&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;deployments&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deployments&quot; aria-label=&quot;deployments permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deployments&lt;/h3&gt;
&lt;p&gt;Provide declarative updates for pods and replica sets. They manage rollout, rollback, and scaling of applications.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ReplicaSets ensure a specified number of pod replicas are running at any given time.&lt;/li&gt;
&lt;li&gt;Deployment strategies include
&lt;ul&gt;
&lt;li&gt;Rolling updates: Gradually replace pods with new ones&lt;/li&gt;
&lt;li&gt;Blue/Green deployments: Maintain two environments and switch traffic&lt;/li&gt;
&lt;li&gt;Canary releases: Release to a subset of users to test changes safely&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl create deployment my-nginx-deploy &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;nginx
kubectl get deployments
kubectl scale deployment my-nginx-deploy &lt;span class=&quot;token parameter variable&quot;&gt;--replicas&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
kubectl get pods&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;services&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#services&quot; aria-label=&quot;services permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Services&lt;/h3&gt;
&lt;p&gt;A Service exposes your Pods to the network – internally or externally - providing stable DNS names and load balancing. Service types: ClusterIP (internal), NodePort (access via node IP:port), LoadBalancer (cloud load balancer).&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl expose deployment my-nginx-deploy &lt;span class=&quot;token parameter variable&quot;&gt;--port&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--type&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;LoadBalancer
kubectl get services&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;namespaces&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#namespaces&quot; aria-label=&quot;namespaces permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Namespaces&lt;/h3&gt;
&lt;p&gt;A Namespace separates resources logically, useful when you have multiple teams, apps, or environments.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl create namespace my-namespace
kubectl run test-pod &lt;span class=&quot;token parameter variable&quot;&gt;--image&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;nginx &lt;span class=&quot;token parameter variable&quot;&gt;--namespace&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;my-namespace
kubectl get pods &lt;span class=&quot;token parameter variable&quot;&gt;-n&lt;/span&gt; my-namespace&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;configmaps-and-secrets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configmaps-and-secrets&quot; aria-label=&quot;configmaps and secrets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ConfigMaps and Secrets&lt;/h3&gt;
&lt;p&gt;ConfigMaps store non-sensitive configuration. Secrets store sensitive data like passwords.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl create configmap my-config --from-literal&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;APP_MODE&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;production
kubectl create secret generic my-secret --from-literal&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;DB_PASSWORD&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;secret123
kubectl get configmaps
kubectl get secrets&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;configuring-a-basic-pod-yaml&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configuring-a-basic-pod-yaml&quot; aria-label=&quot;configuring a basic pod yaml permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configuring a basic pod yaml&lt;/h3&gt;
&lt;p&gt;Instead of using commands, you can define Pods declaratively with YAML. YAML is how real-world Kubernetes works.
Example &lt;code class=&quot;language-text&quot;&gt;pod.yaml&lt;/code&gt;:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;apiVersion&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; v1
&lt;span class=&quot;token key atrule&quot;&gt;kind&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Pod
&lt;span class=&quot;token key atrule&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mypod
&lt;span class=&quot;token key atrule&quot;&gt;spec&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mycontainer
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx
    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;containerPort&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Apply it to create the pod and delete once done&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;kubectl apply &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; pod.yaml
kubectl delete &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; pod.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;kubernetes-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kubernetes-architecture&quot; aria-label=&quot;kubernetes architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kubernetes Architecture&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://kubernetes.io/images/docs/kubernetes-cluster-architecture.svg&quot; alt=&quot;Kubernetes Cluster Architecture&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;control-plane-components&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#control-plane-components&quot; aria-label=&quot;control plane components permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Control Plane Components&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API Server&lt;/strong&gt;: Frontend for the Kubernetes control plane&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scheduler&lt;/strong&gt;: Assigns pods to nodes based on resource availability&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Controller Manager&lt;/strong&gt;: Runs background reconciliation loops&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;etcd&lt;/strong&gt;: Consistent and highly available key-value store used as Kubernetes&apos; backing store&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;node-components&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#node-components&quot; aria-label=&quot;node components permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Node Components&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kubelet&lt;/strong&gt;: Agent running on each node that manages pod lifecycles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kube-proxy&lt;/strong&gt;: Maintains network rules for pod communication&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container runtime&lt;/strong&gt;: Software responsible for running containers (e.g., containerd, CRI-O)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;advanced-features&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#advanced-features&quot; aria-label=&quot;advanced features permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Advanced Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Horizontal Pod Autoscaler (HPA)&lt;/strong&gt;: Auto-scales Pods up or down based on CPU, memory, or custom metrics. Helps optimize resources during traffic spikes or low-load periods.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Persistent Volumes (PV) and Storage Classes&lt;/strong&gt;: Persistent Volumes (PV) are pre-provisioned or dynamically created storage. Persistent Volume Claims (PVC) requests for storage by applications. Storage Classes define different types of storage (e.g., SSDs vs. HDDs) dynamically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Network Policies&lt;/strong&gt;: Set rules for which Pods or Namespaces can communicate with each other. Crucial for zero-trust networking and cluster security hardening.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ingress and Traffic Management&lt;/strong&gt;: Ingress Controllers (NGINX, Traefik) expose Services externally via HTTP(S). It supports path-based and host-based routing, SSL/TLS termination, load balancing, authentication, rate-limiting, and WAF (Web Application Firewall) features.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security and RBAC (Role-Based Access Control)&lt;/strong&gt;: RBAC provides fine-grained permissions for users, groups, and services. Service Accounts secure identities for Pods accessing APIs. Pod Security Admission control security settings like running as non-root &amp;#x26; preventing privilege escalation. Network Policies further reinforce communication restrictions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;observability&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#observability&quot; aria-label=&quot;observability permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Observability&lt;/h2&gt;
&lt;p&gt;Monitoring and logging are critical in production Kubernetes environments.&lt;/p&gt;
&lt;p&gt;Popular tools include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Prometheus&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;Grafana&lt;/code&gt; for metrics&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Fluentd&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Logstash&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Loki&lt;/code&gt; for logging&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;Jaeger&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;OpenTelemetry&lt;/code&gt; for tracing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;helm-and-operators&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#helm-and-operators&quot; aria-label=&quot;helm and operators permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Helm and Operators&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://helm.sh/&quot;&gt;Helm&lt;/a&gt;: Kubernetes package manager that simplifies deployment of complex applications using charts.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/docs/concepts/extend-kubernetes/operator/&quot;&gt;Operators&lt;/a&gt;: Custom controllers that extend Kubernetes to manage application lifecycles, especially for stateful apps like databases.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;best-practices&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#best-practices&quot; aria-label=&quot;best practices permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use readiness and liveness probes for better pod health checks&lt;/li&gt;
&lt;li&gt;Implement resource requests and limits to manage cluster resources&lt;/li&gt;
&lt;li&gt;Avoid anti-patterns like monolithic pods or tight coupling&lt;/li&gt;
&lt;li&gt;Organize workloads using namespaces, labels, and annotations&lt;/li&gt;
&lt;li&gt;Regularly audit RBAC roles and permissions&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Kafkaesque Streaming]]></title><description><![CDATA[What is Kafka? Apache Kafka is a distributed streaming platform used for building real-time data pipelines and streaming applications. You…]]></description><link>https://rohitmungre.com/kafka/</link><guid isPermaLink="false">https://rohitmungre.com/kafka/</guid><pubDate>Wed, 20 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-is-kafka&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-kafka&quot; aria-label=&quot;what is kafka permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is Kafka?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://kafka.apache.org/&quot;&gt;Apache Kafka&lt;/a&gt; is a distributed streaming platform used for building real-time data pipelines and streaming applications. You can think of it as a distributed log system. Instead of sending data from point A to point B, Kafka acts as a durable, high-performance, fault-tolerant log where data is written once and consumed many times. It’s fast, scalable, and fault-tolerant.&lt;/p&gt;
&lt;h3 id=&quot;glossary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#glossary&quot; aria-label=&quot;glossary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Glossary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Producer&lt;/strong&gt;:	Sends (produces) messages to Kafka topics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer&lt;/strong&gt;:	Reads (consumes) messages from Kafka topics.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Topic&lt;/strong&gt;: A category/feed name to which messages are sent and from which consumers receive messages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partition&lt;/strong&gt;: Topics are split into partitions to allow scalability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Broker&lt;/strong&gt;: A Kafka server that stores data and serves clients.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zookeeper&lt;/strong&gt;: Manages Kafka’s metadata and cluster state (Kafka 3.x can run without it, but many setups still use it).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consumer Group&lt;/strong&gt;: A group of consumers that coordinate to read data in parallel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article walks through Kafka from the ground up using kafka cli via docker, progressing into its more advanced capabilities and architectural nuances.&lt;/p&gt;
&lt;h2 id=&quot;kafka-using-docker&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kafka-using-docker&quot; aria-label=&quot;kafka using docker permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kafka using docker&lt;/h2&gt;
&lt;h3 id=&quot;start-kafka-with-docker&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#start-kafka-with-docker&quot; aria-label=&quot;start kafka with docker permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Start Kafka with Docker&lt;/h3&gt;
&lt;p&gt;A basic &lt;code class=&quot;language-text&quot;&gt;docker-compose.yml&lt;/code&gt; for Kafka + Zookeeper below:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;3&apos;&lt;/span&gt;
&lt;span class=&quot;token key atrule&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;zookeeper&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; confluentinc/cp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;zookeeper&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;ZOOKEEPER_CLIENT_PORT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2181&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;ZOOKEEPER_TICK_TIME&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2000&lt;/span&gt;

  &lt;span class=&quot;token key atrule&quot;&gt;kafka&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; confluentinc/cp&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;kafka&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;latest
    &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;9092:9092&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;KAFKA_BROKER_ID&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;KAFKA_ZOOKEEPER_CONNECT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; zookeeper&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2181&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;KAFKA_ADVERTISED_LISTENERS&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; PLAINTEXT&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//localhost&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9092&lt;/span&gt;
      &lt;span class=&quot;token key atrule&quot;&gt;KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Start it:&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker-compose&lt;/span&gt; up &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Verify that confluentinc/cp-kafka:latest is up using below and copy the &lt;code class=&quot;language-text&quot;&gt;container id&lt;/code&gt; (to be used in the commands going forward)&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;cli-commands&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cli-commands&quot; aria-label=&quot;cli commands permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cli commands&lt;/h3&gt;
&lt;h4 id=&quot;list-topics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#list-topics&quot; aria-label=&quot;list topics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;List topics&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-topics --bootstrap-server localhost:9092 &lt;span class=&quot;token parameter variable&quot;&gt;--list&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;create-a-topic&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-a-topic&quot; aria-label=&quot;create a topic permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create a Topic&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-topics &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --bootstrap-server localhost:9092 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--create&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--topic&lt;/span&gt; my-topic &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--partitions&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; --replication-factor &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;describe-a-topic&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#describe-a-topic&quot; aria-label=&quot;describe a topic permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Describe a Topic&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-topics &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --bootstrap-server localhost:9092 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--describe&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--topic&lt;/span&gt; my-topic&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;produce-send-messages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#produce-send-messages&quot; aria-label=&quot;produce send messages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Produce (Send) Messages&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-console-producer &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --broker-list localhost:9092 &lt;span class=&quot;token parameter variable&quot;&gt;--topic&lt;/span&gt; my-topic&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Type your messages, press Enter to send each one.&lt;/p&gt;
&lt;h4 id=&quot;consume-messages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#consume-messages&quot; aria-label=&quot;consume messages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Consume Messages&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-console-consumer &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --bootstrap-server localhost:9092 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--topic&lt;/span&gt; my-topic --from-beginning&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;delete-a-topic&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#delete-a-topic&quot; aria-label=&quot;delete a topic permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Delete a Topic&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-topics &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --bootstrap-server localhost:9092 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--delete&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--topic&lt;/span&gt; my-topic&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;start-consumer-group&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#start-consumer-group&quot; aria-label=&quot;start consumer group permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Start Consumer Group&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-console-consumer &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --bootstrap-server localhost:9092 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--topic&lt;/span&gt; my-topic &lt;span class=&quot;token parameter variable&quot;&gt;--group&lt;/span&gt; my-group&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;list-consumer-groups&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#list-consumer-groups&quot; aria-label=&quot;list consumer groups permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;List Consumer Groups&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-consumer-groups &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --bootstrap-server localhost:9092 &lt;span class=&quot;token parameter variable&quot;&gt;--list&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;describe-consumer-group&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#describe-consumer-group&quot; aria-label=&quot;describe consumer group permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Describe Consumer Group&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-it&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;container_id&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; kafka-consumer-groups &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --bootstrap-server localhost:9092 &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--describe&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--group&lt;/span&gt; my-group&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cleanup&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;docker-compose&lt;/span&gt; down
&lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; volume prune  &lt;span class=&quot;token comment&quot;&gt;# if you want to wipe all Kafka data&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;kafka-architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kafka-architecture&quot; aria-label=&quot;kafka architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kafka Architecture&lt;/h2&gt;
&lt;p&gt;Kafka is designed around a &lt;strong&gt;pull-based model&lt;/strong&gt;, where consumers pull data from brokers at their own pace. Messages are stored durably on disk and replicated across brokers for fault tolerance.&lt;/p&gt;
&lt;p&gt;Key architectural traits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Immutable commit log&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offset tracking&lt;/strong&gt; for exactly-once or at-least-once semantics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Replication&lt;/strong&gt; for durability and high availability&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Horizontal scalability&lt;/strong&gt; by adding more brokers/partitions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;advanced-topics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#advanced-topics&quot; aria-label=&quot;advanced topics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Advanced Topics&lt;/h2&gt;
&lt;h3 id=&quot;kafka-internals&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kafka-internals&quot; aria-label=&quot;kafka internals permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kafka Internals&lt;/h3&gt;
&lt;p&gt;Kafka uses a log-structured storage system, where data is appended to a log file. This enables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast disk I/O (sequential writes)&lt;/li&gt;
&lt;li&gt;Efficient compaction and retention policies&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;delivery-semantics&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#delivery-semantics&quot; aria-label=&quot;delivery semantics permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Delivery Semantics&lt;/h3&gt;
&lt;p&gt;Kafka supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;At-most-once&lt;/strong&gt; (no retry)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;At-least-once&lt;/strong&gt; (with retries)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exactly-once&lt;/strong&gt; (via idempotent producers and transactions)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;kafka-connect&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kafka-connect&quot; aria-label=&quot;kafka connect permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kafka Connect&lt;/h3&gt;
&lt;p&gt;A framework for scalable and fault-tolerant integration with external systems like databases, cloud storage, etc.&lt;/p&gt;
&lt;h3 id=&quot;kafka-streams&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#kafka-streams&quot; aria-label=&quot;kafka streams permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Kafka Streams&lt;/h3&gt;
&lt;p&gt;Kafka’s native stream processing library for building real-time applications. It supports windowed joins, aggregations, and stateful transformations.&lt;/p&gt;
&lt;h3 id=&quot;ksql-ksqldb&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ksql-ksqldb&quot; aria-label=&quot;ksql ksqldb permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;KSQL (ksqldb)&lt;/h3&gt;
&lt;p&gt;SQL-like interface to process and query Kafka topics in real-time. Great for monitoring, alerting, and ad hoc analytics.&lt;/p&gt;
&lt;h3 id=&quot;schema-registry&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#schema-registry&quot; aria-label=&quot;schema registry permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Schema Registry&lt;/h3&gt;
&lt;p&gt;Used to enforce schema evolution and validation of messages (usually with Avro, Protobuf, or JSON Schema).&lt;/p&gt;
&lt;h2 id=&quot;security--reliability&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#security--reliability&quot; aria-label=&quot;security  reliability permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Security &amp;#x26; Reliability&lt;/h2&gt;
&lt;p&gt;Kafka supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLS encryption&lt;/strong&gt; (for data in transit)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SASL authentication&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ACLs&lt;/strong&gt; for fine-grained authorization&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reliability features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Leader election&lt;/strong&gt; for partitions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ISR (In-Sync Replicas)&lt;/strong&gt; for high availability&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Durable storage&lt;/strong&gt; with configurable retention&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;design-patterns&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#design-patterns&quot; aria-label=&quot;design patterns permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Design Patterns&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Event Sourcing&lt;/strong&gt;: Storing state changes as a sequence of events.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CQRS&lt;/strong&gt;: Using Kafka to separate reads and writes with materialized views.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log Compaction&lt;/strong&gt;: Retaining only the last message per key, ideal for changelog streams.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;best-practices&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#best-practices&quot; aria-label=&quot;best practices permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;idempotent producers&lt;/strong&gt; for exactly-once delivery.&lt;/li&gt;
&lt;li&gt;Design &lt;strong&gt;partitioning strategy&lt;/strong&gt; carefully (by key, round-robin, custom).&lt;/li&gt;
&lt;li&gt;Monitor with tools like &lt;strong&gt;Prometheus&lt;/strong&gt;, &lt;strong&gt;Grafana&lt;/strong&gt;, &lt;strong&gt;Confluent Control Center&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Kafka Connect&lt;/strong&gt; with dead letter queues for fault-tolerant ingestion.&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;Kafka Streams&lt;/strong&gt; or &lt;strong&gt;Flink&lt;/strong&gt; for advanced real-time processing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;when-to-use-kafka&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#when-to-use-kafka&quot; aria-label=&quot;when to use kafka permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;When to Use Kafka&lt;/h2&gt;
&lt;p&gt;Kafka excels when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need to handle &lt;strong&gt;high-throughput&lt;/strong&gt;, &lt;strong&gt;real-time&lt;/strong&gt; data&lt;/li&gt;
&lt;li&gt;You&apos;re building &lt;strong&gt;event-driven&lt;/strong&gt; or &lt;strong&gt;microservices&lt;/strong&gt; architectures&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;durable&lt;/strong&gt;, &lt;strong&gt;replayable&lt;/strong&gt;, &lt;strong&gt;fault-tolerant&lt;/strong&gt; logs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s not ideal for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Short-lived messages (use Redis or RabbitMQ)&lt;/li&gt;
&lt;li&gt;Direct request-response communication&lt;/li&gt;
&lt;li&gt;Heavy transformations (use Kafka Streams or an external processor)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Caching with Redis]]></title><description><![CDATA[What is Redis? Redis (REmote DIctionary Server) is an in-memory data store, often used as a cache, message broker, or even a NoSQL database…]]></description><link>https://rohitmungre.com/redis/</link><guid isPermaLink="false">https://rohitmungre.com/redis/</guid><pubDate>Sun, 13 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-is-redis&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-redis&quot; aria-label=&quot;what is redis permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is Redis?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Redis&quot;&gt;Redis&lt;/a&gt; (REmote DIctionary Server) is an in-memory data store, often used as a cache, message broker, or even a NoSQL database.&lt;/p&gt;
&lt;p&gt;It’s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Super fast (sub millisecond latency) (everything is in-memory)&lt;/li&gt;
&lt;li&gt;Key-value based, like a giant hash table&lt;/li&gt;
&lt;li&gt;Used in systems that need low-latency access to frequently used data&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this article, we explore caching with Redis from the ground up using redis-cli, and then dive into its advanced capabilities and architectural considerations.&lt;/p&gt;
&lt;h2 id=&quot;install-redis-cli&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-redis-cli&quot; aria-label=&quot;install redis cli permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Redis cli&lt;/h2&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; redis-server &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Start Redis Server and check status&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; redis-server start
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; redis-server status&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Open the Redis command line interface and test &lt;code class=&quot;language-text&quot;&gt;ping&lt;/code&gt;:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;redis-cli&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Stop Redis server when done&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; redis-server stop&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;core-concepts-of-redis-caching&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#core-concepts-of-redis-caching&quot; aria-label=&quot;core concepts of redis caching permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Core Concepts of Redis Caching&lt;/h2&gt;
&lt;h3 id=&quot;key-value-storage&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#key-value-storage&quot; aria-label=&quot;key value storage permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Key-Value Storage&lt;/h3&gt;
&lt;p&gt;Redis operates as a high-speed key-value store. The value can be a simple string or a complex data structure like a hash or list. List of &lt;a href=&quot;https://redis.io/docs/latest/develop/data-types/&quot;&gt;data types&lt;/a&gt; for Redis.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# Strings&lt;/span&gt;
SET name &lt;span class=&quot;token string&quot;&gt;&quot;Redis&quot;&lt;/span&gt;
GET name
SET city &lt;span class=&quot;token string&quot;&gt;&quot;London&quot;&lt;/span&gt;
INCR counter
DECR counter
APPEND city &lt;span class=&quot;token string&quot;&gt;&quot; Bridge&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Lists&lt;/span&gt;
LPUSH tasks &lt;span class=&quot;token string&quot;&gt;&quot;learn redis&quot;&lt;/span&gt;
LPUSH tasks &lt;span class=&quot;token string&quot;&gt;&quot;build app&quot;&lt;/span&gt;
RPUSH tasks &lt;span class=&quot;token string&quot;&gt;&quot;deploy app&quot;&lt;/span&gt;
LRANGE tasks &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Hashes&lt;/span&gt;
HSET user:100 name &lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt; age &lt;span class=&quot;token string&quot;&gt;&quot;30&quot;&lt;/span&gt;
HGET user:100 name
HGETALL user:100

&lt;span class=&quot;token comment&quot;&gt;# Sets (Unordered)&lt;/span&gt;
SADD tags &lt;span class=&quot;token string&quot;&gt;&quot;fast&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;nosql&quot;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;cache&quot;&lt;/span&gt;
SADD tags &lt;span class=&quot;token string&quot;&gt;&quot;fast&quot;&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# won’t duplicate&lt;/span&gt;
SMEMBERS tags
SISMEMBER tags &lt;span class=&quot;token string&quot;&gt;&quot;cache&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Sorted sets&lt;/span&gt;
ZADD leaderboard &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Alice&quot;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Bob&quot;&lt;/span&gt;
ZRANGE leaderboard &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-1&lt;/span&gt; WITHSCORES
ZREVRANGE leaderboard &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; WITHSCORES&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;time-to-live-ttl&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time-to-live-ttl&quot; aria-label=&quot;time to live ttl permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time-To-Live (TTL)&lt;/h3&gt;
&lt;p&gt;Redis supports automatic key expiration using TTL. This is essential for caching.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;SET temp &lt;span class=&quot;token string&quot;&gt;&quot;this is temporary&quot;&lt;/span&gt; EX &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
TTL temp

&lt;span class=&quot;token comment&quot;&gt;# You can also use&lt;/span&gt;
EXPIRE name &lt;span class=&quot;token number&quot;&gt;60&lt;/span&gt;
PERSIST name       &lt;span class=&quot;token comment&quot;&gt;# remove expiry&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;atomic-operations&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#atomic-operations&quot; aria-label=&quot;atomic operations permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Atomic operations&lt;/h3&gt;
&lt;p&gt;All Redis commands are atomic — they finish completely or not at all. No race conditions — great for counters, locks, etc.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;INCR score
DECR stock&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;publish--subscribe-pubsub&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#publish--subscribe-pubsub&quot; aria-label=&quot;publish  subscribe pubsub permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Publish / Subscribe (Pub/Sub)&lt;/h3&gt;
&lt;p&gt;Used for messaging between parts of your system — chat apps, real-time updates, etc.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token comment&quot;&gt;# Terminal 1:&lt;/span&gt;
SUBSCRIBE news

&lt;span class=&quot;token comment&quot;&gt;# Terminal 2:&lt;/span&gt;
PUBLISH news &lt;span class=&quot;token string&quot;&gt;&quot;Redis 7 released!&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;transactions-multiexec&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#transactions-multiexec&quot; aria-label=&quot;transactions multiexec permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Transactions (MULTI/EXEC)&lt;/h3&gt;
&lt;p&gt;Group commands together, all run as one atomic batch.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;MULTI
SET balance &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
INCR balance
EXEC&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;persistence-modes-rdb-and-aof&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#persistence-modes-rdb-and-aof&quot; aria-label=&quot;persistence modes rdb and aof permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Persistence Modes (RDB and AOF)&lt;/h3&gt;
&lt;p&gt;Although Redis is often used as a cache, it supports persistence. Redis can save data to disk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDB (Snapshotting): Saves the dataset at specified intervals. Good for backups.&lt;/li&gt;
&lt;li&gt;AOF (Append-Only File): Logs every write operation. Safer but slower.&lt;/li&gt;
&lt;li&gt;Hybrid (RDB + AOF): Combine both for balance between safety and performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You don’t do this via CLI often, but you can trigger a save manually:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;SAVE
BGSAVE&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;monitoring--inspection&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#monitoring--inspection&quot; aria-label=&quot;monitoring  inspection permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Monitoring / Inspection&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;KEYS *             &lt;span class=&quot;token comment&quot;&gt;# List all keys (use with caution)&lt;/span&gt;
SCAN &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;             &lt;span class=&quot;token comment&quot;&gt;# Safer alternative to KEYS for large DBs&lt;/span&gt;
TTL key            &lt;span class=&quot;token comment&quot;&gt;# Time to live&lt;/span&gt;
TYPE key           &lt;span class=&quot;token comment&quot;&gt;# Get the type of a key&lt;/span&gt;
INFO               &lt;span class=&quot;token comment&quot;&gt;# Redis server stats&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;deleting-data&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#deleting-data&quot; aria-label=&quot;deleting data permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Deleting Data&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;DEL name
FLUSHDB           &lt;span class=&quot;token comment&quot;&gt;# Deletes all keys in current DB&lt;/span&gt;
FLUSHALL          &lt;span class=&quot;token comment&quot;&gt;# Deletes all keys in all DBs&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;eviction-policies&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#eviction-policies&quot; aria-label=&quot;eviction policies permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Eviction Policies&lt;/h3&gt;
&lt;p&gt;Redis can evict keys when memory is full, using policies such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;volatile-lru&lt;/code&gt;: Least Recently Used for keys with TTL&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;allkeys-lru&lt;/code&gt;: LRU across all keys&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;volatile-ttl&lt;/code&gt;: Evict keys with nearest expiry&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;noeviction&lt;/code&gt;: Return errors when memory is full&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;allkeys-random&lt;/code&gt;: Evict random keys&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configured via &lt;code class=&quot;language-text&quot;&gt;maxmemory-policy&lt;/code&gt;.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;CONFIG SET maxmemory 1mb                 &lt;span class=&quot;token comment&quot;&gt;# Set a low memory limit&lt;/span&gt;
CONFIG SET maxmemory-policy allkeys-lru

CONFIG GET maxmemory
CONFIG GET maxmemory-policy

&lt;span class=&quot;token comment&quot;&gt;# Reset to default&lt;/span&gt;
CONFIG SET maxmemory &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
CONFIG SET maxmemory-policy noeviction&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;advanced-concepts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#advanced-concepts&quot; aria-label=&quot;advanced concepts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Advanced Concepts&lt;/h2&gt;
&lt;h3 id=&quot;redis-cluster&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#redis-cluster&quot; aria-label=&quot;redis cluster permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Redis Cluster&lt;/h3&gt;
&lt;p&gt;Redis Cluster allows you to shard (partition) your data across multiple Redis nodes, enabling horizontal scaling and automatic failover.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Data is automatically distributed across nodes (no manual sharding)&lt;/li&gt;
&lt;li&gt;The Redis keyspace is split into 16,384 hash slots (0–16383). Each key maps to a slot, and each slot is handled by a node&lt;/li&gt;
&lt;li&gt;Each master node can have one or more replicas; if a master goes down, a replica can be promoted automatically&lt;/li&gt;
&lt;li&gt;Can survive failures of some nodes, as long as a majority of masters are reachable&lt;/li&gt;
&lt;li&gt;If a key is on a different node, Redis tells the client to retry on the correct one (MOVED response)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;redis-sentinel&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#redis-sentinel&quot; aria-label=&quot;redis sentinel permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Redis Sentinel&lt;/h3&gt;
&lt;p&gt;Redis Sentinel is a system to monitor Redis master-replica setups and provide automatic failover if the master fails.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Monitors master-slave setups, watches Redis masters and replicas for failures&lt;/li&gt;
&lt;li&gt;Alerts admins (or systems) if something goes wrong&lt;/li&gt;
&lt;li&gt;Provides automatic failover - promotes a replica to master if the master goes down&lt;/li&gt;
&lt;li&gt;Clients can ask Sentinel which node is the current master&lt;/li&gt;
&lt;li&gt;Good for high availability when clustering is not needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;advanced-caching-patterns&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#advanced-caching-patterns&quot; aria-label=&quot;advanced caching patterns permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Advanced Caching Patterns&lt;/h2&gt;
&lt;h3 id=&quot;read-through-caching&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#read-through-caching&quot; aria-label=&quot;read through caching permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Read-Through Caching&lt;/h3&gt;
&lt;p&gt;The application checks Redis before hitting the database. On cache miss, it loads from the DB and updates Redis.&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_user&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; redis&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;user:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; user &lt;span class=&quot;token keyword&quot;&gt;is&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        user &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; db&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get_user&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        redis&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;setex&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;user:&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3600&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; user&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; user&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;write-through-caching&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#write-through-caching&quot; aria-label=&quot;write through caching permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Write-Through Caching&lt;/h3&gt;
&lt;p&gt;Writes go to both Redis and the database simultaneously. Ensures consistency but increases write latency.&lt;/p&gt;
&lt;h3 id=&quot;cache-aside--lazy-caching&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#cache-aside--lazy-caching&quot; aria-label=&quot;cache aside  lazy caching permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Cache Aside / Lazy Caching&lt;/h3&gt;
&lt;p&gt;The app fetches from Redis, and on miss, loads from the DB and stores the result. Most common and flexible.&lt;/p&gt;
&lt;h3 id=&quot;negative-caching&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#negative-caching&quot; aria-label=&quot;negative caching permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Negative Caching&lt;/h3&gt;
&lt;p&gt;Cache null or &quot;not found&quot; responses to avoid repeated DB hits.&lt;/p&gt;
&lt;h2 id=&quot;best-practices&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#best-practices&quot; aria-label=&quot;best practices permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Best Practices&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;pipelines&lt;/strong&gt; for batching commands&lt;/li&gt;
&lt;li&gt;Leverage &lt;strong&gt;sharding&lt;/strong&gt; via Redis Cluster for horizontal scaling&lt;/li&gt;
&lt;li&gt;Tune &lt;code class=&quot;language-text&quot;&gt;maxmemory&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;maxclients&lt;/code&gt;, and eviction policy for optimal memory use&lt;/li&gt;
&lt;li&gt;Monitor using tools like &lt;code class=&quot;language-text&quot;&gt;redis-cli&lt;/code&gt;, &lt;a href=&quot;https://redis.io/docs/latest/commands/monitor/&quot;&gt;MONITOR&lt;/a&gt;, or &lt;a href=&quot;https://redis.io/insight/&quot;&gt;RedisInsight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use &lt;code class=&quot;language-text&quot;&gt;requirepass&lt;/code&gt; to set authentication&lt;/li&gt;
&lt;li&gt;Bind only to internal interfaces (&lt;code class=&quot;language-text&quot;&gt;bind 127.0.0.1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Enable &lt;code class=&quot;language-text&quot;&gt;tls&lt;/code&gt; for secure in-transit data&lt;/li&gt;
&lt;li&gt;Use &lt;code class=&quot;language-text&quot;&gt;ACLs&lt;/code&gt; (Redis 6+) to control access&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;use-cases-beyond-caching&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#use-cases-beyond-caching&quot; aria-label=&quot;use cases beyond caching permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Use Cases Beyond Caching&lt;/h2&gt;
&lt;p&gt;Apart from caching, Redis supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pub/Sub messaging&lt;/strong&gt; for real-time communication&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streams&lt;/strong&gt; for data pipelines and log ingestion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geospatial indexing&lt;/strong&gt; for location-based queries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HyperLogLog&lt;/strong&gt;, &lt;strong&gt;bitmaps&lt;/strong&gt; for analytics and counting&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Websockets & Rest APIs]]></title><description><![CDATA[Modern applications often require real-time communication, seamless data transfer, and responsive interfaces. Two of the most common…]]></description><link>https://rohitmungre.com/websockets/</link><guid isPermaLink="false">https://rohitmungre.com/websockets/</guid><pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Modern applications often require real-time communication, seamless data transfer, and responsive interfaces. Two of the most common technologies that power client-server communication are &lt;strong&gt;WebSockets&lt;/strong&gt; and &lt;strong&gt;REST APIs&lt;/strong&gt;. While both are essential, they are designed for different use cases and offer distinct advantages and trade-offs.&lt;/p&gt;
&lt;h2 id=&quot;websockets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#websockets&quot; aria-label=&quot;websockets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;WebSockets&lt;/h2&gt;
&lt;p&gt;WebSocket is a communication protocol that provides full-duplex, real-time communication channels over a single, long-lived connection between a client (such as a web browser) and a server. Unlike the traditional HTTP request-response model, WebSocket allows the server to send data to the client without being prompted. WebSocket provides full-duplex (i.e., bidirectional) communication channels to enable client-server interaction over a single, persistent Transmission Control Protocol (TCP) connection.&lt;/p&gt;
&lt;h3 id=&quot;architecture&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#architecture&quot; aria-label=&quot;architecture permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architecture&lt;/h3&gt;
&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/b3513bc7ec444c8649071878ecc63529/94829/websocket1.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 39.86486486486486%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABxUlEQVR42l2SSXMSURSF+f8LKxrRkEQhmJBUqhKH6NaV0V0wA9BAQgM9wOuZppmL/rzdDgtf1anzVt87595XiNwWifudaPyDwL4mHF0zcepsNptcq9WS5XLJer3OPd1uWazWfGmGXDZi3j9EfBC/aCZ8ewwpRIMqqXrGZvRctMN2vEMy3CX0TZTjodQY27ZxHAfTNIkCn8eBxdt6wnEH3mlprooGH7UZhdg6g7BEGhyCfyD3AxJzDzXqEUaxABWu6+buBwGB72Eqj6OfCaddqLVTTgRYFeDndgY0aqRukblZFC9BsM90WMQ2uznQcRSe5+H7Po6AJ1GICiZU6lMqtwuq9ytqAsuAV1oiQPOErXpJpL/4AywJ8BXOWCcSoG1bOTBTljKeRFhOQEUSlm/nHN0t/wE//QUS7JFK3dTbzxMmw9f0e00BuPT7OoZh5PPrDwaMZZ66MaJ6N+NMKp9K5az2cVuAWeWpVZXZSTqvKC4KpL61S7t1I7AhrVYTTdPodDo8PfUYyAPNrs4bWUq5CeXGlorosAGXsulCaH9l5ZyzUJfM1QXz8Tnx6IrVMuH3Sfn/ZN/pwYqpG1PuLZGdcGPO0N2EX0xrQBhXcydpAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Floating Image&quot; title=&quot;&quot; src=&quot;/static/b3513bc7ec444c8649071878ecc63529/fcda8/websocket1.png&quot; srcset=&quot;/static/b3513bc7ec444c8649071878ecc63529/12f09/websocket1.png 148w,
/static/b3513bc7ec444c8649071878ecc63529/e4a3f/websocket1.png 295w,
/static/b3513bc7ec444c8649071878ecc63529/fcda8/websocket1.png 590w,
/static/b3513bc7ec444c8649071878ecc63529/94829/websocket1.png 878w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;h3 id=&quot;python-implementation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#python-implementation&quot; aria-label=&quot;python implementation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Python implementation&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A simple websocket server that accepts a token and symbol for subscribing and sends a price (random) to the client every 3 seconds&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# server.py&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; asyncio
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; websockets
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; random
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; json

VALID_TOKEN &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MY_TOKEN&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;price_stream&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;websocket&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Receive the initial subscription message&lt;/span&gt;
        message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; websocket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        symbol &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;symbol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; token &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; VALID_TOKEN &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; symbol&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; websocket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dumps&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Invalid token or missing symbol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; websocket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;close&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt;

        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Client subscribed to &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;symbol&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; with token &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;token&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# Send random price updates every 3 seconds&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            price &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;round&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;random&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;uniform&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;105&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;symbol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; symbol&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token string&quot;&gt;&quot;price&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; price
            &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; websocket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dumps&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; asyncio&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;sleep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; websockets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;ConnectionClosed&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Client disconnected.&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; websockets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;serve&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;price_stream&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8765&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;WebSocket server running at ws://localhost:8765&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; asyncio&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Future&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;token comment&quot;&gt;# run forever&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    asyncio&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;main&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Simple python client to subscribe to and consume data from the above websocket&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# client.py&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; asyncio
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; websockets
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; json

&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    uri &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ws://localhost:8765&quot;&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; websockets&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;connect&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;uri&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; websocket&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token comment&quot;&gt;# Send token and symbol to server&lt;/span&gt;
        token &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;MY_TOKEN&quot;&lt;/span&gt;
        symbol &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Enter symbol to subscribe: &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        subscription_request &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;token&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; token&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;symbol&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; symbol
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; websocket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;send&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dumps&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscription_request&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

        &lt;span class=&quot;token comment&quot;&gt;# Listen for price updates&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            message &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; websocket&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;recv&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; json&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;loads&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;message&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;error&quot;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Error from server: &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;error&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
                &lt;span class=&quot;token keyword&quot;&gt;break&lt;/span&gt;

            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;Price Update - &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;symbol&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;: $&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;price&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    asyncio&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;subscribe&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;use-cases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#use-cases&quot; aria-label=&quot;use cases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Use cases&lt;/h3&gt;
&lt;p&gt;Real-time messaging apps, online gaming, live dashboards, IoT device communication, and collaborative tools.&lt;/p&gt;
&lt;h3 id=&quot;performance&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#performance&quot; aria-label=&quot;performance permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Performance&lt;/h3&gt;
&lt;p&gt;Low latency, efficient for high-frequency data transfer, but scaling requires managing persistent connections with sticky sessions or brokers.&lt;/p&gt;
&lt;h3 id=&quot;security&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#security&quot; aria-label=&quot;security permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Security&lt;/h3&gt;
&lt;p&gt;Uses WSS (WebSocket Secure) for encryption, requires manual authentication and careful handling to prevent spoofing and session hijacking.&lt;/p&gt;
&lt;h3 id=&quot;best-practices&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#best-practices&quot; aria-label=&quot;best practices permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Best practices&lt;/h3&gt;
&lt;p&gt;Authenticate at connection start, use structured message formats like JSON/Protobuf, handle reconnections, and implement routing by rooms/topics.&lt;/p&gt;
&lt;h3 id=&quot;challenges&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#challenges&quot; aria-label=&quot;challenges permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Challenges&lt;/h3&gt;
&lt;p&gt;Scaling complexity, debugging difficulty, state management overhead, and increased infrastructure requirements for high availability.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;rest-apis&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#rest-apis&quot; aria-label=&quot;rest apis permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;REST APIs&lt;/h2&gt;
&lt;p&gt;REST stands for REpresentational State Transfer.
A REST API is a way for different systems (like a browser, mobile app, a backend server) to communicate over the internet using HTTP.
It is not a protocol or a standard — it&apos;s an architectural style that defines a set of rules and principles on how to structure APIs.&lt;/p&gt;
&lt;p&gt;Key rules being:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stateless: Each request from a client to a server must contain all the info needed to understand and process it. No client session is stored on the server side&lt;/li&gt;
&lt;li&gt;Resource-based: Everything is considered a resource — like a user, an image, a file, etc. Resources are represented by URLs (URIs).&lt;/li&gt;
&lt;li&gt;Uses HTTP Methods: Standard methods like GET, POST, PUT, DELETE, PATCH for interacting with resources.&lt;/li&gt;
&lt;li&gt;Uniform Interface:	The format of requests and responses must follow consistent rules (like JSON responses).&lt;/li&gt;
&lt;li&gt;Representation-driven:	Resources can be sent in various formats (JSON, XML), but JSON is the most common today.&lt;/li&gt;
&lt;li&gt;Cacheable: Responses should declare if they are cacheable to optimize network efficiency&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;architecture-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#architecture-1&quot; aria-label=&quot;architecture 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Architecture&lt;/h3&gt;
&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 590px; &quot;&gt;
      &lt;a class=&quot;gatsby-resp-image-link&quot; href=&quot;/static/ca3c10618a8dcfcaf1e127c6ce4ddc9d/1b1d5/RESTAPI.png&quot; style=&quot;display: block&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;
    &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom: 22.972972972972975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAABIklEQVR42k2Q207CUBRE+f8XIyiImiCiUQwXwZ8w0Ri5gzFSoKflAG3podUolOUBJTrJZJL9sDJ7YkpUmIs7pkaZSb+MOyziySc2CoIAx3HwfR+l1DbX/OjB8Cg1FdW24rY51+lTailiuHG+7DjR7ADcFDh7LKw8jrvAsgSmaeq0sG0bIYS2hTebUO0oTupLjh99su0VFz3IdNDAWYrpyz7v5iHMTrWTuuUN9tjZAqWUW9h/4Mh4o/g8IacB57WQy07EtQbmuhugm2DtHel2SdYajpdAvmYYmRMGA4PhcEi/39+mYRgaPObzI6DScEnXI7KtiExzyZl2urYiFtp5Aquo3yywEAWUuMKX979b7Rb70+5iuQF1EdAba8uArgxpWCHfj6VpenvXziIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Floating Image&quot; title=&quot;&quot; src=&quot;/static/ca3c10618a8dcfcaf1e127c6ce4ddc9d/fcda8/RESTAPI.png&quot; srcset=&quot;/static/ca3c10618a8dcfcaf1e127c6ce4ddc9d/12f09/RESTAPI.png 148w,
/static/ca3c10618a8dcfcaf1e127c6ce4ddc9d/e4a3f/RESTAPI.png 295w,
/static/ca3c10618a8dcfcaf1e127c6ce4ddc9d/fcda8/RESTAPI.png 590w,
/static/ca3c10618a8dcfcaf1e127c6ce4ddc9d/1b1d5/RESTAPI.png 876w&quot; sizes=&quot;(max-width: 590px) 100vw, 590px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;
  &lt;/a&gt;
    &lt;/span&gt;
&lt;h3 id=&quot;python-implementation-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#python-implementation-1&quot; aria-label=&quot;python implementation 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Python Implementation&lt;/h3&gt;
&lt;p&gt;FastAPI based python server:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# server.py&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; fastapi &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; FastAPI&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HTTPException
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; pydantic &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; BaseModel
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; typing &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; Dict

app &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; FastAPI&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Sample in-memory database&lt;/span&gt;
todos&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; Dict&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; Dict&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;task&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Learn Python&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Pending&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;task&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Learn APIs&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Pending&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Request body model&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;TodoItem&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;BaseModel&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    task&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;
    status&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Pending&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# GET all todos&lt;/span&gt;
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/todos&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_todos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; todos

&lt;span class=&quot;token comment&quot;&gt;# GET a specific todo&lt;/span&gt;
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/todos/{todo_id}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    todo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; todos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; todo&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; todo
    &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; HTTPException&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;status_code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; detail&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Todo not found&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# POST a new todo&lt;/span&gt;
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;post&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/todos&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; status_code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;201&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;create_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;item&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TodoItem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    new_id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todos&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;keys&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; default&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    todos&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;new_id&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Todo created&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; new_id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# PUT update a todo&lt;/span&gt;
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;put&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/todos/{todo_id}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;update_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; TodoItem&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; todo_id &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; todos&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        todos&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; item&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Todo updated&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; HTTPException&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;status_code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; detail&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Todo not found&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# DELETE a todo&lt;/span&gt;
&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@app&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;delete&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/todos/{todo_id}&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;delete_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; todo_id &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; todos&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;del&lt;/span&gt; todos&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Todo deleted&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; HTTPException&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;status_code&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; detail&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Todo not found&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; uvicorn
    uvicorn&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;run&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;server:app&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; host&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; port&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Client to fetch data from API:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# client.py&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; requests

BASE_URL &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http://localhost:5000&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;list_todos&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/todos&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;get_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;get&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/todos/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;create_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;task&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    payload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;task&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;post&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/todos&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; json&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;update_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; status&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    payload &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;task&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; task&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; status&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;put&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/todos/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; json&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;payload&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;delete_todo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    response &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; requests&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;delete&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string-interpolation&quot;&gt;&lt;span class=&quot;token string&quot;&gt;f&quot;&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;BASE_URL&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/todos/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;todo_id&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;response&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;json&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; __name__ &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Creating a new Todo...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    create_todo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Build a REST API!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\nListing all Todos...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    list_todos&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\nGetting Todo with ID 1...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    get_todo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\nUpdating Todo ID 2...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    update_todo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Learn APIs better&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Completed&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\nDeleting Todo ID 1...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    delete_todo&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;\nFinal Todo List:&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    list_todos&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;use-cases-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#use-cases-1&quot; aria-label=&quot;use cases 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Use cases&lt;/h3&gt;
&lt;p&gt;CRUD operations, public APIs, traditional web applications, and services requiring simple, scalable, stateless communication.&lt;/p&gt;
&lt;h3 id=&quot;performance-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#performance-1&quot; aria-label=&quot;performance 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Performance&lt;/h3&gt;
&lt;p&gt;Higher latency compared to WebSockets due to repeated handshakes and headers, but horizontally scalable and simple to cache.&lt;/p&gt;
&lt;h3 id=&quot;security-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#security-1&quot; aria-label=&quot;security 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Security&lt;/h3&gt;
&lt;p&gt;Uses HTTPS for secure transmission, supports OAuth, JWT token-based authentication, and benefits from the stateless security model.&lt;/p&gt;
&lt;h3 id=&quot;best-practices-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#best-practices-1&quot; aria-label=&quot;best practices 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Best practices&lt;/h3&gt;
&lt;p&gt;Use nouns for resources, proper HTTP methods for operations, error handling with standard codes, version APIs, and apply rate limiting and pagination.&lt;/p&gt;
&lt;h3 id=&quot;challenges-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#challenges-1&quot; aria-label=&quot;challenges 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Challenges&lt;/h3&gt;
&lt;p&gt;Less efficient for real-time updates (requires polling), overhead with repeated TCP handshakes, and stateless nature limiting persistent interaction.&lt;/p&gt;
&lt;h2 id=&quot;combining-rest-and-websockets&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#combining-rest-and-websockets&quot; aria-label=&quot;combining rest and websockets permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Combining REST and WebSockets&lt;/h2&gt;
&lt;p&gt;In many real-world applications, REST and WebSockets complement each other. A common pattern is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use REST for authentication, initial data fetching, and CRUD operations&lt;/li&gt;
&lt;li&gt;Use WebSockets for real-time updates and push notifications&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This hybrid model allows developers to balance simplicity and performance.&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Hosting on GCP]]></title><description><![CDATA[I recently decided to revive my personal website after a long time and decided to go with GoDaddy for domain & Google Cloud Platform (GCP…]]></description><link>https://rohitmungre.com/gcp/</link><guid isPermaLink="false">https://rohitmungre.com/gcp/</guid><pubDate>Thu, 18 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently decided to revive my personal website after a long time and decided to go with &lt;a href=&quot;https://www.godaddy.com&quot;&gt;GoDaddy&lt;/a&gt; for domain &amp;#x26; &lt;a href=&quot;https://cloud.google.com/&quot;&gt;Google Cloud Platform&lt;/a&gt; (GCP) for hosting - mostly for learning purposes.&lt;/p&gt;
&lt;p&gt;Below are the steps I followed to host my static personal website on GCP&lt;/p&gt;
&lt;h3 id=&quot;create-a-google-cloud-account&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-a-google-cloud-account&quot; aria-label=&quot;create a google cloud account permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create a Google Cloud Account&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://cloud.google.com/&quot;&gt;https://cloud.google.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sign up (you’ll get $300 free credits for 90 days)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;install-gcloud-and-gsutil-cli&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-gcloud-and-gsutil-cli&quot; aria-label=&quot;install gcloud and gsutil cli permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install &lt;code class=&quot;language-text&quot;&gt;gcloud&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;gsutil&lt;/code&gt; cli&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; https://sdk.cloud.google.com &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$SHELL&lt;/span&gt;
gcloud init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;It will ask to log into your Google account. You can also authorize explicitly by &lt;code class=&quot;language-text&quot;&gt;gcloud auth login&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;This should install both &lt;code class=&quot;language-text&quot;&gt;gcloud&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;gsutil&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;create-and-set-your-project&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-and-set-your-project&quot; aria-label=&quot;create and set your project permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create and set your project&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud projects create YOUR_NEW_PROJECT_ID
gcloud config &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; project YOUR_NEW_PROJECT_ID&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make sure billing is enabled too (free tier is typically enough)&lt;/p&gt;
&lt;h3 id=&quot;enable-required-services&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#enable-required-services&quot; aria-label=&quot;enable required services permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enable required services&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud services &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; storage.googleapis.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;One time setup required per project&lt;/p&gt;
&lt;h3 id=&quot;create-a-storage-bucket&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-a-storage-bucket&quot; aria-label=&quot;create a storage bucket permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create a Storage Bucket&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud storage buckets create YOUR_BUCKET_NAME &lt;span class=&quot;token parameter variable&quot;&gt;--location&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;YOUR_REGION --uniform-bucket-level-access

&lt;span class=&quot;token comment&quot;&gt;# Using gsutil mb (make bucket)&lt;/span&gt;
gsutil mb &lt;span class=&quot;token parameter variable&quot;&gt;-l&lt;/span&gt; YOUR_REGION gs://YOUR_BUCKET_NAME/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;--uniform-bucket-level-access&lt;/code&gt; ensures simplified permission management.&lt;/p&gt;
&lt;h3 id=&quot;upload-your-website-files&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#upload-your-website-files&quot; aria-label=&quot;upload your website files permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Upload Your Website Files&lt;/h3&gt;
&lt;p&gt;Suppose your files are in a folder ./website (must contain at least index.html).&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud storage &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; ./website/* gs://YOUR_BUCKET_NAME/ &lt;span class=&quot;token parameter variable&quot;&gt;--recursive&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Using gsutil cp&lt;/span&gt;
gsutil &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; ./website/* gs://YOUR_BUCKET_NAME/

&lt;span class=&quot;token comment&quot;&gt;# Using gsutil sync&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Only syncs the file additions/deletes/updates&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Preferable if large number of files &lt;/span&gt;
gsutil &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rsync&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; website gs://YOUR_BUCKET_NAME&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;make-your-files-public&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#make-your-files-public&quot; aria-label=&quot;make your files public permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Make your files public&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud storage buckets add-iam-policy-binding YOUR_BUCKET_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--member&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;allUsers &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--role&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;roles/storage.objectViewer

&lt;span class=&quot;token comment&quot;&gt;# Using gsutil ch &lt;/span&gt;
gsutil iam ch allUsers:objectViewer gs://YOUR_BUCKET_NAME&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This allows the public to access your files.&lt;/p&gt;
&lt;h3 id=&quot;configure-the-bucket-for-website-hosting&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#configure-the-bucket-for-website-hosting&quot; aria-label=&quot;configure the bucket for website hosting permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Configure the Bucket for Website Hosting&lt;/h3&gt;
&lt;p&gt;Set your &lt;code class=&quot;language-text&quot;&gt;index.html&lt;/code&gt; and (optional) &lt;code class=&quot;language-text&quot;&gt;404.html&lt;/code&gt;&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud storage buckets update YOUR_BUCKET_NAME --website-main-page-suffix&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;index.html --website-not-found-page&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt;.html

&lt;span class=&quot;token comment&quot;&gt;# Using gsutil web set &lt;/span&gt;
gsutil web &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; index.html &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;404&lt;/span&gt;.html gs://YOUR_BUCKET_NAME&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;access-your-website&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#access-your-website&quot; aria-label=&quot;access your website permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Access your website&lt;/h3&gt;
&lt;p&gt;Your website should now be visible at
&lt;code class=&quot;language-text&quot;&gt;https://YOUR_BUCKET_NAME.storage.googleapis.com&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;linking-godaddy-domain-to-gcp&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#linking-godaddy-domain-to-gcp&quot; aria-label=&quot;linking godaddy domain to gcp permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Linking godaddy domain to GCP&lt;/h2&gt;
&lt;h3 id=&quot;name-your-bucket-correctly-important&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#name-your-bucket-correctly-important&quot; aria-label=&quot;name your bucket correctly important permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Name Your Bucket Correctly (Important!)&lt;/h3&gt;
&lt;p&gt;For domain mapping to work - your bucket name MUST match your domain exactly. (&lt;code class=&quot;language-text&quot;&gt;www.yourdomain.com&lt;/code&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you didn’t create the bucket with this exact name, you’ll need to create a new bucket.&lt;/li&gt;
&lt;li&gt;When you create a bucket with the domain name, google will try to authorize if you are the rightful owner of the website&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;add-a-cname-record-in-godaddy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#add-a-cname-record-in-godaddy&quot; aria-label=&quot;add a cname record in godaddy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Add a CNAME Record in GoDaddy&lt;/h3&gt;
&lt;p&gt;Go to your GoDaddy dashboard &gt; Select your domain (e.g., yourdomain.com) &gt; Go to DNS Management &gt; Add Record.
Add this CNAME record:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type: CNAME&lt;/li&gt;
&lt;li&gt;Name: www&lt;/li&gt;
&lt;li&gt;Value: c.storage.googleapis.com&lt;/li&gt;
&lt;li&gt;TTL: 1 hour (default is fine)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;forward-root-domain-naked-domain-optional&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#forward-root-domain-naked-domain-optional&quot; aria-label=&quot;forward root domain naked domain optional permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Forward root domain (naked domain) (Optional)&lt;/h3&gt;
&lt;p&gt;GoDaddy can&apos;t CNAME a root domain (&lt;code class=&quot;language-text&quot;&gt;yourdomain.com&lt;/code&gt;) directly — that’s a DNS limitation.
But you can set up a Domain Forwarding rule in GoDaddy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forward &lt;code class=&quot;language-text&quot;&gt;yourdomain.com&lt;/code&gt; ➔ &lt;code class=&quot;language-text&quot;&gt;https://www.yourdomain.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enable Permanent 301 Redirect and Forward with masking (optional).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now both &lt;code class=&quot;language-text&quot;&gt;yourdomain.com&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;www.yourdomain.com&lt;/code&gt; will work.&lt;/p&gt;
&lt;h3 id=&quot;google-cloud-load-balancer--https-optional&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#google-cloud-load-balancer--https-optional&quot; aria-label=&quot;google cloud load balancer  https optional permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Google Cloud Load Balancer + HTTPS (Optional)&lt;/h3&gt;
&lt;h4 id=&quot;create-a-backend-bucket&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-a-backend-bucket&quot; aria-label=&quot;create a backend bucket permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create a backend bucket&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud compute backend-buckets create STATIC_BACKEND_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --gcs-bucket-name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;YOUR_BUCKET_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --enable-cdn&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This tells GCP &quot;this backend is tied to my GCS bucket.&quot;&lt;/p&gt;
&lt;h4 id=&quot;reserve-a-global-static-ip&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#reserve-a-global-static-ip&quot; aria-label=&quot;reserve a global static ip permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Reserve a global static IP&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud compute addresses create LB_STATIC_IP &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Name it &lt;code class=&quot;language-text&quot;&gt;LB_STATIC_IP&lt;/code&gt; appropriately.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get the reserved IP and save it as you&apos;ll use it soon in GoDaddy&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud compute addresses describe LB_STATIC_IP &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--format&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;get(address)&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;create-ssl-certificate-managed&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-ssl-certificate-managed&quot; aria-label=&quot;create ssl certificate managed permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create SSL Certificate (Managed)&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud compute ssl-certificates create SSL_CERT_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--domains&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;www.yourdomain.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;GCP will auto-provision a Let’s Encrypt-like cert for you.&lt;/p&gt;
&lt;h4 id=&quot;create-url-map-and-target-proxy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-url-map-and-target-proxy&quot; aria-label=&quot;create url map and target proxy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create URL Map and Target Proxy&lt;/h4&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud compute url-maps create URL_MAP_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --default-backend-bucket&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;STATIC_BACKEND_NAME


gcloud compute target-https-proxies create HTTPS_PROXY_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --ssl-certificates&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;SSL_CERT_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --url-map&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;URL_MAP_NAME&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 id=&quot;create-forwarding-rule&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#create-forwarding-rule&quot; aria-label=&quot;create forwarding rule permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Create Forwarding Rule&lt;/h4&gt;
&lt;p&gt;Now, tie the static IP to HTTPS frontend&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--address&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;LB_STATIC_IP &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--global&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  --target-https-proxy&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;HTTPS_PROXY_NAME &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token parameter variable&quot;&gt;--ports&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Load Balancer is READY now!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It will automatically serve your static website via HTTPS.&lt;/li&gt;
&lt;li&gt;URL: &lt;code class=&quot;language-text&quot;&gt;https://www.yourdomain.com&lt;/code&gt;. Once the SSL cert is active — takes a little time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;update-dns-at-godaddy&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#update-dns-at-godaddy&quot; aria-label=&quot;update dns at godaddy permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Update DNS at GoDaddy&lt;/h4&gt;
&lt;p&gt;Go back to GoDaddy DNS settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add A record:
&lt;ul&gt;
&lt;li&gt;Type: A&lt;/li&gt;
&lt;li&gt;Host: @&lt;/li&gt;
&lt;li&gt;Points to: STATIC IP ADDRESS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(Optional) Add another A record:
&lt;ul&gt;
&lt;li&gt;Host: www&lt;/li&gt;
&lt;li&gt;Points to: STATIC IP ADDRESS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TTL: 1 hour (default is fine)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;final-flow-diagram&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-flow-diagram&quot; aria-label=&quot;final flow diagram permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Flow diagram&lt;/h2&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;scss&quot;&gt;&lt;pre class=&quot;language-scss&quot;&gt;&lt;code class=&quot;language-scss&quot;&gt;User Browser &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;HTTPS&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
     ↓
Google Load Balancer &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Static IP&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; HTTPS cert&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
     ↓
Backend Bucket → GCS Static Website&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;ps&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ps&quot; aria-label=&quot;ps permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;PS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SSL Certificate may take 10–30 minutes to provision.&lt;/li&gt;
&lt;li&gt;The domain MUST point to the Load Balancer IP for certs to validate.&lt;/li&gt;
&lt;li&gt;You pay a small fee for the static IP and Load Balancer (~$5/month depending on use).&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[WSL 2 setup for devs]]></title><description><![CDATA[Last updated: Dec 15, 2024 After having used a Mac environment/Linux VMs previously at my work, Windows Subsystem for Linux (WSL) has been a…]]></description><link>https://rohitmungre.com/wsl setup/</link><guid isPermaLink="false">https://rohitmungre.com/wsl setup/</guid><pubDate>Tue, 05 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Last updated: Dec 15, 2024&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After having used a Mac environment/Linux VMs previously at my work, &lt;a href=&quot;https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux&quot;&gt;Windows Subsystem for Linux (WSL)&lt;/a&gt; has been a game changer for me to develop on Windows. It allows me to run a full Linux environment natively on Windows, without using a virtual machine or a dual boot. It provides the best of both worlds, where one can run windows apps (&lt;code class=&quot;language-text&quot;&gt;VSCode&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Chrome&lt;/code&gt; etc.) alongside Linux CLI tools (&lt;code class=&quot;language-text&quot;&gt;bash&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;git&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;vim&lt;/code&gt; etc.). It&apos;s fast and lightweight, shares resources/filesystem with Windows - allowing you to work seamlessly without having to fiddle with compatibility layers.&lt;/p&gt;
&lt;p&gt;In this guide, I&apos;m sharing how I set up my WSL V2 with Ubuntu and development environment for &lt;code class=&quot;language-text&quot;&gt;Python&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Rust&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;Node&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;React&lt;/code&gt;, etc.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;install-ubuntu-using-wsl-2&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-ubuntu-using-wsl-2&quot; aria-label=&quot;install ubuntu using wsl 2 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Ubuntu using WSL 2&lt;/h2&gt;
&lt;h3 id=&quot;enable-wsl-v2&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#enable-wsl-v2&quot; aria-label=&quot;enable wsl v2 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Enable WSL V2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I use Windows 11, where I can use WSL out of the box.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check your windows version using below in the &lt;code class=&quot;language-text&quot;&gt;Terminal&lt;/code&gt;/&lt;code class=&quot;language-text&quot;&gt;PowerShell&lt;/code&gt;&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;powershell&quot;&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;winver&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install WSL &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/wsl/install-manual&quot;&gt;manually&lt;/a&gt; if lower than 10.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open &lt;code class=&quot;language-text&quot;&gt;Terminal&lt;/code&gt;/&lt;code class=&quot;language-text&quot;&gt;PowerShell&lt;/code&gt; and ensure WSL version is V2.&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;powershell&quot;&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;status&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This should return the default version as 2.&lt;/p&gt;
&lt;h3 id=&quot;install-ubuntu&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-ubuntu&quot; aria-label=&quot;install ubuntu permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Ubuntu&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Install Ubuntu using following commands in &lt;code class=&quot;language-text&quot;&gt;Terminal&lt;/code&gt;/&lt;code class=&quot;language-text&quot;&gt;PowerShell&lt;/code&gt;, you will be asked to input a username and password for your linux account, input those accordingly:&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;powershell&quot;&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;install &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;d Ubuntu-24&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;04&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This installs WSL 2 with Ubuntu 24.04 (Replace with the latest/desired Ubuntu version). If not, you can manually install it from the Microsoft Store.&lt;/p&gt;
&lt;h3 id=&quot;confirm-installation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#confirm-installation&quot; aria-label=&quot;confirm installation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Confirm Installation&lt;/h3&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;powershell&quot;&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;wsl &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;list &lt;span class=&quot;token operator&quot;&gt;--&lt;/span&gt;verbose&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make sure Ubuntu is listed and running under WSL 2.
If installed successfully, you should also see &lt;code class=&quot;language-text&quot;&gt;Ubuntu 24.04.01 LTS&lt;/code&gt; option in terminal (click on dropdown box on right of the tab names). You can go to terminal &gt; settings &amp;#x26; set the default profile to &lt;code class=&quot;language-text&quot;&gt;Ubuntu 24.04.01 LTS&lt;/code&gt; - which will open the ubuntu  by default on terminal.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;install-zsh-ohmyzsh&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-zsh-ohmyzsh&quot; aria-label=&quot;install zsh ohmyzsh permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install zsh, ohmyzsh&lt;/h2&gt;
&lt;h3 id=&quot;zsh&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#zsh&quot; aria-label=&quot;zsh permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;zsh&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Install zsh using package manager&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; upgrade &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Verify installation&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Make it your default shell&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;chsh &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;zsh&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;ohmyzsh&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ohmyzsh&quot; aria-label=&quot;ohmyzsh permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;ohmyzsh&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Install ohmyzsh using curl&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;plugins&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#plugins&quot; aria-label=&quot;plugins permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Plugins&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Fetch autosuggesions, zsh-syntax-highlighting, zsh-fast-syntax-highlighting, zsh-autocomplete plugins&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;zsh&quot;&gt;&lt;pre class=&quot;language-zsh&quot;&gt;&lt;code class=&quot;language-zsh&quot;&gt;git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions &amp;amp;&amp;amp; \
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting &amp;amp;&amp;amp; \
git clone https://github.com/zdharma-continuum/fast-syntax-highlighting.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/fast-syntax-highlighting &amp;amp;&amp;amp; \
git clone --depth 1 https://github.com/marlonrichert/zsh-autocomplete.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autocomplete&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Add plugins to .zshrc&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;zsh&quot;&gt;&lt;pre class=&quot;language-zsh&quot;&gt;&lt;code class=&quot;language-zsh&quot;&gt;plugins=(
git
zsh-autosuggestions
zsh-syntax-highlighting
fast-syntax-highlighting
zsh-autocomplete
)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Reload your environment to make changes work&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;zsh&quot;&gt;&lt;pre class=&quot;language-zsh&quot;&gt;&lt;code class=&quot;language-zsh&quot;&gt;source ~/.zshrc&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;update--setup-ubuntu-packages&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#update--setup-ubuntu-packages&quot; aria-label=&quot;update  setup ubuntu packages permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Update &amp;#x26; setup Ubuntu Packages&lt;/h2&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; upgrade &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Install common tools, including dependencies for pyenv, protobuf etc.:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  keychain &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  build-essential &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  protobuf-compiler &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libssl-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  zlib1g-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libbz2-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libreadline-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libsqlite3-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;file&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libncursesw5-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  xz-utils &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  tk-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libxml2-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libxmlsec1-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  libffi-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  liblzma-dev &lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;
  just&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;install-python&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-python&quot; aria-label=&quot;install python permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Python&lt;/h2&gt;
&lt;p&gt;Ubuntu usually comes with Python pre-installed. Verify version:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;python3 &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For Python version management, install pyenv:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clone &lt;a href=&quot;https://github.com/pyenv/pyenv&quot;&gt;pyenv&lt;/a&gt; in the ~/.pyenv directory&lt;/li&gt;
&lt;li&gt;Install the python versions you need, for example&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;pyenv &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3.13&lt;/span&gt;.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;install-rust&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-rust&quot; aria-label=&quot;install rust permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Rust&lt;/h2&gt;
&lt;p&gt;Use the official Rust installer:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--proto&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;=https&apos;&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--tlsv1.2&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sSf&lt;/span&gt; https://sh.rustup.rs &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sh&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;token environment constant&quot;&gt;$HOME&lt;/span&gt;/.cargo/env&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Check installation:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;rustc &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cargo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;install-nodejs-npm-yarn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-nodejs-npm-yarn&quot; aria-label=&quot;install nodejs npm yarn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Node.js, npm, yarn&lt;/h2&gt;
&lt;p&gt;Use Node Version Manager (nvm) for flexibility:&lt;/p&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.bashrc
nvm &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--lts&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Verify the versions:&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;node&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;npm&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id=&quot;install-yarn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#install-yarn&quot; aria-label=&quot;install yarn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Install Yarn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Using the official Yarn APT repo:&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-sS&lt;/span&gt; https://dl.yarnpkg.com/debian/pubkey.gpg &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; apt-key &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; -
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;deb https://dl.yarnpkg.com/debian/ stable main&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/yarn.list
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; update &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-y&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Check version:&lt;/li&gt;
&lt;/ul&gt;

          &lt;div class=&quot;gatsby-remark-prismjs-copy-button-container&quot;&gt;
            &lt;div class=&quot;gatsby-remark-prismjs-copy-button&quot; tabindex=&quot;0&quot; role=&quot;button&quot; aria-pressed=&quot;false&quot; onclick=&quot;gatsbyRemarkCopyToClipboard(this, this.parentNode.nextElementSibling)&quot;&gt;
              Copy
            &lt;/div&gt;
          &lt;/div&gt;
          
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;command-line-prompt&quot;&gt;&lt;span data-user=root data-host=localhost&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;yarn&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h2 id=&quot;post-script&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#post-script&quot; aria-label=&quot;post script permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Post Script&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rohitmungre/homelab&quot;&gt;My home setup&lt;/a&gt;&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Databases Demystified]]></title><description><![CDATA[Databases are foundational to nearly all software systems, from small web apps to large-scale enterprise platforms. Modern development…]]></description><link>https://rohitmungre.com/databases/</link><guid isPermaLink="false">https://rohitmungre.com/databases/</guid><pubDate>Sat, 18 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Databases are foundational to nearly all software systems, from small web apps to large-scale enterprise platforms. Modern development offers a variety of database types—each suited to different kinds of data, workloads, and application needs.&lt;/p&gt;
&lt;p&gt;Below is an architect-level overview of databases, aimed at guiding technology choices in designing robust and scalable systems.&lt;/p&gt;
&lt;h2 id=&quot;types-of-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#types-of-databases&quot; aria-label=&quot;types of databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Types of Databases&lt;/h2&gt;
&lt;h3 id=&quot;relational-databases-rdbms&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#relational-databases-rdbms&quot; aria-label=&quot;relational databases rdbms permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Relational Databases (RDBMS)&lt;/h3&gt;
&lt;p&gt;Structured data stored in rows and columns, strong schema and ACID transactions.
Use when you need strong data consistency and structured schemas (e.g., banking).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Mature, reliable, strong consistency, Standardized query language (SQL)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Scaling horizontally is harder, rigid schema can slow development&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
MySQL, PostgreSQL, Oracle, SQL Server&lt;/p&gt;
&lt;h3 id=&quot;nosql-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#nosql-databases&quot; aria-label=&quot;nosql databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;NoSQL Databases&lt;/h3&gt;
&lt;p&gt;Flexible schema, designed for unstructured or semi-structured data, scalable.
Use when you need to handle varied and changing data structures or scale horizontally.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Highly scalable, flexible data models, good for big data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Eventual consistency, lack of standardization between NoSQL DBs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
MongoDB, Cassandra, Redis, Couchbase&lt;/p&gt;
&lt;h3 id=&quot;newsql-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#newsql-databases&quot; aria-label=&quot;newsql databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;NewSQL Databases&lt;/h3&gt;
&lt;p&gt;Hybrid of RDBMS and NoSQL: scalability with ACID properties.
Use when you want scalability without giving up strong consistency (e.g., financial apps).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Best of both worlds: scalability + strong consistency, SQL support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Still maturing compared to traditional RDBMS, fewer available products&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
CockroachDB, Google Spanner&lt;/p&gt;
&lt;h3 id=&quot;in-memory-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#in-memory-databases&quot; aria-label=&quot;in memory databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;In-Memory Databases&lt;/h3&gt;
&lt;p&gt;Data stored in RAM for extremely fast access.
Use when extremely low latency and high throughput are critical (e.g., caching).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Blazing fast reads/writes, simple to set up&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Data loss risk if not persisted properly, RAM limitations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
Redis, Memcached&lt;/p&gt;
&lt;h3 id=&quot;time-series-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time-series-databases&quot; aria-label=&quot;time series databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time-Series Databases&lt;/h3&gt;
&lt;p&gt;Optimized for storing and querying time-stamped or sequential data.
Use when dealing with IoT data, logs, or any event-driven systems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Efficient at handling huge amounts of chronological data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Not suitable for general-purpose database use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
InfluxDB, TimescaleDB, Prometheus&lt;/p&gt;
&lt;h3 id=&quot;graph-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#graph-databases&quot; aria-label=&quot;graph databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Graph Databases&lt;/h3&gt;
&lt;p&gt;Data modeled as nodes and edges representing relationships.
Use when relationships between entities are complex and deeply interconnected (e.g., social networks).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Natural modeling of connected data, efficient traversal queries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Steeper learning curve, specialized query languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
Neo4j, ArangoDB&lt;/p&gt;
&lt;h3 id=&quot;key-value-stores&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#key-value-stores&quot; aria-label=&quot;key value stores permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Key-Value Stores&lt;/h3&gt;
&lt;p&gt;Simple (key, value) pairs for high-speed lookups.
Use when you need fast simple lookups or session management.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Lightning fast for simple operations, extremely scalable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Not ideal for complex queries, data relationships not managed well&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
Redis, DynamoDB, Riak&lt;/p&gt;
&lt;h3 id=&quot;document-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#document-databases&quot; aria-label=&quot;document databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Document Databases&lt;/h3&gt;
&lt;p&gt;Data stored as JSON-like documents with flexible schemas.
Use when your data is semi-structured and schema may evolve over time.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Flexible, easy to store complex nested data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Lack of complex query capabilities compared to RDBMS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
MongoDB, CouchDB, Firestore&lt;/p&gt;
&lt;h3 id=&quot;columnar-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#columnar-databases&quot; aria-label=&quot;columnar databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Columnar Databases&lt;/h3&gt;
&lt;p&gt;Stores data by columns rather than rows; efficient for analytics.
Use when you perform heavy read analytics on large datasets (e.g., big data warehouses).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Great compression, high performance for OLAP workloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Poor for transactional systems (frequent small updates)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
Apache Cassandra, ClickHouse, BigQuery&lt;/p&gt;
&lt;h3 id=&quot;object-oriented-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#object-oriented-databases&quot; aria-label=&quot;object oriented databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Object-Oriented Databases&lt;/h3&gt;
&lt;p&gt;Stores data as objects, similar to object-oriented programming concepts.
Use when you want seamless persistence of complex data structures (e.g., CAD apps).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pros&lt;/strong&gt;: Natural mapping to OOP languages, good for complex hierarchies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cons&lt;/strong&gt;: Niche use case, limited support and adoption&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;
db4o, ObjectDB&lt;/p&gt;
&lt;h2 id=&quot;scaling-databases&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#scaling-databases&quot; aria-label=&quot;scaling databases permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Scaling Databases&lt;/h2&gt;
&lt;p&gt;Scaling i.e. handling more load — more users, more reads, more writes, or bigger datasets — can be a crucial factor
in selecting the database. Below are the types of scaling one need to consider:&lt;/p&gt;
&lt;h3 id=&quot;vertical-scaling-scale-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#vertical-scaling-scale-up&quot; aria-label=&quot;vertical scaling scale up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Vertical Scaling (Scale Up)&lt;/h3&gt;
&lt;p&gt;Add more CPU, RAM, or storage to a single server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Its simple to implement &amp;#x26; needs no changes in application code.&lt;/li&gt;
&lt;li&gt;Easier but has upper limits (hardware limitations) &amp;#x26; can get expensive quickly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;horizontal-scaling-scale-out&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#horizontal-scaling-scale-out&quot; aria-label=&quot;horizontal scaling scale out permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Horizontal Scaling (Scale Out)&lt;/h3&gt;
&lt;p&gt;Distribute data across multiple servers (sharding/partitioning).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Almost infinite scaling (theoretically), better fault tolerance&lt;/li&gt;
&lt;li&gt;Requires more architecture planning due to more complexity (replication, partitioning, consistency issues), needs redesigning applications sometimes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sharding-data-partitioning&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#sharding-data-partitioning&quot; aria-label=&quot;sharding data partitioning permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Sharding (Data Partitioning)&lt;/h3&gt;
&lt;p&gt;Splitting the database into pieces and storing them on different servers based on some rule (e.g., user_id).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reduces load on each server, enables horizontal scaling&lt;/li&gt;
&lt;li&gt;Complex to implement, hard to rebalance shards later if one shard becomes &quot;hot&quot; (too much traffic)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;replication&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#replication&quot; aria-label=&quot;replication permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Replication&lt;/h3&gt;
&lt;p&gt;Copying data across multiple servers (often one master, multiple replicas), use master-replica setups for high availability and read scaling&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improves read scalability, provides backup/failover if a node crashes&lt;/li&gt;
&lt;li&gt;Write bottleneck still at the master (unless multi-master, which adds complexity), potential for replication lag&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;caching-layer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#caching-layer&quot; aria-label=&quot;caching layer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Caching Layer&lt;/h3&gt;
&lt;p&gt;Store frequent queries or data in a fast, temporary storage (like Redis, Memcached).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reduces database load dramatically, improves response times.&lt;/li&gt;
&lt;li&gt;Cache invalidation is tricky, data in cache might be slightly stale&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;choosing-the-right-database&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#choosing-the-right-database&quot; aria-label=&quot;choosing the right database permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Choosing the Right Database&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strong consistency &amp;#x26; transactions&lt;/td&gt;
&lt;td&gt;PostgreSQL, MySQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema flexibility&lt;/td&gt;
&lt;td&gt;MongoDB, Couchbase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High throughput read/write&lt;/td&gt;
&lt;td&gt;Redis, Cassandra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complex relationships&lt;/td&gt;
&lt;td&gt;Neo4j, Postgres with CTEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Geospatial data&lt;/td&gt;
&lt;td&gt;PostGIS (PostgreSQL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache layer&lt;/td&gt;
&lt;td&gt;Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time analytics&lt;/td&gt;
&lt;td&gt;ClickHouse, Elasticsearch&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;modern-database-tools-and-ecosystem&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#modern-database-tools-and-ecosystem&quot; aria-label=&quot;modern database tools and ecosystem permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Modern Database Tools and Ecosystem&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool/Concept&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PgAdmin, DBeaver&lt;/td&gt;
&lt;td&gt;GUI for managing SQL databases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prisma, SQLAlchemy&lt;/td&gt;
&lt;td&gt;ORM libraries for app integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alembic, Flyway&lt;/td&gt;
&lt;td&gt;Database migrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RedisInsight&lt;/td&gt;
&lt;td&gt;GUI for Redis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kafka Connect&lt;/td&gt;
&lt;td&gt;Streaming data into/out of databases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;Postgres-based backend-as-a-service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Courage Amidst the Storm]]></title><description><![CDATA[A beautiful Marathi poem, penned by Ravindra Ghanshyam Deshpande, featured in the critically acclaimed Marathi movie 'Killa' (201…]]></description><link>https://rohitmungre.com/killa/</link><guid isPermaLink="false">https://rohitmungre.com/killa/</guid><pubDate>Thu, 14 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A beautiful Marathi poem, penned by Ravindra Ghanshyam Deshpande, featured in the critically acclaimed Marathi movie &apos;Killa&apos; (2014).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;सागराने नाविका मनी&lt;br&gt;
संकट मोठे पेरले&lt;br&gt;
वादळाने होडीस एका&lt;br&gt;
दशदिशांनी घेरले...&lt;/p&gt;
&lt;p&gt;शीळ तुटले, खेळ तुटले,&lt;br&gt;
कथा काय या वलयाची&lt;br&gt;
नाविकासही फिकीर नव्हती&lt;br&gt;
पुढे राहिल्या पल्ल्याची...&lt;/p&gt;
&lt;p&gt;नशिब नक्कते पाठीशी,&lt;br&gt;
नक्कता अनुभव गाठीशी&lt;br&gt;
उभा ठाकला एकटाच&lt;br&gt;
युद्ध होते वादळाच्या&lt;br&gt;
वय वर्षे साठीशी...&lt;/p&gt;
&lt;p&gt;स्वबली विश्वास मोठा&lt;br&gt;
त्यास तोड कर्तुत्वही&lt;br&gt;
रौद्र वादळ शांत झाले&lt;br&gt;
पाघळले श्रुत्वधीही...&lt;/p&gt;
&lt;p&gt;एकवटला धीर हा&lt;br&gt;
काढून येतो तत्क्षणी&lt;br&gt;
शतबाहुंचे बळ येते&lt;br&gt;
जो मातृत्व तरेल मनी...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;em&gt;Ravindra Ghanshyam Deshpande&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;english-translation&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#english-translation&quot; aria-label=&quot;english translation permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;English Translation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The sea bore an array of perils…&lt;br&gt;
A mighty storm ambushed the lone sailor…&lt;/p&gt;
&lt;p&gt;The sail snapped, the nails unhooked…..&lt;br&gt;
The sailor persisted, unfazed by what lay ahead&lt;/p&gt;
&lt;p&gt;Luckless, the knots of skill turned loose.&lt;br&gt;
He stood there alone, the storm slapped its noose&lt;/p&gt;
&lt;p&gt;A life lived in benevolence will not let the faith wither&lt;br&gt;
He overcame fear and the storm fulled into slither&lt;/p&gt;
&lt;p&gt;Courage of the universe, regathers in single moment&lt;br&gt;
A hundred arms’ strength regains, as the memory of mother returns.&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Starting up v/s PhD]]></title><description><![CDATA[Here are some of the points why I feel startups are similar to doing a PhD in many aspects You not only have to find solution to an existing…]]></description><link>https://rohitmungre.com/startup vs phd/</link><guid isPermaLink="false">https://rohitmungre.com/startup vs phd/</guid><pubDate>Tue, 30 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here are some of the points why I feel startups are similar to doing a PhD in many aspects&lt;/p&gt;
&lt;h3 id=&quot;you-not-only-have-to-find-solution-to-an-existing-problem---you-have-to-find-and-define-the-problem-itself&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#you-not-only-have-to-find-solution-to-an-existing-problem---you-have-to-find-and-define-the-problem-itself&quot; aria-label=&quot;you not only have to find solution to an existing problem   you have to find and define the problem itself permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;You not only have to find solution to an existing problem - you have to find and define the problem itself&lt;/h3&gt;
&lt;p&gt;PhD starts with making yourself familiar with the field in general by doing relevant courses, then gradually a problem statement is sketched, is made more and more concrete over many iterations. Similarly founders in startups not only have to solve a customer problem/necessity, they have to find what the problem/necessity is first. They spend doing market research, surveys , ground level work by interacting with customers first to arrive at the Value Proposition.&lt;/p&gt;
&lt;h3 id=&quot;the-cycle-of-idea---build---measure---validate---learn&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-cycle-of-idea---build---measure---validate---learn&quot; aria-label=&quot;the cycle of idea   build   measure   validate   learn permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The cycle of Idea -&gt; build -&gt; measure -&gt; validate -&gt; learn&lt;/h3&gt;
&lt;p&gt;After defining the problem statement comes the stage of ideation and experimentation. Both in PhD and startups, hypothesis are created, tools and mechanisms are built to test those hypothesis (a minimal viable product in startup) - data points are measured from that experimentation and learning is made whether that idea was validated or not.&lt;/p&gt;
&lt;h3 id=&quot;strong-feedback-mechanism&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#strong-feedback-mechanism&quot; aria-label=&quot;strong feedback mechanism permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Strong feedback mechanism&lt;/h3&gt;
&lt;p&gt;Both in startups and PhD, feedback is available from time to time which makes you question the direction you are working on and whether you need to evolve or pivot. In PhD feedback is given by professors, your data points and your own speculations in that direction, in startups its given by customers, products performance , VCs etc.&lt;/p&gt;
&lt;h3 id=&quot;both-are-strong-test-of-ones-character&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#both-are-strong-test-of-ones-character&quot; aria-label=&quot;both are strong test of ones character permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Both are strong test of one&apos;s character&lt;/h3&gt;
&lt;p&gt;I read recently that PhD is more of a test of a person&apos;s attitude and his character rather than his intellect. Because of the sheer nature of PhD - which is finding something that is not known to anyone else in the world - even the brightest minds start to question themselves. Similarly for Startups the one has to solve an undefined problem, find markets, make a product and survive in a highly competitive environment - which tests the emotional integrity of the toughest persons as well. High amounts of personal pressures,speculations and introspections are involved through out the journey. In both PhDs and startups the highs as well the lows are very extreme.&lt;/p&gt;
&lt;h3 id=&quot;at-the-end-of-a-phdstartup-you-are-one-of-the-best-persons-in-the-world-who-knows-about-that-field&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#at-the-end-of-a-phdstartup-you-are-one-of-the-best-persons-in-the-world-who-knows-about-that-field&quot; aria-label=&quot;at the end of a phdstartup you are one of the best persons in the world who knows about that field permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;At the end of a PhD/Startup you are one of the best persons in the world, who knows about that field&lt;/h3&gt;
&lt;p&gt;Most people get drenched into personal, emotional, financial, social pressures in the process and are not able to cope up with it. The ones who survive are the ones who have made a dent in the world - by adding to that was already existing.&lt;/p&gt;
&lt;h3 id=&quot;both-have-funding-problems-p&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#both-have-funding-problems-p&quot; aria-label=&quot;both have funding problems p permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Both have funding problems! (:p)&lt;/h3&gt;
&lt;p&gt;Raising money for an idea that you believe in but have no proven record that your hypothesis is true is not an easy task. Whether raising funding for research projects or pitching your idea to the VCs - both require good communication skills and structured thinking to convince someone else to put their money on you.&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Must need v/s nice to have]]></title><description><![CDATA[Building a Product I notice that majority of the startups that I come across are either B2C or B2B.
B2C make a product whose end user will…]]></description><link>https://rohitmungre.com/must v nice/</link><guid isPermaLink="false">https://rohitmungre.com/must v nice/</guid><pubDate>Sun, 07 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;building-a-product&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#building-a-product&quot; aria-label=&quot;building a product permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Building a Product&lt;/h2&gt;
&lt;p&gt;I notice that majority of the startups that I come across are either B2C or B2B.
B2C make a product whose end user will be a human customer where as B2B serve another business(es).&lt;/p&gt;
&lt;p&gt;Building B2B or C2B requires domain knowledge of particular businesses which most of recent grads like myself don&apos;t have. On the other hand, imagining yourself as a customer of any e-commerce or internet service comes intuitive to us, as we have been consuming different products our entire life.&lt;/p&gt;
&lt;p&gt;It especially helps being in mid-twenties right now in India, as its demographic is skewed highly towards young people. That means most of the people using your service—if you open an internet-based startup in India—will be under 30. This gives a lot of edge to young entrepreneurs in terms of tapping the nerves of their audience.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;idea-exploration&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#idea-exploration&quot; aria-label=&quot;idea exploration permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Idea Exploration&lt;/h2&gt;
&lt;p&gt;I came up with some B2C ideas in the last couple of months. These ideas were good on their own and were not blatant copies of something already done in the western world. But a big barrier I found was that these were “nice-to-have” products, not “must-haves.”&lt;/p&gt;
&lt;p&gt;But then I thought—is that really a barrier?&lt;/p&gt;
&lt;p&gt;When I think about tech giant companies like Google, Facebook, Paypal, etc., and how they started, I find that most of them were not must-haves in their early days. This made me think: when you&apos;re ideating a new product, do you imagine it to be a must-have or a nice-to-have?&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;defining-must-haves-and-nice-to-haves&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#defining-must-haves-and-nice-to-haves&quot; aria-label=&quot;defining must haves and nice to haves permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Defining Must-Haves and Nice-to-Haves&lt;/h2&gt;
&lt;p&gt;There are certain products that have become necessities of our lives, without which we cannot imagine living (e.g., vehicles, electricity, buildings). Then there are “nice-to-have” products like a Tag Heuer watch or a Mercedes-Benz—you can do without them.&lt;/p&gt;
&lt;p&gt;But this classification also depends on several variables:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time&lt;/strong&gt;: Mobile phones were once “nice-to-have”; now they are essential.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Place&lt;/strong&gt;: Living standards vary drastically across regions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Therefore, these attributes (must-have vs. nice-to-have) apply to &lt;strong&gt;specific segments of society&lt;/strong&gt; and must be evaluated based on context.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Start by imagining your product for one demographic of the society at a time and then scale it up.&lt;/em&gt;&lt;br&gt;
Ask: Is it a must-have for that group now? Could it become one in the future?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Peter Thiel once said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Start small and monopolize small markets. But small doesn&apos;t mean non-existent.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;creating-a-market&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#creating-a-market&quot; aria-label=&quot;creating a market permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Creating a Market&lt;/h2&gt;
&lt;p&gt;Creating a market for oneself is not new. A friend once explained this beautifully with an example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We had only one night canteen in our university campus. We had to walk half a kilometer for snacks, so most students went only when truly hungry.&lt;br&gt;
Then, night canteens were introduced in each hostel. Suddenly, more people went, some who never went before, and those who went rarely became regulars.&lt;br&gt;
A &lt;strong&gt;midnight catering market was created&lt;/strong&gt;.&lt;br&gt;
We never knew we were hungry every night until the option existed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;examples-from-big-tech&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#examples-from-big-tech&quot; aria-label=&quot;examples from big tech permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Examples from Big Tech&lt;/h2&gt;
&lt;p&gt;This holds true for many breakthrough companies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ford&lt;/strong&gt;: When automated cars launched, there was no proven market.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;If I had asked my customers what they wanted, they would have said a faster horse.&quot; – Henry Ford&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Google &amp;#x26; Facebook&lt;/strong&gt;: Cool to have at first; now social connection is a digital necessity.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These companies didn’t just serve a market—they &lt;strong&gt;created one&lt;/strong&gt; by tapping into the &lt;strong&gt;human nature of their users&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Peter Thiel again:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;The future will always be different, but it will always be rooted in the present world.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&quot;so-how-to-know-if-your-idea-is-a-must-have&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#so-how-to-know-if-your-idea-is-a-must-have&quot; aria-label=&quot;so how to know if your idea is a must have permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;So, How to Know If Your Idea is a Must-Have?&lt;/h2&gt;
&lt;p&gt;I believe most game-changing companies initially presented a solution to an existing problem that &lt;strong&gt;seemed nice-to-have&lt;/strong&gt;, but they made it indispensable over time by being &lt;strong&gt;10x better&lt;/strong&gt; than existing alternatives.&lt;/p&gt;
&lt;h3 id=&quot;examples&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#examples&quot; aria-label=&quot;examples permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Examples:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ford&lt;/strong&gt;: Replaced horses with more efficient transport&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google&lt;/strong&gt;: Better search UX&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Paypal&lt;/strong&gt;: Secure, fast money transfer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon&lt;/strong&gt;: Brought shopping to your screen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apple&lt;/strong&gt;: Created a consumer tech market from scratch&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;They converted nice-to-haves into must-haves.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sometimes, &lt;strong&gt;your users may not even know what they need&lt;/strong&gt;—which is why building something visionary often means &lt;strong&gt;not always following customer feedback blindly&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;final-thoughts&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#final-thoughts&quot; aria-label=&quot;final thoughts permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Edward J. v. K. Menge said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&quot;Breeding homing pigeons that could cover a given space with ever-increasing rapidity did not give us the laws of telegraphy, nor did breeding faster horses bring us the steam locomotive.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Identifying a market is key. Many game-changer companies created monopolies by solving real problems in &lt;strong&gt;radically new ways&lt;/strong&gt;. Even spotting such problems is a journey on its own.&lt;/p&gt;
&lt;p&gt;Now that technology is reaching more people than ever, and the internet has made phenomena like virality and data-sharing commonplace, the tech world’s potential is enormous—and evolving fast.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Technology is, after all, about blurring the lines between must-haves and nice-to-haves—creating things that never existed before.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-edit-20150608&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#-edit-20150608&quot; aria-label=&quot; edit 20150608 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;📝 Edit (2015/06/08)&lt;/h3&gt;
&lt;p&gt;Found out that there&apos;s a course on &lt;a href=&quot;https://www.udacity.com/&quot;&gt;Udacity&lt;/a&gt; — &lt;em&gt;How to Build a Startup&lt;/em&gt; — where the concept of creating new markets is elaborated.&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Zero to one]]></title><description><![CDATA[Zero to One is one of the most informative business books I have read. Peter Thiel models the world and explains concepts in a very…]]></description><link>https://rohitmungre.com/zero to one/</link><guid isPermaLink="false">https://rohitmungre.com/zero to one/</guid><pubDate>Wed, 27 May 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Zero to One&lt;/em&gt; is one of the most informative business books I have read.&lt;/p&gt;
&lt;p&gt;Peter Thiel models the world and explains concepts in a very intuitive and logical way. It&apos;s especially useful for people looking to start a business. It has an excellent blend of theoretical knowledge with practical real world examples, and is quite information dense. The experience of actually starting up and scaling companies gives a unique perspective onto things.&lt;/p&gt;
&lt;p&gt;Summarizing my key takeaways from the book below.&lt;/p&gt;
&lt;h3 id=&quot;key-takeaways&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#key-takeaways&quot; aria-label=&quot;key takeaways permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Key takeaways&lt;/h3&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Act of Singularity&lt;/strong&gt;&lt;br&gt;
When you create something new (going from zero to one), it is fundamentally different from when you extend what already exists (going from one to n). There is a fundamental difference between these two acts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No Single Formula&lt;/strong&gt;&lt;br&gt;
There is no single formula for building a company. Each company is different, each customer is different. There are many roads that lead to many destinations. Identifying opportunities is essential.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rooted Innovation&lt;/strong&gt;&lt;br&gt;
The future will always be different from the present, but it will also be rooted in today&apos;s world. You can have an idea which might be drastically different from whatever has been done up till now, but it has to be grounded in reality somehow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Incremental vs. Bold Moves&lt;/strong&gt;&lt;br&gt;
Make incremental advances, stay lean and flexible, improve on the competition and focus on products not sales. Although some exactly opposite principles would also be equally true.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Power of Sales&lt;/strong&gt;&lt;br&gt;
Sales is often underrated by geeks and engineers. Although ultimately having a well-built product with value underlying beneath it is important, sales is necessary for visibility, distribution, and bridging the gap between customers and the product. Superior sales and distribution by itself can create a monopoly with no product differentiation. Although the converse is not true.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Definite vs. Indefinite Future&lt;/strong&gt;&lt;br&gt;
If you treat the future as something definite, it makes sense to understand it, work it, and shape it. But if you expect an indefinite future ruled by randomness, you will give up on trying to master it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Durability Over Growth Alone&lt;/strong&gt;&lt;br&gt;
The value of a business today is the sum of all the money it will make in the future. Therefore an important criterion to check apart from growth is durability. For a company to be valuable, it must grow and endure. Try not to forget about the long-term implications, focusing on short-term growth only. An important question to ask: &lt;em&gt;Will this business still be there after ten years?&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Start Small, Think Big&lt;/strong&gt;&lt;br&gt;
Every startup must start with a small market. But small doesn&apos;t mean non-existent. Try not to be a small fish in a big pond, rather choose a small pond itself. Start small and monopolize, don&apos;t disrupt. Get the last mover’s advantage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Follow the Power Law&lt;/strong&gt;&lt;br&gt;
Try to monopolize and follow the power law. That seems to hold true in more situations than people realize. The biggest secret in venture capital is that the best investment in a successful fund equals or outperforms the entire rest of the fund combined.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Culture Is the Company&lt;/strong&gt;&lt;br&gt;
No company has a culture — every company &lt;em&gt;is&lt;/em&gt; a culture. A startup is a team of people on a mission, and a good culture is just what that looks like on the inside.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[The Road Not Taken]]></title><description><![CDATA[One of my favourite poems by Robert Frost: Two roads diverged in a yellow wood, And sorry I could not travel both And be one traveler, long…]]></description><link>https://rohitmungre.com/road not taken/</link><guid isPermaLink="false">https://rohitmungre.com/road not taken/</guid><pubDate>Wed, 25 Feb 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of my favourite poems by &lt;strong&gt;Robert Frost&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Two roads diverged in a yellow wood,&lt;br&gt;
And sorry I could not travel both&lt;br&gt;
And be one traveler, long I stood&lt;br&gt;
And looked down one as far as I could&lt;br&gt;
To where it bent in the undergrowth;&lt;/p&gt;
&lt;p&gt;Then took the other, as just as fair,&lt;br&gt;
And having perhaps the better claim,&lt;br&gt;
Because it was grassy and wanted wear;&lt;br&gt;
Though as for that the passing there&lt;br&gt;
Had worn them really about the same,&lt;/p&gt;
&lt;p&gt;And both that morning equally lay&lt;br&gt;
In leaves no step had trodden black.&lt;br&gt;
Oh, I kept the first for another day!&lt;br&gt;
Yet knowing how way leads on to way,&lt;br&gt;
I doubted if I should ever come back.&lt;/p&gt;
&lt;p&gt;I shall be telling this with a sigh&lt;br&gt;
Somewhere ages and ages hence:&lt;br&gt;
Two roads diverged in a wood, and I—&lt;br&gt;
I took the one less traveled by,&lt;br&gt;
And that has made all the difference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;em&gt;Robert Frost&lt;/em&gt;&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Zen of Python]]></title><description><![CDATA[One of the most influential and elegantly written guidelines in the world of programming. A reminder that programming is not just about…]]></description><link>https://rohitmungre.com/zen of python/</link><guid isPermaLink="false">https://rohitmungre.com/zen of python/</guid><pubDate>Sat, 17 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;One of the most influential and elegantly written guidelines in the world of programming. A reminder that programming is not just about getting things to work, it&apos;s also about doing so in a way that is clean, logical, and elegant.&lt;/p&gt;
&lt;p&gt;Quite philosophical and applicable to other areas in life at times.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Beautiful is better than ugly.&lt;br&gt;
Explicit is better than implicit.&lt;/p&gt;
&lt;p&gt;Simple is better than complex.&lt;br&gt;
Complex is better than complicated.&lt;/p&gt;
&lt;p&gt;Flat is better than nested.&lt;br&gt;
Sparse is better than dense.&lt;/p&gt;
&lt;p&gt;Readability counts.&lt;br&gt;
Special cases aren&apos;t special enough to break the rules.&lt;/p&gt;
&lt;p&gt;Although practicality beats purity.&lt;br&gt;
Errors should never pass silently.&lt;br&gt;
Unless explicitly silenced.&lt;/p&gt;
&lt;p&gt;In the face of ambiguity, refuse the temptation to guess.&lt;br&gt;
There should be one-- and preferably only one --obvious way to do it.&lt;br&gt;
Although that way may not be obvious at first unless you&apos;re Dutch.&lt;/p&gt;
&lt;p&gt;Now is better than never.&lt;br&gt;
Although never is often better than &lt;em&gt;right&lt;/em&gt; now.&lt;/p&gt;
&lt;p&gt;If the implementation is hard to explain, it&apos;s a bad idea.&lt;br&gt;
If the implementation is easy to explain, it may be a good idea.&lt;br&gt;
Namespaces are one honking great idea -- let&apos;s do more of those.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;em&gt;Tim Peters&lt;/em&gt;&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[City of Hope]]></title><description><![CDATA[A city covered in its own dust with people filled with hunger and lust Skyscrapers meet scraps of the slum noise takes over the birds' hum…]]></description><link>https://rohitmungre.com/City of hope/</link><guid isPermaLink="false">https://rohitmungre.com/City of hope/</guid><pubDate>Wed, 12 Nov 2014 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;A city covered in its own dust&lt;br&gt;
with people filled with hunger and lust&lt;/p&gt;
&lt;p&gt;Skyscrapers meet scraps of the slum&lt;br&gt;
noise takes over the birds&apos; hum&lt;/p&gt;
&lt;p&gt;Chaos, mayhem - there is a wild rush&lt;br&gt;
Daring ocean is the land&apos;s crush&lt;/p&gt;
&lt;p&gt;The crowd is running, searching for its soul&lt;br&gt;
Waiting for the destiny&apos;s dices to roll&lt;/p&gt;
&lt;p&gt;Beneath this bedlam, there exists hard work&lt;br&gt;
Workings of night and day, making this circus berserk&lt;/p&gt;
&lt;p&gt;Emotions run high here, aspirations even higher&lt;br&gt;
A very few do make it, but everyone&apos;s a trier&lt;/p&gt;
&lt;p&gt;All are visitors, lost are its own&lt;br&gt;
Beside the ocean - winds of liberty are blown&lt;/p&gt;
&lt;p&gt;But also comes along a saffron-green thunder&lt;br&gt;
The turn of events sometimes makes one wonder&lt;/p&gt;
&lt;p&gt;Is it the crowd or the Arabian sea,&lt;br&gt;
Who is staring at the ocean of people?&lt;/p&gt;
&lt;p&gt;The day is running, night is dope&lt;br&gt;
Still it is called the city of hope&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;em&gt;Rohit Mungre&lt;/em&gt;&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item><item><title><![CDATA[Blue]]></title><description><![CDATA[She had blue skin, And so did he. He kept it hid And so did she. They searched for blue Their whole life through, Then passed right by - And…]]></description><link>https://rohitmungre.com/blue/</link><guid isPermaLink="false">https://rohitmungre.com/blue/</guid><pubDate>Sat, 19 Oct 2013 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;She had blue skin,&lt;br&gt;
And so did he.&lt;br&gt;
He kept it hid&lt;br&gt;
And so did she.&lt;br&gt;
They searched for blue&lt;br&gt;
Their whole life through,&lt;br&gt;
Then passed right by -&lt;br&gt;
And never knew.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;— &lt;em&gt;Shel Silverstein, Every Thing on It&lt;/em&gt;&lt;/p&gt;</content:encoded><author>hi@rohitmungre.com</author></item></channel></rss>