<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Gaurav Singh</title>
    <description>The latest articles on DEV Community by Gaurav Singh (@gauravsingh9356).</description>
    <link>https://dev.to/gauravsingh9356</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F361854%2Fbfe06a93-5deb-44e7-8b60-62d555aefa99.jpg</url>
      <title>DEV Community: Gaurav Singh</title>
      <link>https://dev.to/gauravsingh9356</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gauravsingh9356"/>
    <language>en</language>
    <item>
      <title>Scaling the Data Layer in Distributed Systems</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Fri, 26 Dec 2025 12:18:47 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/scaling-the-data-layer-in-distributed-systems-49k3</link>
      <guid>https://dev.to/gauravsingh9356/scaling-the-data-layer-in-distributed-systems-49k3</guid>
      <description>&lt;p&gt;Scaling a stateless system is relatively straightforward. We can horizontally scale application servers by adding more instances behind a load balancer, and the system continues to work as expected.&lt;/p&gt;

&lt;p&gt;But what happens to the database?&lt;/p&gt;

&lt;p&gt;How can a database running on a single machine handle requests coming from N horizontally scaled application servers? Databases must scale too — and this is where things get interesting.&lt;/p&gt;

&lt;p&gt;The First Idea: Replication&lt;br&gt;
A natural first thought is:&lt;/p&gt;

&lt;p&gt;“Let’s just replicate the database and create multiple copies.”&lt;/p&gt;

&lt;p&gt;At first glance, this sounds reasonable. But the moment we try to scale traditional SQL databases using replication, we run into fundamental constraints.&lt;/p&gt;

&lt;p&gt;Why SQL Databases Don’t Scale Easily&lt;br&gt;
SQL databases are built around powerful guarantees:&lt;/p&gt;

&lt;p&gt;Joins across tables&lt;br&gt;
Cross-row and multi-table transactions&lt;br&gt;
Global constraints (foreign keys, unique keys, auto-increment IDs)&lt;br&gt;
All of these assume one critical thing:&lt;/p&gt;

&lt;p&gt;All data lives in one logical place.&lt;/p&gt;

&lt;p&gt;Once we attempt to shard or distribute SQL data:&lt;/p&gt;

&lt;p&gt;Joins turn into cross-network calls&lt;br&gt;
Transactions span machines&lt;br&gt;
Locks stop working globally&lt;br&gt;
As a result:&lt;/p&gt;

&lt;p&gt;Complexity explodes&lt;br&gt;
Performance degrades&lt;br&gt;
Application logic becomes significantly more complex&lt;br&gt;
This doesn’t mean SQL cannot be sharded — it can — but doing so safely requires heavy coordination and careful design.&lt;/p&gt;

&lt;p&gt;The Leader–Follower Model&lt;br&gt;
To improve scalability, many systems move to a leader–follower replication model.&lt;/p&gt;

&lt;p&gt;Press enter or click to view image in full size&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc54fi2d5euzsbt7pwu90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc54fi2d5euzsbt7pwu90.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
How It Works&lt;br&gt;
A single leader (primary) accepts all writes&lt;br&gt;
Followers (replicas) copy data from the leader&lt;br&gt;
Reads may be served from followers to scale read traffic&lt;br&gt;
This gives us:&lt;/p&gt;

&lt;p&gt;One source of truth for writes&lt;br&gt;
Multiple copies for read scaling and fault tolerance&lt;br&gt;
But a key question remains:&lt;/p&gt;

&lt;p&gt;How does the leader propagate writes to followers?&lt;/p&gt;

&lt;p&gt;The answer lies in replication strategies.&lt;/p&gt;

&lt;p&gt;Replication Strategies in Leader–Follower Systems&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Strong Consistency (Synchronous Replication)
In this model:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The leader writes data locally&lt;br&gt;
The leader waits for acknowledgements from a quorum (majority) of replicas&lt;br&gt;
Only then does it respond to the client&lt;br&gt;
This ensures:&lt;/p&gt;

&lt;p&gt;Strong consistency&lt;br&gt;
No stale reads (when reads also use quorum or leader)&lt;br&gt;
Tradeoffs:&lt;/p&gt;

&lt;p&gt;Higher write latency&lt;br&gt;
Reduced availability if replicas are slow or unavailable&lt;br&gt;
Importantly, strong consistency does not require waiting for all followers — waiting for a majority is sufficient.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Eventual Consistency (Asynchronous Replication)
Here:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The leader writes data locally&lt;br&gt;
It sends replication messages to followers&lt;br&gt;
It responds to the client without waiting for most acknowledgements&lt;br&gt;
This model:&lt;/p&gt;

&lt;p&gt;Improves write latency and throughput&lt;br&gt;
Allows reads from followers to return stale data temporarily&lt;br&gt;
Relies on the system eventually converging&lt;br&gt;
This is a deliberate tradeoff:&lt;/p&gt;

&lt;p&gt;Availability and performance over immediate consistency&lt;/p&gt;

&lt;p&gt;The Leader Bottleneck Problem&lt;br&gt;
Even with replication, a fundamental limitation remains:&lt;/p&gt;

&lt;p&gt;All writes still go through a single leader.&lt;/p&gt;

&lt;p&gt;As write QPS grows (e.g., 10K+ writes per second):&lt;/p&gt;

&lt;p&gt;The leader becomes a bottleneck&lt;br&gt;
CPU, I/O, and replication overhead increase&lt;br&gt;
Vertical scaling eventually hits limits&lt;br&gt;
At this point, simply adding more replicas doesn’t help — because replicas don’t accept writes.&lt;/p&gt;

&lt;p&gt;This is where partitioning (sharding) becomes necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Entry of NoSQL
&lt;/h2&gt;

&lt;p&gt;NoSQL databases emerged to solve exactly this problem:&lt;br&gt;
scaling writes and reads horizontally at massive scale.&lt;br&gt;
Key motivations behind NoSQL systems:&lt;/p&gt;

&lt;p&gt;High write throughput&lt;br&gt;
High availability&lt;br&gt;
Fault tolerance&lt;br&gt;
Geo-distribution&lt;br&gt;
Low latency at scale&lt;br&gt;
Rather than optimizing purely for normalization and storage efficiency, NoSQL systems are designed to scale by default.&lt;/p&gt;

&lt;p&gt;Sharding in NoSQL Databases&lt;br&gt;
NoSQL databases distribute data using sharding.&lt;/p&gt;

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

&lt;p&gt;How Sharding Works&lt;br&gt;
A partition (shard) key is chosen (e.g., user_id)&lt;br&gt;
The key is hashed or range-mapped&lt;br&gt;
Data is distributed across shards&lt;br&gt;
Each shard owns a mutually exclusive subset of data&lt;br&gt;
Common partitioning strategies:&lt;/p&gt;

&lt;p&gt;Consistent hashing&lt;br&gt;
Range-based partitioning (A–G, H–M, etc.)&lt;br&gt;
Choosing the correct shard key is critical:&lt;/p&gt;

&lt;p&gt;A poor shard key can cause hotspots and destroy scalability.&lt;/p&gt;

&lt;p&gt;Replication Inside a Shard&lt;br&gt;
Each shard is still replicated for fault tolerance.&lt;br&gt;
This is where two NoSQL replication models appear.&lt;/p&gt;

&lt;p&gt;Model 1: Leader–Follower per Shard&lt;br&gt;
Used by systems like:&lt;/p&gt;

&lt;p&gt;MongoDB&lt;br&gt;
DynamoDB&lt;br&gt;
HBase&lt;br&gt;
Per Shard:&lt;br&gt;
One leader&lt;br&gt;
Multiple followers&lt;br&gt;
Write Flow:&lt;br&gt;
Client routes request to shard leader&lt;br&gt;
Leader writes data&lt;br&gt;
Leader propagates to followers&lt;br&gt;
Leader waits for:&lt;br&gt;
Quorum acknowledgements (stronger consistency), or&lt;br&gt;
Minimal acknowledgements (eventual consistency)&lt;br&gt;
Read Flow:&lt;br&gt;
Reads may go to leader (fresh)&lt;br&gt;
Or followers (faster, possibly stale)&lt;br&gt;
This model is simple and efficient but still has:&lt;/p&gt;

&lt;p&gt;Leader hotspots&lt;br&gt;
Leader failover complexity&lt;br&gt;
Model 2: Quorum-Based (Leaderless) Replication&lt;br&gt;
Used by systems like:&lt;/p&gt;

&lt;p&gt;Cassandra&lt;br&gt;
Riak&lt;br&gt;
Dynamo-style designs&lt;br&gt;
Per Shard:&lt;br&gt;
No leader&lt;br&gt;
All replicas are equal&lt;br&gt;
Write Flow:&lt;br&gt;
Client sends write to any replica (coordinator)&lt;br&gt;
Coordinator sends write to all replicas&lt;br&gt;
Write succeeds when W replicas acknowledge&lt;br&gt;
Read Flow:&lt;br&gt;
Client reads from R replicas&lt;br&gt;
Latest version wins&lt;br&gt;
Inconsistencies are repaired in the background&lt;br&gt;
This model:&lt;/p&gt;

&lt;p&gt;Avoids leader bottlenecks&lt;br&gt;
Improves availability&lt;br&gt;
Requires conflict resolution and versioning&lt;br&gt;
Quorum Explained (Simply)&lt;/p&gt;

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

&lt;p&gt;Let:&lt;/p&gt;

&lt;p&gt;N = total replicas per shard&lt;br&gt;
W = replicas required to acknowledge a write&lt;br&gt;
R = replicas required for a read&lt;br&gt;
Rules:&lt;/p&gt;

&lt;p&gt;Strong consistency: R + W &amp;gt; N&lt;br&gt;
Eventual consistency: R + W ≤ N&lt;br&gt;
Examples:&lt;/p&gt;

&lt;p&gt;Banking, inventory → strong consistency&lt;br&gt;
Social feeds, likes, analytics → eventual consistency&lt;br&gt;
Quorum decisions are made per shard, not globally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;SQL databases struggle with horizontal write scaling due to strong global guarantees&lt;br&gt;
Leader–follower replication improves read scaling but not write scaling&lt;br&gt;
NoSQL databases solve this by sharding data ownership&lt;br&gt;
Each shard scales independently&lt;br&gt;
Replication within shards is handled using leader-based or quorum-based models&lt;br&gt;
Consistency is a configurable tradeoff, not a fixed property&lt;br&gt;
Modern data systems don’t ask “Can we scale?” — they ask “What consistency are we willing to trade for scale?”&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>database</category>
      <category>backend</category>
      <category>java</category>
    </item>
    <item>
      <title>Hey Team, Do check out this awesome doc for building E2E Distributed Job Scheduler!</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Sat, 24 May 2025 13:34:39 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/hey-team-do-check-out-this-awesome-doc-for-building-e2e-distributed-job-scheduler-3kg2</link>
      <guid>https://dev.to/gauravsingh9356/hey-team-do-check-out-this-awesome-doc-for-building-e2e-distributed-job-scheduler-3kg2</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/gauravsingh9356/building-a-distributed-job-scheduler-end2end-design-437f" class="crayons-story__hidden-navigation-link"&gt;Building a Distributed Job Scheduler: End2End Design&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/gauravsingh9356" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F361854%2Fbfe06a93-5deb-44e7-8b60-62d555aefa99.jpg" alt="gauravsingh9356 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/gauravsingh9356" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Gaurav Singh
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Gaurav Singh
                
              
              &lt;div id="story-author-preview-content-2522024" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/gauravsingh9356" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F361854%2Fbfe06a93-5deb-44e7-8b60-62d555aefa99.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Gaurav Singh&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/gauravsingh9356/building-a-distributed-job-scheduler-end2end-design-437f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 24 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/gauravsingh9356/building-a-distributed-job-scheduler-end2end-design-437f" id="article-link-2522024"&gt;
          Building a Distributed Job Scheduler: End2End Design
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/systemdesign"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;systemdesign&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/backend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;backend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/interview"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;interview&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/gauravsingh9356/building-a-distributed-job-scheduler-end2end-design-437f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/gauravsingh9356/building-a-distributed-job-scheduler-end2end-design-437f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>systemdesign</category>
      <category>backend</category>
      <category>interview</category>
      <category>aws</category>
    </item>
    <item>
      <title>Building a Distributed Job Scheduler: End2End Design</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Sat, 24 May 2025 13:33:49 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/building-a-distributed-job-scheduler-end2end-design-437f</link>
      <guid>https://dev.to/gauravsingh9356/building-a-distributed-job-scheduler-end2end-design-437f</guid>
      <description>&lt;p&gt;In today's software systems, many applications need to execute background tasks—at scale, reliably, and at the right time. This blog post covers a comprehensive system design for a Distributed Job Scheduler, diving deep into functional/non-functional requirements, high-level design, storage choices, idempotency, queue processing, and integration with tools like AWS SQS and Kafka.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔧 Functional Requirements&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users can submit jobs/tasks to run on a particular schedule.&lt;/li&gt;
&lt;li&gt;Support for manual triggering of jobs.&lt;/li&gt;
&lt;li&gt;Jobs are Python scripts (support for other languages can be added later).&lt;/li&gt;
&lt;li&gt;At-least-once execution of scheduled jobs.&lt;/li&gt;
&lt;li&gt;Recurring jobs with enable/disable mechanisms.&lt;/li&gt;
&lt;li&gt;Job sequencing support: Job1 -&amp;gt; Job2 -&amp;gt; Job3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📈 Non-Functional Requirements&lt;/strong&gt;&lt;br&gt;
High availability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At-least-once execution of jobs.&lt;/li&gt;
&lt;li&gt;Job runs must happen on or close to schedule (2-4s delay acceptable).&lt;/li&gt;
&lt;li&gt;Durability: no job should be lost even if system crashes.&lt;/li&gt;
&lt;li&gt;Delay notifications to users.&lt;/li&gt;
&lt;li&gt;Scalability to 10 billion jobs/day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📊 Throughput &amp;amp; Storage Estimations&lt;/strong&gt;&lt;br&gt;
Throughput: 10⁹ jobs/day → ~10⁴ jobs/sec&lt;br&gt;
Storage: Assuming 200 lines/job, 50 bytes/line, Total: 200 * 50 * 10⁹ = 10 TB/day for job binaries&lt;/p&gt;

&lt;p&gt;🏗️ High-Level Design&lt;br&gt;
🔹 API Design&lt;br&gt;
POST /api/v1/jobs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "taskId": "someUniqueId",
  "cron": "*/5 * * * *",
  "params": {
    "p1": "val1",
    "p2": "val2"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GET&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/v1/jobs/:jobId
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns job status.&lt;/p&gt;

&lt;p&gt;🧠 Database Considerations&lt;br&gt;
Since the system is write-heavy, choose NoSQL stores like DynamoDB, Cassandra, or MongoDB.&lt;/p&gt;

&lt;p&gt;Writes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create job&lt;/li&gt;
&lt;li&gt;Record job run&lt;/li&gt;
&lt;li&gt;Update status
Reads:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Poll jobs due in the next minute (configurable)&lt;br&gt;
Sort and enqueue&lt;/p&gt;

&lt;p&gt;❌ Why not SQL?&lt;br&gt;
No normalization required.&lt;br&gt;
ACID guarantees not critical.&lt;/p&gt;

&lt;p&gt;Sample Schema&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "time_bucket": "2025-05-24T10:00:00Z",
  "execution_time": "2025-05-24T10:00:05Z",
  "job_id": "job_abc_123",
  "user_id": "user_123",
  "status": "PENDING",
  "attempt": 0,
  "script_url": "s3://bucket-name/path-to-script.py"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔄 Scheduling &amp;amp; Execution Flow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WatcherService polls DB every minute (via a CronJob or periodic ECS task).&lt;/li&gt;
&lt;li&gt;Picks jobs for next 1-min window.&lt;/li&gt;
&lt;li&gt;Pushes to FIFO SQS Queue.&lt;/li&gt;
&lt;li&gt;ExecutorService pulls from SQS.&lt;/li&gt;
&lt;li&gt;Spawns isolated ECSContainer to run each job securely.&lt;/li&gt;
&lt;li&gt;Performs idempotent check.&lt;/li&gt;
&lt;li&gt;Executes and updates DB.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🧾 Sequence Diagram - LLD&lt;/p&gt;

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

&lt;p&gt;✅ Handling Duplicate Events (Idempotency)&lt;br&gt;
Problem:&lt;br&gt;
If the ExecutorService crashes mid-execution or fails before DeleteMessage, SQS redelivers the message.&lt;/p&gt;

&lt;p&gt;Solution:&lt;br&gt;
Implement idempotency by checking if jobRunId is already processed before executing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (jobRunId already in DB with status SUCCESS) {
   // Skip processing
} else {
   // Execute and update DB
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📬 FIFO SQS Acknowledgement Workflow&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ReceiveMessage: Executor polls for messages.&lt;/li&gt;
&lt;li&gt;Visibility Timeout starts.&lt;/li&gt;
&lt;li&gt;If successfully processed → DeleteMessage() → removes from queue.&lt;/li&gt;
&lt;li&gt;If not deleted within timeout → message is re-queued.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, the consumer must explicitly delete the message. This applies to all SQS-based systems.&lt;/p&gt;

&lt;p&gt;🧪 Java Boilerplate (SQS FIFO Consumer)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
String queueUrl = "https://sqs.us-east-1.amazonaws.com/your-queue-url";

ReceiveMessageRequest request = new ReceiveMessageRequest()
    .withQueueUrl(queueUrl)
    .withWaitTimeSeconds(10)
    .withMaxNumberOfMessages(1);

while (true) {
    List&amp;lt;Message&amp;gt; messages = sqs.receiveMessage(request).getMessages();
    for (Message msg : messages) {
        String body = msg.getBody();
        // Deserialize and process

        // Idempotency check here

        // Delete after successful execution
        sqs.deleteMessage(queueUrl, msg.getReceiptHandle());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔁 How Kafka Handles This?&lt;br&gt;
Kafka is different from SQS:&lt;/p&gt;

&lt;p&gt;Kafka does not auto-delete messages.&lt;br&gt;
Consumers commit offsets manually.&lt;br&gt;
To prevent duplication, maintain idempotency checks (e.g., jobRunId).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ConsumerRecords&amp;lt;String, String&amp;gt; records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord&amp;lt;String, String&amp;gt; record : records) {
    if (!jobAlreadyProcessed(record.key())) {
        process(record.value());
        markJobComplete(record.key());
    }
}
consumer.commitSync();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧠 What is Idempotency?&lt;br&gt;
A process is idempotent if running it multiple times has the same effect as running it once.&lt;/p&gt;

&lt;p&gt;Example in Job Scheduler:&lt;/p&gt;

&lt;p&gt;If a jobRunId is already marked as completed, skip execution.&lt;br&gt;
This ensures safe reprocessing in case of retries.&lt;/p&gt;

&lt;p&gt;📈 Metrics &amp;amp; Monitoring (Enhancement Ideas)&lt;br&gt;
Execution Metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jobs submitted/executed per minute/hour/day&lt;/li&gt;
&lt;li&gt;Average execution time&lt;/li&gt;
&lt;li&gt;Error/Success ratio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Infrastructure Health:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU/Memory usage for Executor nodes&lt;/li&gt;
&lt;li&gt;Queue size (SQS/Kafka lag)&lt;/li&gt;
&lt;li&gt;DB read/write latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Alerts &amp;amp; Dashboards:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up alarms for job delays, failures, or high retry count&lt;/li&gt;
&lt;li&gt;Use tools like Prometheus + Grafana or AWS CloudWatch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dead Letter Queues (DLQ):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For jobs that fail after multiple retries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Audit Logs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log job submissions, execution attempts, and results&lt;/li&gt;
&lt;li&gt;Store in Elasticsearch or S3 for analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;📌 Final Thoughts&lt;/strong&gt;&lt;br&gt;
This blog outlines the complete design of a scalable, reliable distributed job scheduler with real-world production-grade strategies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Durable job ingestion
Idempotent execution
FIFO queue management (SQS)
Resilience with AWS services
Extendable to Kafka or other Pub/Sub platforms
Ideas for metrics, monitoring, and alerting integration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks for reading! I share insightful Real World System Designs and DSA patterns every week. Follow for high-quality, actionable content that will level up your skills!&lt;/p&gt;

&lt;p&gt;Follow me for more such posts: &lt;a href="https://www.linkedin.com/in/gauravsingh9356/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/gauravsingh9356/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>backend</category>
      <category>interview</category>
      <category>aws</category>
    </item>
    <item>
      <title>Building a Scalable Real-Time Ticket Queue System - BookMyShow</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Mon, 14 Apr 2025 22:15:47 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/building-a-scalable-real-time-ticket-queue-system-bookmyshow-5h4b</link>
      <guid>https://dev.to/gauravsingh9356/building-a-scalable-real-time-ticket-queue-system-bookmyshow-5h4b</guid>
      <description>&lt;p&gt;Modern ticketing platforms like BookMyShow and DISTRICT handle massive traffic spikes (100k+ users) while maintaining fairness and real-time updates. This guide explores how to architect such a system using WebSockets, Redis, and a scalable backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📌 Problem Statement &amp;amp; Requirements&lt;/strong&gt;&lt;br&gt;
When selling limited tickets for high-demand events (concerts, festivals), we need:&lt;/p&gt;

&lt;p&gt;✔ Massive Scalability – Handle 100k+ concurrent users.&lt;br&gt;
✔ Fair Queueing – First-come-first-served (FCFS) using a real-time queue.&lt;br&gt;
✔ Resilience – Survive server crashes, network issues.&lt;br&gt;
✔ Real-Time Updates – Users see their live position in the queue.&lt;br&gt;
✔ Purchase Notifications – Alert users when it's their turn to buy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗 System Architecture Overview&lt;/strong&gt;&lt;br&gt;
🔹 Core Components&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client (Web/Mobile) – Connects via WebSocket for real-time updates.&lt;/li&gt;
&lt;li&gt;Load Balancer (NGINX, AWS ALB) – Distributes WebSocket connections.&lt;/li&gt;
&lt;li&gt;WebSocket Servers (Node.js, Go, etc.) – Maintain live connections.&lt;/li&gt;
&lt;li&gt;API Server (REST/GraphQL) – Handles ticket purchases.&lt;/li&gt;
&lt;li&gt;Redis – Manages queue (Sorted Set) and Pub/Sub for real-time sync.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sequence Diagram - LLD&lt;br&gt;
Let's understand the whole flow with the help of sequence diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw670k3blj8uhmgbcp05k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw670k3blj8uhmgbcp05k.png" alt="BookMyShow Ticketing Queue for ColdPlay Concert in India" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explaining the Sequence Diagram (Detailed Full Lifecycle Flow)&lt;br&gt;
This sequence diagram represents a complete lifecycle of a user joining the queue, getting updates in real time, buying a ticket, and how the system maintains synchronization across multiple servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's break it down step by step:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;👤 1. User Connects to Queue via WebSocket&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A user opens the app or website and initiates a WebSocket connection.&lt;/li&gt;
&lt;li&gt;The Load Balancer (e.g., NGINX, AWS ALB) routes this connection to one of the WebSocket servers (WS).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;➕ 2. User is Added to the Queue in Redis&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The WebSocket server adds the user to the sorted set (ZADD) in Redis.&lt;/li&gt;
&lt;li&gt;Additionally, it stores a mapping of user to server (HSET socket_clients) for monitoring/debugging (optional).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;✅ 3. User Receives Confirmation &amp;amp; Position&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Redis acknowledges the insert.&lt;/li&gt;
&lt;li&gt;The server calculates the user's rank in the queue (ZRANK) and sends the initial position to the user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🔁 4. Periodic Heartbeat (Health Check)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client sends periodic ping messages to keep the connection alive.&lt;/li&gt;
&lt;li&gt;Server responds with pong. This prevents timeout and helps detect disconnections.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🎟️ 5. User Buys a Ticket via API&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User clicks “Buy Ticket”.&lt;/li&gt;
&lt;li&gt;The API (can be same as WS or separate) removes them from the queue using ZREM.&lt;/li&gt;
&lt;li&gt;Publishes an event via PUBLISH to the queue_update_channel in Redis.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;📢 6. Redis Pub/Sub Broadcasts to All Servers&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;All WebSocket servers are subscribed to queue_update_channel.&lt;/li&gt;
&lt;li&gt;They receive the published message (userA-left) and act accordingly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;📬 7. Servers Calculate and Send Updated Queue Positions&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After someone leaves the queue, everyone behind them needs a new position.&lt;/li&gt;
&lt;li&gt;Each WebSocket server queries Redis (ZRANK) for the latest positions of their connected users.&lt;/li&gt;
&lt;li&gt;Sends updates via WebSocket.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🧹 8. Cleanup After Leaving&lt;/strong&gt;&lt;br&gt;
Once the user leaves or buys the ticket, we remove their socket mapping (optional).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🤝 Server-to-Server Communication (Why This Works)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Servers don’t talk to each other directly — instead:&lt;/li&gt;
&lt;li&gt;All servers are subscribers to the same Redis Pub/Sub channel.&lt;/li&gt;
&lt;li&gt;When a queue change happens (buy/leave), a message is published to Redis.&lt;/li&gt;
&lt;li&gt;Redis broadcasts it to all subscribers (all WS servers).&lt;/li&gt;
&lt;li&gt;Each server reacts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🚀 Benefits of This Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No tight coupling between servers.&lt;/li&gt;
&lt;li&gt;Highly scalable — just add more WS servers.&lt;/li&gt;
&lt;li&gt;Single source of truth (Redis).&lt;/li&gt;
&lt;li&gt;Can easily recover from failure (via reconnect + Redis state).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;🔌 Deep Dive: Key Mechanisms&lt;/strong&gt;&lt;br&gt;
1️⃣ Redis Data Structure (Sorted Set - ZSET)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ZADD concert_queue  &lt;/li&gt;
&lt;li&gt;ZRANK concert_queue  → Returns position (0 = first).&lt;/li&gt;
&lt;li&gt;ZREM concert_queue  → Removes user after purchase.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;✅ Why Sorted Set?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O(log N) time complexity for inserts/removals.&lt;/li&gt;
&lt;li&gt;Atomic operations prevent race conditions.&lt;/li&gt;
&lt;li&gt;
2️⃣ WebSocket Flow (Real-Time Updates)
Client-Side Connection
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const socket = new ReconnectingWebSocket("wss://tickets.example.com/queue");

socket.onopen = () =&amp;gt; {
  socket.send(JSON.stringify({ 
    type: "join_queue", 
    userId: "user123", 
    authToken: "Bearer xyz" 
  }));
};

socket.onmessage = (event) =&amp;gt; {
  const data = JSON.parse(event.data);
  if (data.type === "position_update") {
    console.log(`Your position: ${data.position}`);
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Server-Side Handling&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const WebSocketMap = new Map(); // userId → WebSocket

wss.on("connection", (socket) =&amp;gt; {
  socket.on("message", async (msg) =&amp;gt; {
    const { type, userId } = JSON.parse(msg);

    if (type === "join_queue") {
      WebSocketMap.set(userId, socket);
      const position = await redis.zrank("concert_queue", userId);
      socket.send(JSON.stringify({ type: "position_update", position }));
    }
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ Pub/Sub for Cross-Server Sync&lt;br&gt;
When a user buys a ticket (or leaves), we remove them from the queue and notify all servers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// API Server (after ticket purchase)
await redis.zrem("concert_queue", userId);
await redis.publish("queue_updates", JSON.stringify({ 
  event: "user_left", 
  userId 
}));

// All WebSocket Servers (subscribed)
redis.subscribe("queue_updates");
redis.on("message", (channel, msg) =&amp;gt; {
  const { event, userId } = JSON.parse(msg);
  if (event === "user_left") {
    // Recalculate &amp;amp; broadcast positions
    WebSocketMap.forEach(async (socket, userId) =&amp;gt; {
      const position = await redis.zrank("concert_queue", userId);
      socket.send(JSON.stringify({ type: "position_update", position }));
    });
  }
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's Understand it by going one step more deeper &lt;/p&gt;

&lt;p&gt;🔌 WebSocket Flow (Client ↔️ Server)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client Connects to WebSocket
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const socket = new WebSocket("wss://ticket.com/ws");
socket.send(JSON.stringify({ type: "join", userId: "userA" }));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Server Handles Connection
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wss.on("connection", (socket) =&amp;gt; {
  socket.on("message", async (msg) =&amp;gt; {
    const data = JSON.parse(msg);
    if (data.type === "join") {
      WebSocketMap.set(data.userId, socket);
      const position = await redis.zrank("concert_queue", data.userId);
      socket.send(JSON.stringify({ type: "queue_update", position }));
    }
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Queue Position Update (Purchase or Leave)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Example: userB buys ticket
await redis.zrem("concert_queue", "userB");

// Publish event
redis.publish("queue_update_channel", JSON.stringify({ userId: "userB" }));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Pub/Sub Broadcasting
Every server listens:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;redis.subscribe("queue_update_channel");

redis.on("message", async (channel, msg) =&amp;gt; {
  const data = JSON.parse(msg);
  // broadcast to all WebSocket clients
  WebSocketMap.forEach(async (socket, userId) =&amp;gt; {
    const position = await redis.zrank("concert_queue", userId);
    socket.send(JSON.stringify({ type: "queue_update", position }));
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧩 Handling Edge Cases&lt;/strong&gt;&lt;br&gt;
🔴 1. WebSocket Server Crashes&lt;br&gt;
Problem: In-memory WebSocketMap is lost. &lt;/p&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clients auto-reconnect using ReconnectingWebSocket.&lt;/li&gt;
&lt;li&gt;On reconnect, server re-fetches position from Redis.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🔴 2. Client Disconnects (Network Issues)&lt;br&gt;
Solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Heartbeat checks (ping/pong).&lt;/li&gt;
&lt;li&gt;If no response for 30s, remove from queue:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await redis.zrem("concert_queue", userId);
redis.publish("queue_updates", JSON.stringify({ userId }));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🔴 3. Redis High Availability&lt;br&gt;
Solution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use Redis Cluster + Persistent Storage.&lt;/li&gt;
&lt;li&gt;Fallback to database-backed queue if Redis fails.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;⚡ Scaling Strategies&lt;/strong&gt;&lt;br&gt;
Component Scaling Approach &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WebSocket Servers -&amp;gt; Horizontal scaling + sticky sessions.&lt;/li&gt;
&lt;li&gt;Redis -&amp;gt; Sharding (if queue exceeds memory).&lt;/li&gt;
&lt;li&gt;API Servers -&amp;gt; Stateless, auto-scaling (Kubernetes).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;✅ Final Architecture - FlowChart Diagram&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fqnra69vb5nwncg3izb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fqnra69vb5nwncg3izb.png" alt="FlowChart for demonstrating Scalable ticket queue artitechture" width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🚀 Conclusion&lt;/strong&gt;&lt;br&gt;
This architecture ensures: &lt;/p&gt;

&lt;p&gt;✔ Real-time queue updates via WebSockets. &lt;br&gt;
✔ Scalability with Redis + horizontal scaling. &lt;br&gt;
✔ Resilience against crashes and disconnects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Used by: DICE, DISTRICT, Ticketmaster’s virtual queues.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;What are Next Steps - *&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add rate limiting to prevent abuse.&lt;/li&gt;
&lt;li&gt;Implement priority queues (e.g., premium users).&lt;/li&gt;
&lt;li&gt;Use Kubernetes for auto-scaling.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is how we can make scalable, reliable and maintable real time artitechtures where we can handle millions of traffic!&lt;/p&gt;

&lt;p&gt;Read this far ? hope you liked the article 😊 Yes ? Give the thumps Up! and leave your feedback. It gives me motivation to write more and share with the community!&lt;/p&gt;

&lt;p&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/gauravsingh9356/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/gauravsingh9356/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>systemdesign</category>
      <category>redis</category>
      <category>socket</category>
    </item>
    <item>
      <title>J.A.R.V.I.S Crossed 700+ 🌟 Stars and 160+ Forks on GitHub!</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Mon, 18 Dec 2023 07:08:32 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/jarvis-crossed-700-stars-and-160-forks-on-github-nb0</link>
      <guid>https://dev.to/gauravsingh9356/jarvis-crossed-700-stars-and-160-forks-on-github-nb0</guid>
      <description>&lt;p&gt;Hello Everyone 👋 , Excited to share that 𝐉.𝐀.𝐑.𝐕.𝐈.𝐒 have crossed more than &lt;strong&gt;700+ ⭐ and 160+ forks on GitHub&lt;/strong&gt;. It was the project developed by me during my first year of my college. Being my first project, it remains very special to me, it feels so unreal and wonderful to know work you have done, getting so much love.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbuwaak0bxv22cq3cx1db.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbuwaak0bxv22cq3cx1db.jpg" alt="Bot Reading Newspaper" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does...&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Dynamic Authentication using Optical Face Recognition&lt;/li&gt;
&lt;li&gt;    Send emails&lt;/li&gt;
&lt;li&gt;    Dynamic News Reporting at any time with api integration&lt;/li&gt;
&lt;li&gt;    Todo list generator, Yes it remembers all!&lt;/li&gt;
&lt;li&gt;    Open any website with just a voice command&lt;/li&gt;
&lt;li&gt;    Plays Music&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8apth9cbu1ct9nw92i5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8apth9cbu1ct9nw92i5.png" alt="Facial Recognition" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Tells time&lt;/li&gt;
&lt;li&gt;    Wikipedia powered AI&lt;/li&gt;
&lt;li&gt;    Dictionary with Intelligent Sensing i.e. auto checking  if spell mistake&lt;/li&gt;
&lt;li&gt;    Weather Report such as temp, wind speed, humidity, weather description&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepeuo0h10arj970o8bti.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepeuo0h10arj970o8bti.jpg" alt="Optical Character Recognition" width="800" height="647"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Latitude and longitude&lt;/li&gt;
&lt;li&gt;    YouTube searching&lt;/li&gt;
&lt;li&gt;    Google Map searching&lt;/li&gt;
&lt;li&gt;    YouTube Downloader, download any youtube video by just putting url of video&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F850j7p31x7e18vxhkrl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F850j7p31x7e18vxhkrl5.png" alt="Youtube Downloader" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;    Now Master can switch b/w J.A.R.V.I.S and F.R.I.D.A.Y, switch to female voice assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This shows how great and big open source is. I am working to make it even bigger. Will share some more new features very soon.&lt;/p&gt;

&lt;p&gt;Thanks to Everyone who have made their valuable contributions ❤.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>Ownership - It's Importance in Software Engineering</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Tue, 10 Oct 2023 14:48:44 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/ownership-its-importance-in-software-engineering-34bo</link>
      <guid>https://dev.to/gauravsingh9356/ownership-its-importance-in-software-engineering-34bo</guid>
      <description>&lt;p&gt;A good software engineer's most important skill is ownership &lt;/p&gt;

&lt;p&gt;Ownership is one thing I've learnt by hustling in startups!&lt;/p&gt;

&lt;p&gt;And ownership doesn't just means to get the job done! 🙅‍♂️&lt;/p&gt;

&lt;p&gt;Its about treating the product as your own, not just thinking about its development, but how you can improve the architecture, how can you improve the performance, and also how can you improve the product as a whole!&lt;/p&gt;

&lt;p&gt;Thinking about new features.&lt;br&gt;
Thinking about improving user experience.&lt;br&gt;
Thinking about increasing user retension!&lt;/p&gt;

&lt;p&gt;I love the Amazon's "Customer Obsession" principle, I truly believe it's one of the most important principle which separates good engineers from great one's!&lt;/p&gt;

&lt;p&gt;One tip to improve your "Product Engineering" skills: Remove the concept of tech &amp;amp; implementation from your head before you think about a product, don't think about how complex it will be, is it feasible or not, just think about the best product you can!&lt;/p&gt;

&lt;p&gt;Everything can be built by great engineers :)&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>webdev</category>
      <category>community</category>
      <category>software</category>
    </item>
    <item>
      <title>🌟 Sharing My Exciting 6-Month Internship Journey at Amazon! 🎉</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Sun, 03 Sep 2023 18:36:19 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/sharing-my-exciting-6-month-internship-journey-at-amazon-5hmb</link>
      <guid>https://dev.to/gauravsingh9356/sharing-my-exciting-6-month-internship-journey-at-amazon-5hmb</guid>
      <description>&lt;p&gt;I am thrilled to share that today marks the end of an incredible chapter in my professional journey! Over the past six months, I have had the privilege of being a part of an amazing team and gaining invaluable experience as an &lt;strong&gt;SDE Intern at Amazon&lt;/strong&gt; 🚀.&lt;/p&gt;

&lt;p&gt;From day one, I was warmly welcomed into the company and immersed in a dynamic and collaborative work environment. During my internship, I had the opportunity to work on a variety of challenging projects that allowed me to apply my skills and knowledge in practical ways. ✨&lt;/p&gt;

&lt;p&gt;From conducting market research to assisting with project management, every task presented new learning opportunities and helped me sharpen my abilities.&lt;/p&gt;




&lt;p&gt;As I reflect on these past six months, I am filled with a profound sense of growth and accomplishment. The challenges I faced have helped me develop resilience and problem-solving skills, which I know will serve me well in my future endeavors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Let's Connect!&lt;/strong&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/gauravsingh9356/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/gauravsingh9356/&lt;/a&gt;&lt;br&gt;
Github: &lt;a href="https://github.com/gauravsingh9356" rel="noopener noreferrer"&gt;https://github.com/gauravsingh9356&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://twitter.com/GauravS36826604" rel="noopener noreferrer"&gt;https://twitter.com/GauravS36826604&lt;/a&gt;&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>development</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🔥 600+ 🌟 and 140+ Forks to J.A.R.V.I.S 🚀, Added Dynamic Face Recognition to J.A.R.V.I.S 🤖</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Sun, 14 May 2023 14:07:26 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/600-and-140-forks-to-jarvis-added-dynamic-face-recognition-to-jarvis-lo6</link>
      <guid>https://dev.to/gauravsingh9356/600-and-140-forks-to-jarvis-added-dynamic-face-recognition-to-jarvis-lo6</guid>
      <description>&lt;p&gt;&lt;strong&gt;J.A.R.V.I.S (Just A Rather Very Intelligent System)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Feature:&lt;/strong&gt; Dynamic Face Recognition&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;What it does...&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic Authentication using Optical Face Recognition&lt;/li&gt;
&lt;li&gt;    Send emails&lt;/li&gt;
&lt;li&gt;    Dynamic News Reporting at any time with api integration&lt;/li&gt;
&lt;li&gt;    Todo list generator, Yes it remembers all!&lt;/li&gt;
&lt;li&gt;    Open any website with just a voice command&lt;/li&gt;
&lt;li&gt;    Plays Music&lt;/li&gt;
&lt;li&gt;    Tells time&lt;/li&gt;
&lt;li&gt;    Wikipedia powered AI&lt;/li&gt;
&lt;li&gt;    Dictionary with Intelligent Sensing i.e. auto checking if spell mistake&lt;/li&gt;
&lt;li&gt;    Weather Report such as temp, wind speed, humidity, weather description&lt;/li&gt;
&lt;li&gt;    Latitude and longitude&lt;/li&gt;
&lt;li&gt;    YouTube searching&lt;/li&gt;
&lt;li&gt;    Google Map searching&lt;/li&gt;
&lt;li&gt;    YouTube Downloader, download any youtube video by just putting url of video&lt;/li&gt;
&lt;li&gt;    Now Master can switch b/w J.A.R.V.I.S and F.R.I.D.A.Y, switch to female voice assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;[GitHub Code](&lt;a href="https://github.com/GauravSingh9356/J.A.R.V.I.S" rel="noopener noreferrer"&gt;https://github.com/GauravSingh9356/J.A.R.V.I.S&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Future Plans:&lt;/strong&gt;&lt;br&gt;
Sky is limit. There are immense possibilities in this project. Will be integrating some very powerful commands soon..&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contribution:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thank you for your interest in contributing to our Repo! Pull requests are welcome. For adding new feature or improving structure or fixing typos, please make a PR with your fixes. We are happy for every contribution. A lot can be done with this project. Core AI chatbot like functionality can be added. More python scripts can be associated. Pull requests for any such changes are accepted. Feel free to fork this project and make your own changes too.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>python</category>
      <category>github</category>
    </item>
    <item>
      <title>J.A.R.V.I.S Crossed 500+ 🌟 Stars and 130+ Forks on GitHub!</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Sun, 07 May 2023 13:17:51 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/jarvis-crossed-500-stars-and-130-forks-on-github-1bke</link>
      <guid>https://dev.to/gauravsingh9356/jarvis-crossed-500-stars-and-130-forks-on-github-1bke</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hello Everyone&lt;/strong&gt; 👋 , Excited to share that 𝐉.𝐀.𝐑.𝐕.𝐈.𝐒 have crossed more than 500+ ⭐ and 130+ forks on GitHub. It was the project developed by me during my first year of my college. Being my first project, it remains very special to me, it feels so unreal and wonderful to know work you have done, getting so much love.&lt;/p&gt;

&lt;p&gt;This shows how great and big open source is. I am working to make it even bigger. Will share some more new features very soon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4koxs986a8y1udi8w9ex.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4koxs986a8y1udi8w9ex.jpg" alt="J.A.R.V.I.S" width="300" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to Everyone who have made their valuable contributions ❤.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lnkd.in/eJWnaEk" rel="noopener noreferrer"&gt;https://lnkd.in/eJWnaEk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
    <item>
      <title>And We DID IT! || J.A.R.V.I.S Reached 400+ 🌟 and 100+ forks || GauravSingh9356</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Wed, 26 Jan 2022 16:02:26 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/and-we-did-it-jarvis-reached-400-and-100forks-gauravsingh9356-4ohe</link>
      <guid>https://dev.to/gauravsingh9356/and-we-did-it-jarvis-reached-400-and-100forks-gauravsingh9356-4ohe</guid>
      <description>&lt;p&gt;&lt;strong&gt;Hi All!&lt;/strong&gt; 👋&lt;br&gt;
This is a appreciation post to all the open source lovers out there, &lt;strong&gt;J.A.R.V.I.S&lt;/strong&gt; has now crossed over &lt;strong&gt;400+ ⭐ and 100+ fork&lt;/strong&gt;s on GitHub. I am overwhelmed with this amazing response. &lt;/p&gt;

&lt;p&gt;If you have not checked it please check it out once, I promise this will be one of the amazing beginner project that will take your python skill to &lt;strong&gt;NEXT Level!&lt;/strong&gt;. You will understand how cool things you can make with python!&lt;/p&gt;

&lt;p&gt;Recently I have added &lt;strong&gt;Optical Text Recognition (OCR)&lt;/strong&gt; with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GauravSingh9356/J.A.R.V.I.S" rel="noopener noreferrer"&gt;GitHub Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwin0mhnwczyunfmnh11.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwin0mhnwczyunfmnh11.jpg" alt="JARVIS Cover" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Again Big THANKS!&lt;/strong&gt;&lt;br&gt;
Gaurav Singh&lt;/p&gt;

</description>
      <category>python</category>
      <category>github</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>SEMESTER PROJECT DEMO</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Sun, 01 Aug 2021 15:51:28 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/semester-project-demo-4bg5</link>
      <guid>https://dev.to/gauravsingh9356/semester-project-demo-4bg5</guid>
      <description>&lt;p&gt;Hello All,&lt;br&gt;
Hope all of you are doing well!. I have completed my 4th semester and in which I have developed a real world Tour Management project. Demo can be seen here.&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=qe26kgANEXk" rel="noopener noreferrer"&gt;Youtube Link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GauravSingh9356/GN_Tours_Services" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
Plss don't forget to leave your comments and feedback!&lt;br&gt;
Cheers!&lt;/p&gt;

</description>
      <category>java</category>
      <category>showdev</category>
      <category>mysql</category>
      <category>devops</category>
    </item>
    <item>
      <title>Real Time Face Mask Detection || Tensorflow || OpenCV</title>
      <dc:creator>Gaurav Singh</dc:creator>
      <pubDate>Wed, 09 Jun 2021 17:41:13 +0000</pubDate>
      <link>https://dev.to/gauravsingh9356/real-time-face-mask-detection-tensorflow-opencv-33k0</link>
      <guid>https://dev.to/gauravsingh9356/real-time-face-mask-detection-tensorflow-opencv-33k0</guid>
      <description>&lt;p&gt;Hello, Devs! Worked on CNN model to detect a masked face. The model is currently working with an accuracy of 98.537%. Working on it to improve its accuracy further.&lt;/p&gt;

&lt;p&gt;𝐍𝐞𝐭𝐰𝐨𝐫𝐤 𝐮𝐬𝐞𝐝 : 𝐂𝐨𝐧𝐯𝐨𝐥𝐮𝐭𝐢𝐨𝐧𝐚𝐥 𝐍𝐞𝐮𝐫𝐚𝐥 𝐍𝐞𝐭𝐰𝐨𝐫𝐤&lt;br&gt;
𝐅𝐚𝐜𝐞 𝐃𝐞𝐭𝐞𝐜𝐭𝐢𝐨𝐧: 𝐇𝐚𝐚𝐫-𝐜𝐚𝐬𝐜𝐚𝐝𝐞&lt;br&gt;
𝐅𝐫𝐚𝐦𝐞𝐰𝐨𝐫𝐤 𝐮𝐬𝐞𝐝: 𝐓𝐞𝐧𝐬𝐨𝐫𝐟𝐥𝐨𝐰&lt;br&gt;
𝐀𝐏𝐈 𝐮𝐬𝐞𝐝: 𝐊𝐞𝐫𝐚𝐬&lt;br&gt;
𝐂𝐨𝐦𝐩𝐮𝐭𝐞𝐫 𝐕𝐢𝐬𝐢𝐨𝐧 𝐥𝐢𝐛𝐫𝐚𝐫𝐲 𝐮𝐬𝐞𝐝 : 𝐎𝐩𝐞𝐧𝐂𝐕 &lt;br&gt;
𝐓𝐞𝐬𝐭𝐢𝐧𝐠 𝐕𝐢𝐝𝐞𝐨: &lt;a href="https://lnkd.in/dk7ad9a" rel="noopener noreferrer"&gt;https://lnkd.in/dk7ad9a&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/GauravSingh9356/Computer-Vision/tree/master/Face%20Mask%20Detection" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>deeplearning</category>
      <category>machinelearning</category>
      <category>devops</category>
      <category>github</category>
    </item>
  </channel>
</rss>
