<?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: Ramanand Tomar</title>
    <description>The latest articles on DEV Community by Ramanand Tomar (@ramanand_tomar).</description>
    <link>https://dev.to/ramanand_tomar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4178439%2Ff592b136-ae97-49da-8647-08602ac2a306.png</url>
      <title>DEV Community: Ramanand Tomar</title>
      <link>https://dev.to/ramanand_tomar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramanand_tomar"/>
    <language>en</language>
    <item>
      <title>Building a Zero-Cloud P2P File Sharing Engine with React Native, TCP Sockets, and UDP Broadcasting</title>
      <dc:creator>Ramanand Tomar</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:18:06 +0000</pubDate>
      <link>https://dev.to/ramanand_tomar/building-a-zero-cloud-p2p-file-sharing-engine-with-react-native-tcp-sockets-and-udp-broadcasting-3if5</link>
      <guid>https://dev.to/ramanand_tomar/building-a-zero-cloud-p2p-file-sharing-engine-with-react-native-tcp-sockets-and-udp-broadcasting-3if5</guid>
      <description>&lt;p&gt;Standard mobile file sharing solutions frequently route local data through intermediary cloud storage infrastructure. Relaying gigabyte-scale payloads through centralized cloud buckets introduces substantial network latency, incurs redundant bandwidth expenditure, and presents clear data isolation risks. To overcome these constraints, I designed and developed &lt;strong&gt;ShareConnect&lt;/strong&gt;, a high-throughput, serverless, peer-to-peer (P2P) file transfer application built with &lt;strong&gt;React Native&lt;/strong&gt;, &lt;strong&gt;raw TCP socket streams&lt;/strong&gt;, &lt;strong&gt;UDP subnet broadcasting&lt;/strong&gt;, and &lt;strong&gt;MMKV&lt;/strong&gt;. This document details the network handshake protocol, chunked streaming pipeline, backpressure management, and architecture required to achieve 30 to 50+ MB/s direct throughput across local network interfaces.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Direct Peer Discovery and Handshake Protocol
&lt;/h2&gt;

&lt;p&gt;Establishing an offline transport between two client runtimes without an intermediary signaling server requires a deterministic three-phase lifecycle:&lt;/p&gt;

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

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    actor Receiver as Receiver Node
    actor Sender as Sender Node
    Note over Receiver: Phase 1: Subnet Beacon
    Receiver-&amp;gt;&amp;gt;Receiver: Bind Socket to Local Hotspot / WLAN
    Receiver-&amp;gt;&amp;gt;Sender: UDP Broadcast on 255.255.255.255:8888
    Note over Receiver,Sender: Phase 2: Visual Cryptographic Handshake
    Receiver-&amp;gt;&amp;gt;Receiver: Render QR Payload (IP: 192.168.43.1, Port: 4000, Nonce)
    Sender-&amp;gt;&amp;gt;Receiver: Capture QR Payload via Camera Sensor
    Sender-&amp;gt;&amp;gt;Sender: Extract Transport Coordinates and Session Key
    Note over Receiver,Sender: Phase 3: Raw TCP Connection Initialization
    Sender-&amp;gt;&amp;gt;Receiver: TCP SYN -&amp;gt; Connect to 192.168.43.1:4000
    Receiver--&amp;gt;&amp;gt;Sender: TCP SYN-ACK -&amp;gt; Establish Persistent Socket
    Sender-&amp;gt;&amp;gt;Receiver: Emit Handshake Frame (`client_connected`)
    Receiver--&amp;gt;&amp;gt;Sender: Acknowledge Handshake Frame
    Note over Receiver,Sender: Full-Duplex Binary Stream Established&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  The Three Protocol Stages:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;UDP Subnet Discovery (&lt;code&gt;react-native-udp&lt;/code&gt;)&lt;/strong&gt;: The receiving device issues periodic datagram beacons across the local broadcast domain (&lt;code&gt;255.255.255.255:8888&lt;/code&gt;) to advertise availability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual QR Exchange&lt;/strong&gt;: Eliminates manual IP configuration and local mDNS discovery latency by embedding endpoint coordinates, port configuration, and an ephemeral session nonce into an optically scannable matrix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent TCP Socket (&lt;code&gt;react-native-tcp-socket&lt;/code&gt;)&lt;/strong&gt;: The sender connects directly to the receiver's socket server over the local IP interface, creating an uninterrupted, full-duplex transmission path.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  2. Chunked Binary Streaming Engine
&lt;/h2&gt;

&lt;p&gt;Reading large binary payloads into JavaScript heap memory triggers Out-of-Memory (OOM) termination in the Hermes and V8 runtimes. The transmission pipeline segments the input stream into 64 KB binary frames, streaming them sequentially while enforcing write backpressure at the destination node.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    Init[Select Source File: 1.5 GB Binary] --&amp;gt; PreFlight[Extract File Stats: Total Chunks, Size, SHA-256 Checksum]
    PreFlight --&amp;gt; HeaderFrame[Transmit Metadata Acknowledgment Frame]
    subgraph Transmission Loop
        HeaderFrame --&amp;gt; Slice[Read 64 KB Block via react-native-fs]
        Slice --&amp;gt; SocketWrite[socket.write: Binary Chunk Frame]
        SocketWrite --&amp;gt; WaitAck{Wait for send_chunk_ack?}
        WaitAck -- ACK Received --&amp;gt; Incr[Advance Window: Index + 1]
        Incr --&amp;gt; BoundaryCheck{All Chunks Dispatched?}
        BoundaryCheck -- No --&amp;gt; Slice
    end
    subgraph Ingestion Loop
        SocketRead[Socket Event: data] --&amp;gt; FrameParse[Extract Chunk Index and Payload]
        FrameParse --&amp;gt; DiskWrite[Append to File Stream via MMKV / Storage Engine]
        DiskWrite --&amp;gt; EmitAck[socket.write: send_chunk_ack]
        EmitAck --&amp;gt; WaitAck
    end
    BoundaryCheck -- Yes --&amp;gt; Finalize[Compute Disk SHA-256 Digest]
    Finalize --&amp;gt; IntegrityVerify{Digest Valid?}
    IntegrityVerify -- Yes --&amp;gt; TargetFile[Mark Complete in Storage]
    IntegrityVerify -- No --&amp;gt; ErrorState[Flag Transmission Corruption]&lt;/code&gt;&lt;/pre&gt;






&lt;h2&gt;
  
  
  3. Backpressure Flow Control: Mitigating Buffer Saturation
&lt;/h2&gt;

&lt;p&gt;Over a 5 GHz local Wi-Fi interface, network throughput often surpasses flash memory sequential write speeds. Uncontrolled socket writes lead to rapid expansion of the underlying OS socket buffer, leading to high garbage collection overhead and dropped TCP connections. To prevent this, the client implements explicit frame-level acknowledgment flow control:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Receiver: TCPUtils.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;receiveFileAck&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FileMetadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;setReceivedFiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;setChunkStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useChunkStore&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Initialize receiving chunk state machine&lt;/span&gt;
  &lt;span class="nf"&gt;setChunkStore&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;totalChunks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalChunks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;chunkArray&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Signal sender to begin transmitting chunk index 0&lt;/span&gt;
  &lt;span class="nx"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;send_chunk_ack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;chunkNo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sender waits for &lt;code&gt;send_chunk_ack&lt;/code&gt; before slicing and dispatching the subsequent segment from the storage layer:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
typescript
// Sender: TCPUtils.ts
export const handleChunkAck = async (
  ackPayload: { chunkNo: number },
  fileRecord: FileRecord,
  socket: any
): Promise&amp;lt;void&amp;gt; =&amp;gt; {
  const nextChunk = ackPayload.chunkNo;
  if (nextChunk &amp;lt; fileRecord.totalChunks) {
    const chunkData = await RNFS.read(
      fileRecord.uri,
      CHUNK_SIZE,
      nextChunk * CHUNK_SIZE,
      'base64'
    );
    socket.write(JSON.stringify({ event: 'file_chunk', chunkNo: nextChunk, data: chunkData }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building a Zero-Cloud P2P File Sharing Engine with React Native, TCP Sockets, and UDP Broadcasting</title>
      <dc:creator>Ramanand Tomar</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:10:59 +0000</pubDate>
      <link>https://dev.to/ramanand_tomar/building-a-zero-cloud-p2p-file-sharing-engine-with-react-native-tcp-sockets-and-udp-broadcasting-4472</link>
      <guid>https://dev.to/ramanand_tomar/building-a-zero-cloud-p2p-file-sharing-engine-with-react-native-tcp-sockets-and-udp-broadcasting-4472</guid>
      <description></description>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Architecting a High-Concurrency Railway Booking Platform with Node.js, Apache Kafka, and Redis Distributed Locks</title>
      <dc:creator>Ramanand Tomar</dc:creator>
      <pubDate>Mon, 12 Oct 2026 06:01:22 +0000</pubDate>
      <link>https://dev.to/ramanand_tomar/architecting-a-high-concurrency-railway-booking-platform-with-nodejs-apache-kafka-and-redis-479e</link>
      <guid>https://dev.to/ramanand_tomar/architecting-a-high-concurrency-railway-booking-platform-with-nodejs-apache-kafka-and-redis-479e</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://ramanand-tomar.vercel.app/" rel="noopener noreferrer"&gt;Ramanand Tomar&lt;/a&gt; — Software Engineer &amp;amp; Backend Systems Specialist&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Handling massive bursts of concurrent requests during narrow reservation windows is one of the classic challenges in distributed system design. When thousands of transactions attempt to reserve the final remaining berth on a high-demand route simultaneously, standard relational locking mechanisms fail under contention.&lt;/p&gt;

&lt;p&gt;In engineering the backend for &lt;strong&gt;IRCTC RailYatra&lt;/strong&gt;, my objective was to implement an enterprise-grade, event-driven microservices architecture capable of addressing core distributed systems challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;High-concurrency seat contention and race condition mitigation.&lt;/li&gt;
&lt;li&gt;Distributed data consistency across boundaries without blocking two-phase commits (2PC).&lt;/li&gt;
&lt;li&gt;Fault isolation and recovery using Dead-Letter Queues (DLQ) and circuit breakers.&lt;/li&gt;
&lt;li&gt;Sub-50 millisecond inverted-index search across multi-stop schedules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is an analysis of the architectural patterns, trade-offs, and implementation details.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. System Topology and Domain Boundaries
&lt;/h2&gt;

&lt;p&gt;The platform strictly implements the &lt;strong&gt;Database-per-Service&lt;/strong&gt; pattern. Each microservice encapsulates its domain models, persistence store, and business rules, communicating asynchronously over an event bus or via the edge gateway.&lt;/p&gt;

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

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;graph TD
    Client[Web and Mobile Clients] --&amp;gt;|HTTPS / REST| APIGW[API Gateway: NGINX / Express]

    subgraph Edge Layer
        APIGW --&amp;gt;|JWT Verification &amp;amp; Rate Limiting| AuthModule[JWT Auth Middleware]
        APIGW --&amp;gt;|Catalog Lookups| SearchService[Search Service]
        APIGW --&amp;gt;|User Domain| UserService[User Service]
        APIGW --&amp;gt;|Reservation Ingestion| BookingService[Booking Service]
        APIGW --&amp;gt;|Payment Processing| PaymentService[Payment Service]
        APIGW --&amp;gt;|Route &amp;amp; Train Master| AdminService[Admin Service]
    end

    subgraph Data Stores
        BookingService --&amp;gt;|Relational State| BookingDB[(PostgreSQL: Booking DB)]
        PaymentService --&amp;gt;|Ledger Records| PaymentDB[(PostgreSQL: Payment DB)]
        InventoryService --&amp;gt;|Berths &amp;amp; Availability| InventoryDB[(PostgreSQL: Inventory DB)]
        AdminService --&amp;gt;|Master Tables| AdminDB[(PostgreSQL: Admin DB)]
        UserService --&amp;gt;|Auth &amp;amp; Profiles| UserDB[(PostgreSQL: User DB)]
        SearchService --&amp;gt;|Denormalized Routes| Elastic[(Elasticsearch)]
        BookingService --&amp;gt;|Atomic Locks &amp;amp; State| RedisCache[(Redis Cluster)]
    end

    subgraph Event Broker: Apache Kafka
        BookingService --&amp;gt;|Event: booking.created| KafkaTopic[Apache Kafka Event Bus]
        PaymentService --&amp;gt;|Event: payment.success / payment.failed| KafkaTopic
        KafkaTopic --&amp;gt;|Consume Events| InventoryService[Inventory Service]
        KafkaTopic --&amp;gt;|Consume Events| NotificationService[Notification Service]
        KafkaTopic --&amp;gt;|Poison Pill Messages| DLQ[Kafka Dead-Letter Queue - DLQ]
    end&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Architectural Principles:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Gateway&lt;/strong&gt;: Single reverse proxy terminating SSL, executing JWT validation, enforcing sliding-window rate limits, and implementing circuit breakers to prevent cascading failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Isolated Relational Stores&lt;/strong&gt;: Each service maintains its own PostgreSQL instance. Cross-boundary table joins are prohibited at the schema level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed Message Log (Apache Kafka)&lt;/strong&gt;: Decouples time-sensitive write paths from asynchronous side effects (inventory updates, PDF generation, transactional email dispatch).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-Memory Locking Layer (Redis)&lt;/strong&gt;: Offloads volatile contention locks from the primary transactional database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search Acceleration (Elasticsearch)&lt;/strong&gt;: Houses denormalized route schedules to eliminate multi-table SQL joins during catalog traversal.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Concurrency Control: Redis Distributed Locks
&lt;/h2&gt;

&lt;p&gt;Relying on database-level row locking (&lt;code&gt;SELECT ... FOR UPDATE&lt;/code&gt;) during high-traffic bursts leads to connection pool saturation, extended lock wait times, and deadlocks.&lt;/p&gt;

&lt;p&gt;To resolve this, seat reservation state is temporarily decoupled from the primary database using atomic locks in Redis.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    actor Client as Passenger Client
    participant GW as API Gateway
    participant BS as Booking Service
    participant Redis as Redis Cluster
    participant DB as Booking PostgreSQL
    participant Kafka as Apache Kafka

    Client-&amp;gt;&amp;gt;GW: POST /api/bookings/reserve (trainId, seatNo, journeyDate)
    GW-&amp;gt;&amp;gt;BS: Validate Token &amp;amp; Forward Request
    BS-&amp;gt;&amp;gt;Redis: SET lock:seat:{trainId}:{journeyDate}:{seatNo} {userId} NX EX 600
    alt Lock Contention (Seat Already Reserved)
        Redis--&amp;gt;&amp;gt;BS: nil (Key exists)
        BS--&amp;gt;&amp;gt;Client: 409 Conflict: Seat currently held by another transaction.
    else Lock Acquired (Successful Reservation)
        Redis--&amp;gt;&amp;gt;BS: OK (Exclusive 10-minute hold active)
        BS-&amp;gt;&amp;gt;DB: INSERT INTO bookings (status = 'PENDING_PAYMENT')
        BS-&amp;gt;&amp;gt;Kafka: Publish `booking.initiated`
        BS--&amp;gt;&amp;gt;Client: 201 Created: Reservation hold active. 10 minutes to complete checkout.
    end&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Atomic Lock Implementation with Lua Scripting
&lt;/h3&gt;

&lt;p&gt;To avoid race conditions where a process releases another passenger's newly acquired lock following a timeout, unlock operations must verify ownership atomically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Redis&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ioredis&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Redis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REDIS_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;acquireSeatLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;trainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;seatId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;journeyDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;holdDurationSeconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt; &lt;span class="c1"&gt;// 10 minutes TTL&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lockKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`lock:seat:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;trainId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;journeyDate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;seatId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Set if Not eXists (NX) with Expiration Time (EX)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lockKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;holdDurationSeconds&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;OK&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;releaseSeatLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;trainId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;seatId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;journeyDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lockKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`lock:seat:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;trainId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;journeyDate&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;seatId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Lua script ensures atomicity: compare owner before deletion&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;luaScript&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`
    if redis.call("get", KEYS[1]) == ARGV[1] then
      return redis.call("del", KEYS[1])
    else
      return 0
    end
  `&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;redis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;luaScript&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lockKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Distributed Transactions: Choreographed Saga Pattern
&lt;/h2&gt;

&lt;p&gt;Because microservices prohibit distributed ACID transactions across multiple databases, the system applies the &lt;strong&gt;Saga Pattern&lt;/strong&gt; over Apache Kafka to maintain eventual consistency.&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;sequenceDiagram
    autonumber
    participant Booking as Booking Service
    participant Kafka as Kafka Event Broker
    participant Payment as Payment Service
    participant Inventory as Inventory Service
    participant Notif as Notification Service

    Note over Booking: Phase 1: Reservation Initiated
    Booking-&amp;gt;&amp;gt;Kafka: Emit `booking.created`

    Kafka-&amp;gt;&amp;gt;Payment: Consume `booking.created`
    Note over Payment: Phase 2: Gateway Execution
    alt Payment Successful
        Payment-&amp;gt;&amp;gt;Kafka: Emit `payment.succeeded`
        Kafka-&amp;gt;&amp;gt;Inventory: Consume `payment.succeeded`
        Note over Inventory: Phase 3: Final Inventory Decrement
        Inventory-&amp;gt;&amp;gt;Kafka: Emit `inventory.confirmed`
        Kafka-&amp;gt;&amp;gt;Booking: Transition Status: CONFIRMED
        Kafka-&amp;gt;&amp;gt;Notif: Dispatch Confirmation Payload (SendGrid)
    else Payment Declined / Gateway Timeout
        Payment-&amp;gt;&amp;gt;Kafka: Emit `payment.failed`
        Note over Booking,Inventory: Compensating Transactions Executed
        Kafka-&amp;gt;&amp;gt;Booking: Consume `payment.failed` -&amp;gt; Mark CANCELLED
        Kafka-&amp;gt;&amp;gt;Inventory: Consume `payment.failed` -&amp;gt; Release Berth Quota
        Booking-&amp;gt;&amp;gt;Booking: Evict Redis Lock Key
    end&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Dead-Letter Queues (DLQ) for Poison Pill Handling
&lt;/h3&gt;

&lt;p&gt;When a consumer encounters an unrecoverable deserialization fault or database timeout:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The consumer retries up to three times with exponential backoff.&lt;/li&gt;
&lt;li&gt;If failures persist, the message is routed to &lt;code&gt;booking.events.dlq&lt;/code&gt; alongside exception headers.&lt;/li&gt;
&lt;li&gt;Partition consumption continues without blocking the offset lag of healthy messages.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  4. Search Acceleration via Inverted Indexing
&lt;/h2&gt;

&lt;p&gt;Relational tables normalized across trains, intermediate stops, and schedules require expensive joins:&lt;br&gt;
$$\text{Trains} \bowtie \text{Schedules} \bowtie \text{Stations} \bowtie \text{Quotas}$$&lt;/p&gt;

&lt;p&gt;During high traffic, read queries against SQL degrade throughput. To optimize this, the Search Service denormalizes train routes into an Elasticsearch index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trainNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trainName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bhopal Shatabdi Express"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceStation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NDLS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"destinationStation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RKMP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stops"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"stationCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NDLS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"stationName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"New Delhi"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"stopOrder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"departure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"06:00"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"stationCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MTJ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"stationName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Mathura Jn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"stopOrder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"departure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"07:20"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"stationCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AGC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"stationName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Agra Cantt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"stopOrder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"departure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"07:55"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"stationCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GWL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"stationName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gwalior Jn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"stopOrder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"departure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"09:23"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A nested query checks that both the boarding station and debarkation station exist in &lt;code&gt;stops&lt;/code&gt;, verifying that &lt;code&gt;stopOrder(Destination) &amp;gt; stopOrder(Origin)&lt;/code&gt;. This query completes in &lt;strong&gt;under 20 milliseconds&lt;/strong&gt;, scaling independently of transactional database load.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Architectural Trade-Offs &amp;amp; Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eventual Consistency vs. Immediate Consistency&lt;/strong&gt;: Utilizing Saga choreography requires designing consumer logic around idempotency (&lt;code&gt;idempotency_key&lt;/code&gt; stored in Redis) to safely handle &lt;code&gt;at-least-once&lt;/code&gt; message delivery semantics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational Complexity&lt;/strong&gt;: Managing separate PostgreSQL instances, Kafka clusters, and Redis instances demands robust container orchestration and centralized structured logging (ELK / Prometheus).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decoupled Failure Domains&lt;/strong&gt;: An outage in the Notification Service or Payment Gateway does not compromise catalog availability or schedule lookups.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Author Information
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Ramanand Tomar&lt;/strong&gt; is a Software Engineer specializing in backend distributed architectures, network protocol engineering, and AI systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Portfolio: &lt;a href="https://ramanand-tomar.vercel.app/" rel="noopener noreferrer"&gt;ramanand-tomar.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Ramanand-tomar" rel="noopener noreferrer"&gt;github.com/Ramanand-tomar&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/ramanand-tomar-478528342/" rel="noopener noreferrer"&gt;linkedin.com/in/ramanand-tomar-478528342&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>microservices</category>
      <category>systemdesign</category>
    </item>
  </channel>
</rss>
