Spanner Omni की मदद से, उपयोगकर्ता के डिवाइस पर डेटा एजेंट और GraphRAG

1. खास जानकारी

इस कोडलैब में, Spanner Omni के बारे में बुनियादी जानकारी दी गई है. साथ ही, यह भी बताया गया है कि यह ऑटोनॉमस एआई एजेंट के लिए, डेटा का सबसे बेहतरीन आधार क्यों है. इसके अलावा, इसमें Spanner Omni (रिलेशनल + ग्राफ़ GQL), Python Flask, और Gemini 3.8 Flash की मदद से, एज पर डिप्लॉय किए गए एजेंटिक पिकलबॉल टैक्टिकल कोच और मैच सिम्युलेटर को पूरी तरह से लागू करने का तरीका बताया गया है.

समस्या

मॉडर्न इंटरैक्टिव स्पोर्ट्स प्लैटफ़ॉर्म और रीयल-टाइम गेमिंग एनवायरमेंट के लिए, एक साथ तीन अलग-अलग वर्कलोड को मैनेज करना ज़रूरी है:

एक साथ कई ऑपरेशनल ट्रांज़ैक्शन:

कोर्ट रिज़र्वेशन, प्लेयर की सदस्यताएं, बिलिंग, और टूर्नामेंट के शेड्यूल के लिए, ACID सीरियलाइज़ेबिलिटी की सख्त ज़रूरत होती है, ताकि डबल-बुकिंग की समस्याओं को खत्म किया जा सके.

कनेक्ट किए गए ग्राफ़ की टेलीमेट्री:

लगातार रैली शॉट सीक्वेंस, ट्रांज़िशन मार्कोव चेन, और ज़ोन कवरेज ग्राफ़, जिनके लिए भारी-भरकम ईटीएल पाइपलाइन के बिना कम इंतज़ार समय वाले ट्रैवर्सल की ज़रूरत होती है.

सब-मिलीसेकंड एज रिस्पॉन्सिवनेस:

60 FPS की तेज़ रफ़्तार वाले फ़िज़िक्स सिम्युलेशन, जहां वाइड-एरिया क्लाउड नेटवर्क राउंडट्रिप (100 से 200 मि॰से॰) की वजह से, वीडियो में रुकावट आ सकती है.

पहले, इंजीनियरिंग टीमें इस समस्या को हल करने के लिए, अलग-अलग आर्किटेक्चर को एक साथ जोड़ती थीं. जैसे: ट्रांज़ैक्शनल डेटा के लिए PostgreSQL, शॉट ग्राफ़ के लिए Neo4j, करीबी संचय के लिए Redis, और बैकग्राउंड सिंक्रोनाइज़ेशन पाइपलाइन. इसकी वजह से, आर्किटेक्चरल ड्रिफ़्ट, ऑपरेशनल कॉम्प्लेक्सिटी, और संभावित अनुकूलता में देरी जैसी समस्याएं आती हैं.

हम यह कैसे करते हैं!

हमने Google Cloud Spanner Omni को एज पर डिप्लॉय किया और इसे Google Gemini 3.8 Flash के साथ जोड़ा. इसके बाद, हमने Spanner Omni Pickleball Game बनाया. यह एक सिंगल-इंजन स्पोर्ट्स गेमिंग प्लैटफ़ॉर्म है. इसमें रिलेशनल कारोबारी नियम, नेटिव ISO GQL शॉट टेलीमेट्री, और रीयल-टाइम में रणनीतिक एआई कोचिंग की सुविधा मिलती है.

Spanner Omni

Spanner Omni, Google के प्लैनेटरी-स्केल डिस्ट्रिब्यूटेड डेटाबेस इंजन को खुद मैनेज किए जाने वाले, ऑन-प्राइमिस, मल्टीक्लाउड, और एयर-गैप वाले एनवायरमेंट में उपलब्ध कराता है. इसमें हॉरिज़ॉन्टल स्केलेबिलिटी, ACID ट्रांज़ैक्शन, और मल्टी-मॉडल सुविधाएं (रिलेशनल, ग्राफ़, वेक्टर, और ऐनलिटिक्स) शामिल हैं. Spanner Omni, Google Cloud Spanner का एक वर्शन है. इसे डाउनलोड किया जा सकता है और खुद मैनेज किया जा सकता है. यह Spanner के मुख्य डिस्ट्रिब्यूटेड डेटाबेस की सुविधाएं देता है. जैसे, अपने-आप शार्डिंग होना, Paxos पर आधारित रेप्लिकेशन, और बाहरी तौर पर डेटा की मज़बूत कंसिस्टेंसी. ये सुविधाएं आपको हर उस जगह पर मिलती हैं जहां इसे चलाने का विकल्प चुना जाता है:

acc871a470f63b29.png

आपको क्या सीखने को मिलेगा

इस कोडलैब में, आपको पुराने साइलो डेटाबेस आर्किटेक्चर से आधुनिक और यूनिफ़ाइड एज डेटाबेस सलूशन पर स्विच करने का तरीका बताया जाएगा. आपको इन चीज़ों के बारे में जानकारी मिलेगी:

  1. Docker का इस्तेमाल करके, Spanner Omni को स्थानीय तौर पर डिप्लॉय और ऑर्केस्ट्रेट करें. इससे, बेहतर परफ़ॉर्मेंस वाले सिंगल-इंस्टेंस रिलेशनल वर्कलोड को मैनेज किया जा सकता है.
  2. एक यूनिफ़ाइड रिलेशनल और आईएसओ जीक्यूएल ग्राफ़ स्कीमा डिज़ाइन करें, जो बाहरी डेटाबेस सिंक्रनाइज़ेशन की ज़रूरत के बिना, हाई-डाइमेंशनल गेम टेलीमेट्री के साथ-साथ ट्रांज़ैक्शनल कारोबार के मॉडल को मैप करता हो.
  3. Python में रीड-राइट ट्रांज़ैक्शन के लिए, सख्त ACID सीरियलाइज़ेबिलिटी लागू करें. इससे प्रोग्राम के हिसाब से रेस कंडिशन को रोका जा सकता है और डबल-बुकिंग की समस्याओं को खत्म किया जा सकता है.
  4. एक नेटिव GraphRAG पाइपलाइन बनाएं, जो एसक्यूएल के साथ इंटिग्रेट की गई ISO GQL ग्राफ़ क्वेरी का इस्तेमाल करती हो. इससे रीयल-टाइम में, मैच की टेलीमेट्री को सीधे Google Gemini में फ़ीड किया जा सकता है, ताकि तुरंत रणनीतिक कोचिंग मिल सके.

ज़रूरी शर्तें

  • Linux (Ubuntu 22.04+), macOS या Windows पर चलने वाली कोई स्टैंडर्ड लोकल मशीन या डेवलपमेंट वीएम.
  • Docker Desktop या Docker Engine इंस्टॉल किया गया हो और चल रहा हो.
  • Python 3.10 या इसके बाद का वर्शन इंस्टॉल किया गया हो.
  • कोई टेक्स्ट एडिटर या IDE (जैसे, VS Code या PyCharm).
  • एक चालू Google Gemini API पासकोड. ध्यान दें: Spanner Omni को स्थानीय तौर पर चलाने के लिए, Google Cloud बिलिंग खाते की ज़रूरत नहीं होती. इसकी वजह यह है कि यह फ़्री-टियर, सेल्फ़-मैनेज्ड डेवलपर इवैलुएशन लाइसेंस के तहत चलता है.

2. Spanner Omni को डिप्लॉय और कॉन्फ़िगर करना

इस चरण में, हम अपने लोकल एज डेटाबेस इंस्टेंस को स्पिन अप करेंगे. Spanner Omni, ऑप्टिमाइज़ किए गए कंटेनर में चलता है. इससे आपको अपने लोकल डेवलपर लैपटॉप पर, दुनिया भर में इस्तेमाल होने वाले रिलेशनल डेटाबेस की सुविधाएं मिलती हैं.

  1. अपना टर्मिनल खोलें और अपने डेटाबेस स्कीमा और गेम टेलीमेट्री को स्टोर करने के लिए, एक परसिस्टेंट डॉकर वॉल्यूम बनाएं:
docker volume create spanner_omni_data
  1. सिंगल-सर्वर डेवलपर मोड में कॉन्फ़िगर की गई आधिकारिक Spanner Omni कंटेनर इमेज को पुल करें और शुरू करें:
docker run -d --name spanner-omni \
  -p 9010:9010 -p 9020:9020 \
  -v spanner_omni_data:/spanner \
  us-docker.pkg.dev/spanner-omni/images/spanner-omni:2026.r2.1-beta \
  start-single-server
  1. पक्का करें कि कंटेनर सही तरीके से लॉन्च हो गया हो:
docker ps

🛠️ समस्या हल करने का आसान तरीका: अगर बैकग्राउंड में चल रही प्रोसेस या लेगसी एम्युलेटर की वजह से, पोर्ट 9010 या 9020 पहले से इस्तेमाल में हैं और आपका लॉन्च नहीं हो पा रहा है, तो अपने टर्मिनल में यह क्लीनअप स्क्रिप्ट चलाएं:

pkill -f "spanner" || true
fuser -k 9010/tcp 9020/tcp 2>/dev/null || true
docker rm -f spanner-local spanner-omni spanner-omni-local 2>/dev/null || true

3. रिलेशनल और आईएसओ जीक्यूएल ग्राफ़ डीडीएल स्कीमा डिज़ाइन

Spanner Omni के चालू होने पर, हम अपना डेटाबेस स्कीमा सेट अप कर सकते हैं. यह स्कीमा, हमारे लिए एकमात्र भरोसेमंद सोर्स के तौर पर काम करता है. यह कोर्ट, खिलाड़ी, और बुकिंग जैसी कारोबारी इकाइयों को शॉट, ज़ोन, और ट्रांज़िशन जैसे तेज़ और कनेक्टेड ग्राफ़ टेलीमेट्री स्कीमा के साथ जोड़ता है.

ऑपरेशनल और टेलीमेट्री टेबल बनाने के लिए:

  1. Spanner सीएलआई या अपने ऐप्लिकेशन क्लाइंट का इस्तेमाल करके, अपने डेटाबेस से कनेक्ट करें
  2. यहां दिए गए डीडीएल स्टेटमेंट चलाएं

फ़िलहाल, आपको कुछ करने की ज़रूरत नहीं है, क्योंकि हम ऐप्लिकेशन कोड में इस समस्या को ठीक कर रहे हैं:

-- ============================================================================
-- 1. OPERATIONAL & FACILITY MANAGEMENT (RELATIONAL ACID)
-- ============================================================================

CREATE TABLE Courts (
    court_id INT64 NOT NULL,
    name STRING(100) NOT NULL,
    location STRING(100) NOT NULL,
    surface_type STRING(50) NOT NULL,
    is_indoor BOOL NOT NULL,
    hourly_rate FLOAT64 NOT NULL,
    has_lighting BOOL NOT NULL,
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (court_id);

CREATE TABLE Players (
    player_id INT64 NOT NULL,
    name STRING(100) NOT NULL,
    email STRING(100) NOT NULL,
    skill_level STRING(20) NOT NULL,
    phone STRING(50),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (player_id);

CREATE TABLE Bookings (
    booking_id INT64 NOT NULL,
    court_id INT64 NOT NULL,
    player_id INT64 NOT NULL,
    booking_date DATE NOT NULL,
    start_hour INT64 NOT NULL,
    end_hour INT64 NOT NULL,
    player_name STRING(100) NOT NULL,
    court_name STRING(100) NOT NULL,
    status STRING(20) NOT NULL,
    notes STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (booking_id);

CREATE TABLE MatchRequests (
    match_id INT64 NOT NULL,
    player_id INT64 NOT NULL,
    player_name STRING(100) NOT NULL,
    court_id INT64,
    court_name STRING(100),
    play_date DATE NOT NULL,
    start_hour INT64 NOT NULL,
    skill_required STRING(20) NOT NULL,
    match_type STRING(20) NOT NULL,
    spots_open INT64 NOT NULL,
    status STRING(20) NOT NULL,
    notes STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (match_id);

-- ============================================================================
-- 2. TACTICAL GAME TELEMETRY & PROPERTY GRAPH (ISO GQL)
-- ============================================================================

CREATE TABLE CourtZones (
    zone_id STRING(50) NOT NULL,
    name STRING(100) NOT NULL,
    is_kitchen BOOL NOT NULL,
    side STRING(50) NOT NULL
) PRIMARY KEY (zone_id);

CREATE TABLE Shots (
    shot_id STRING(50) NOT NULL,
    player_id STRING(50) NOT NULL,
    shot_type STRING(100) NOT NULL,
    speed_mph FLOAT64,
    spin_type STRING(50),
    outcome STRING(50),
    from_zone_id STRING(50),
    to_zone_id STRING(50)
) PRIMARY KEY (shot_id);

CREATE TABLE ShotTransitions (
    transition_id STRING(50) NOT NULL,
    from_shot_id STRING(50) NOT NULL,
    to_shot_id STRING(50) NOT NULL,
    rally_depth INT64,
    pressure_level STRING(20)
) PRIMARY KEY (transition_id);

-- ============================================================================
-- 3. MATCH SESSIONS & AI COACHING HISTORY
-- ============================================================================

CREATE TABLE GameSessions (
    session_id STRING(50) NOT NULL,
    player_id INT64 NOT NULL,
    player_score INT64 NOT NULL,
    bot_score INT64 NOT NULL,
    bot_difficulty STRING(20) NOT NULL,
    winner STRING(20) NOT NULL,
    rally_length INT64 NOT NULL,
    fault_type STRING(100),
    coaching_summary STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (session_id);
cat << 'EOF' > Dockerfile
FROM ollama/ollama:latest
ENV OLLAMA_HOST=0.0.0.0:8080
ENV OLLAMA_MODELS=/root/.ollama
ENV MODEL=gemma4:e2b
RUN ollama serve & sleep 5 && ollama pull $MODEL
ENTRYPOINT ["ollama", "serve"]
EOF

💡 कमिट टाइमस्टैंप क्यों ज़रूरी हैं: OPTIONS (allow_commit_timestamp=true) की जानकारी देने से, सभी लोकल नोड रेप्लिका में, माइक्रोसेकंड के हिसाब से सटीक और एक जैसी क्रम से जानकारी मिलती है. यह सुविधा, गेम के हाई-स्पीड इवेंट (जैसे, लाइन-कॉल वीडियो फ़ुटेज) को डेटाबेस शॉट टेलीमेट्री लॉग के साथ सिंक करने के लिए ज़रूरी है.

4. एसीआईडी कॉनकरेंसी कंट्रोल और डुप्लीकेट बुकिंग से बचाव

स्पोर्ट्स बुकिंग पोर्टल पर, अक्सर कई उपयोगकर्ता एक ही कोर्ट के लिए एक ही टाइम स्लॉट बुक करने की कोशिश करते हैं. रेस कंडिशन से बचने के लिए, हम Spanner Omni में Python रीड-राइट ट्रांज़ैक्शन लिखेंगे. इससे यह पक्का किया जा सकेगा कि सीरियल के हिसाब से डेटा को प्रोसेस किया जा सके और डबल-बुकिंग न हो.

फ़िलहाल, आपको कुछ नहीं करना है. बस कोड देखें:

from google.cloud import spanner

def create_booking_transaction(transaction, booking_data):
    # 1. Query for existing overlapping confirmed bookings on the same court
    query = """
        SELECT booking_id, player_name, start_hour, end_hour
        FROM Bookings
        WHERE court_id = @court_id
          AND booking_date = @booking_date
          AND status = 'CONFIRMED'
          AND NOT (end_hour <= @start_hour OR start_hour >= @end_hour)
    """
    params = {
        "court_id": booking_data["court_id"],
        "booking_date": booking_data["booking_date"],
        "start_hour": booking_data["start_hour"],
        "end_hour": booking_data["end_hour"],
    }
    param_types = {
        "court_id": spanner.param_types.INT64,
        "booking_date": spanner.param_types.DATE,
        "start_hour": spanner.param_types.INT64,
        "end_hour": spanner.param_types.INT64,
    }
    
    results = list(transaction.execute_sql(query, params=params, param_types=param_types))
    
    if results:
        conflict = results[0]
        raise ValueError(
            f"Court conflict: Already booked by {conflict[1]} ({conflict[2]}:00-{conflict[3]}:00)"
        )
    
    # 2. Insert new confirmed booking with Spanner commit timestamp
    insert_stmt = """
        INSERT INTO Bookings (
            booking_id, court_id, player_id, booking_date, start_hour, end_hour,
            player_name, court_name, status, notes, created_at
        ) VALUES (
            @booking_id, @court_id, @player_id, @booking_date, @start_hour, @end_hour,
            @player_name, @court_name, 'CONFIRMED', @notes, PENDING_COMMIT_TIMESTAMP()
        )
    """
    # execute_update statement writing to Spanner Omni...
    transaction.execute_update(insert_stmt, params=booking_data, param_types=booking_types)

5. रीयल-टाइम में 60 FPS पर फ़िज़िक्स और अडजस्ट किया जा सकने वाला DUPR बॉट इंजन

हमारे ऐप्लिकेशन का फ़्रंटएंड, 2.5D HTML5 Canvas सिम्युलेशन का इस्तेमाल करता है. यह 60 फ़्रेम प्रति सेकंड (एफ़पीएस) पर रेंडर होता है. यह रेंडरिंग, डेटाबेस लेयर से पूरी तरह अलग होकर काम करती है, ताकि गेम बिना किसी रुकावट के आसानी से चलता रहे. साथ ही, टेलीमेट्री को सिर्फ़ तब फ़्लश किया जाता है, जब रैली खत्म हो जाती है.

इस सिम्युलेटर में, अडजस्ट किया जा सकने वाला OmniBot एआई इंजन मौजूद है. यह असल दुनिया के डीयूपीआर (डाइनैमिक यूनिवर्सल पिकलबॉल रेटिंग) लेवल के आधार पर, मुश्किल लेवल वाली मैट्रिक्स का इस्तेमाल करता है.

1640056a824b47e6.png

फ़िलहाल, आपको कोई कार्रवाई करने की ज़रूरत नहीं है. बस जानकारी देखें.

6. आईएसओ जीक्यूएल शॉट टेलीमेट्री ग्राफ़ प्रोसेसिंग

हर रैली के आखिर में, फ़्रंटएंड कनेक्ट किए गए ट्रैजेक्टरी ग्राफ़ को हमारे बैकएंड एंडपॉइंट /api/rally-end पर पोस्ट करता है. हर शॉट को एक रिलेशनल नोड के तौर पर रिकॉर्ड किया जाता है. साथ ही, सीक्वेंस को ट्रांज़िशन एज के ज़रिए डाइनैमिक तौर पर लिंक किया जाता है.

आपको अभी कुछ नहीं करना है. बस कोड देखें:

@app.route("/api/execute-shot", methods=["POST"])
def execute_shot():
    data = request.json or {}
    shot_id = f"shot_{int(time.time()*1000)}"
    
    # 1. Insert the Shot Node
    insert_shot_sql = """
        INSERT INTO Shots (shot_id, player_id, shot_type, speed_mph, spin_type, outcome, from_zone_id, to_zone_id)
        VALUES (@shot_id, @player_id, @shot_type, @speed, @spin, @outcome, @from_zone, @to_zone)
    """
    
    # 2. If part of a continuous rally, link with a ShotTransition Edge
    if data.get("prev_shot_id"):
        transition_id = f"trans_{int(time.time()*1000)}"
        insert_trans_sql = """
            INSERT INTO ShotTransitions (transition_id, from_shot_id, to_shot_id, rally_depth, pressure_level)
            VALUES (@trans_id, @from_shot, @to_shot, @depth, @pressure)
        """
        # Executed within a single, unified Spanner Omni transaction...

Spanner के नेटिव ISO GQL ग्राफ़ क्वेरी इंजन का इस्तेमाल करके, कोई कोच या Analytics प्रोग्राम, डेटाबेस को आपस में जोड़े बिना, जटिल और डीप-हॉप स्ट्रक्चरल पैटर्न के बारे में तुरंत क्वेरी कर सकता है:

-- Find highest-frequency transition sequences leading to player unforced errors
GRAPH PickleballTelemetry
MATCH (s1:Shots)-[t:ShotTransitions]->(s2:Shots)
WHERE s1.shot_type = 'Speedup' AND s2.outcome = 'FAULT_NET'
RETURN s1.speed_mph, s2.from_zone_id, COUNT(*) AS occurrences
ORDER BY occurrences DESC
LIMIT 5;

7. Gemini एआई की मदद से टैक्टिकल कोचिंग और ग्राउंडेड आरएजी चैट

अब हम अपने ऐप्लिकेशन के दिमाग़ को चालू करेंगे: Google Gemini 3.8 Flash. हमारा Python बैकएंड, इस मॉडल का इस्तेमाल करके रीयल-टाइम में एआई की तीन सुविधाएं देता है. ये सुविधाएं, सीधे तौर पर Spanner Omni से जुड़ी होती हैं.

यह सिस्टम, रीयल-टाइम में एआई के कुछ खास वर्कफ़्लो के लिए, Google Gemini 3.8 Flash का इस्तेमाल करता है:

रीयल-टाइम रैली ब्रेकडाउन और टैक्टिकल रेफ़री:

हर पॉइंट के बाद, Gemini शॉट चेन, बॉट की मुश्किल, और कोर्ट में पोज़िशन का विश्लेषण करता है.

Spanner Multi-Table Grounded AI Concierge & Match Analyst:

उपयोगकर्ता, कोर्ट के शेड्यूल और सुविधाओं के शुल्क के बारे में क्वेरी कर सकते हैं. साथ ही, वे नैचुरल लैंग्वेज में "मैंने OmniBot के ख़िलाफ़ कैसा प्रदर्शन किया?" जैसे सवाल पूछ सकते हैं. बैकएंड, चार डोमेन (कोर्ट, बुकिंग, गेम सेशन, और शॉट) में Spanner Omni से डाइनैमिक तौर पर क्वेरी करता है, ताकि Gemini को बिना किसी भ्रम के ग्राउंड किया जा सके.

रीयल-टाइम परफ़ॉर्मेंस के आंकड़े दिखाने वाला एपीआई (/api/performance):

यह प्लेयर डैशबोर्ड के लिए, Spanner Omni की GameSessions टेबल से सीधे तौर पर लाइव जीत-हार के अनुपात, औसत रैली डेप्थ, और हाल ही के गेम सेशन को एग्रीगेट करता है.

फ़िलहाल, आपको कोई कार्रवाई करने की ज़रूरत नहीं है. बस जानकारी देखें.

8. कॉन्फ़िगर करें, चलाएं, और टेस्ट करें!

सिस्टम की पूरी तरह से पुष्टि करने के लिए, अपनी लोकल मशीन पर पूरा ऐप्लिकेशन लॉन्च करें.

  1. अपना होस्ट टर्मिनल खोलें और प्रोजेक्ट रिपॉज़िटरी को क्लोन करें:
git clone https://github.com/AbiramiSukumaran/pickleball

cd pickleball
  1. Gemini API पासकोड पाने के लिए, इस दस्तावेज़ में दिया गया तरीका अपनाएं:

https://medium.com/google-cloud/get-api-key-from-google-ai-studio-b2d2059a171d

  1. अपने एडिटर में .env फ़ाइल खोलें और अपने एनवायरमेंट की जानकारी कॉन्फ़िगर करें:
SPANNER_EMULATOR_HOST="localhost:9010"
SPANNER_PROJECT="PROJECT_ID"
SPANNER_INSTANCE="omni-instance"
SPANNER_DATABASE="pickleball-db"
GEMINI_API_KEY="REPLACE_WITH_YOUR_ACTUAL_GEMINI_KEY"
  1. Python डिपेंडेंसी इंस्टॉल करें और ऐप्लिकेशन चलाएं:
pip install -r requirements.txt

python app.py
  1. अपना वेब ब्राउज़र खोलें और गेम खेलना शुरू करने के लिए, http://localhost:5000 पर जाएं! Reservation Tab पर जाकर, कोर्ट बुक किया जा सकता है. साथ ही, DUPR OmniBot के ख़िलाफ़ खेला जा सकता है. इसके अलावा, कोर्ट के पास मौजूद Gemini Match Analyst से रीयल-टाइम में सलाह ली जा सकती है.

वेब ब्राउज़र खोलें या अपने लोकलहोस्ट में चल रहे ऐप्लिकेशन के लिंक पर क्लिक करें!

a2d18f8288607c66.png

9. बधाई हो!

इस कोडलैब को पूरा करने के बाद, आपने डेटाबेस इंजीनियरिंग में एक बड़ा बदलाव देखा है. सालों से, फ़ैक्ट्री फ़्लोर, मिलिट्री ज़ोन या कोर्ट-साइड स्पोर्ट्स नेटवर्क जैसी जगहों पर, रीयल-टाइम में काम करने वाले रिस्पॉन्सिव एजेंट बनाने के लिए, डिज़ाइन में कई समझौते करने पड़ते थे. जैसे, अलग-अलग ट्रांज़ैक्शनल सिस्टम, अलग-अलग ग्राफ़ नोड, और वेक्टर सर्च इंडेक्स के बीच कमज़ोर ईटीएल पाइपलाइन को जोड़ना.

Spanner Omni इस समस्या को हल करता है. यह दुनिया भर में डिस्ट्रिब्यूट किए गए डेटा को एक जैसा रखने, ISO GQL ग्राफ़ क्वेरी करने, और रिलेशनल परफ़ॉर्मेंस को एक ही डाउनलोड किए जा सकने वाले लोकल कंटेनर में जोड़ता है. आपका डोमेन चाहे जो भी हो, Spanner Omni यह पक्का करता है कि आपके एज एजेंट के पास ज़मीनी हकीकत की सटीक जानकारी हो.