GH GambleHub

मॉडल और अनुमान पढ़ें

रीड मॉडल एक विशिष्ट उत्पाद परिदृश्य के लिए त्वरित पढ़ ने के लिए एक विशेष रूप से डिज़ाइन की गई तालिका/सूचकांक प्रक्षेपण एक प्रक्रिया है जो स्रोत घटनाओं/परिवर्तनों को रीड मॉडल अपडेट (आमतौर पर पहचानने योग्य अपसर्ट) में परिवर्तित करती है। CQRS के संयोजन में, यह आपको OLTP कोर को उतारने और p95/p99 रीड को स्थिर करने की अनुमति देता है, "ताजगी" को नियंत्रित करता है।

मुख्य विचार:
  • अनुरोध के तहत denormalize, "सार्वभौमिक योजना" नहीं।
  • वृद्धिशील और पहचान से अद्यतन करें।
  • स्पष्ट रूप से गतिशीलता और क्रम का प्रबंधन करें।

1) रीड मॉडल का उपयोग कब करें (और जब नहीं)

फिट:
  • स्वीकार्य अद्यतन विलंबता के साथ बार-बार भारी पढ़ ता है (जुड़ता/एकत्रीकरण/प्रकार)।
  • डैशबोर्ड, कैटलॉग, लैंडिंग पेज, "टॉप-एन", व्यक्तिगत फीड, खोज सूची।
  • लोड शेयरिंग: राइट-कोर - सख्त, रीड-प्लेन - फास्ट और स्केलेबल।
उपयुक्त नहीं:
  • सख्त अपरिवर्तनीय "प्रति प्रविष्टि" (धन, विशिष्टता) की आवश्यकता वाले संचालन। एक मजबूत रास्ता है।

2) वास्तुशिल्प रूपरेखा (मौखिक योजना)

1. परिवर्तनों का स्रोत: ओएलटीपी से डोमेन (घटना सोर्सिंग) या सीडीसी की घटनाएं।

2. प्रक्षेपण पाइपलाइन: parser एकत्रीकरण/denormalization idempotent upsert।

3. स्टोर पढ़ें: क्वेरी के लिए डेटाबेस/इंडेक्स अनुकूलित (RDBMS, स्तंभ, खोज).

4. API/क्लाइंट: त्वरित SELECT/GET, "as_of/freshness" विशेषताओं के साथ।

3) मॉडल डिजाइन पढ़ें

एक प्रश्न के साथ प्रारंभ करें: कौन से क्षेत्र, फ़िल्टर, छंटाई, पृष्ठभूमि, शीर्ष N?

Denormalize: पहले से विलय किए गए डेटा (नाम, मात्रा, स्थिति) को संग्रहीत करें।

कुंजियाँ:
  • विभाजन: 'किरायेदार _ id' द्वारा, तिथि, क्षेत्र.
  • प्राथमिक कुंजी: व्यवसाय कुंजी + समय बाल्टी (उदाहरण के लिए, '(tenant_id, entity_id)' या '(tenant_id, bucket_minute)')।
  • सूचकांक: अक्सर जहां/क्रम द्वारा।
  • टीटीएल/प्रतिधारण: अस्थायी प्रदर्शन मामलों के लिए (जैसे। 90 दिन)।

4) अद्यतन प्रवाह और पहचान

पहचान अपसर्ट प्रक्षेपण स्थिरता का आधार है।

छद्म:
sql
-- Projection table
CREATE TABLE read_orders (
tenant_id  TEXT,
order_id  UUID,
status   TEXT,
total    NUMERIC(12,2),
customer  JSONB,
updated_at TIMESTAMP,
PRIMARY KEY (tenant_id, order_id)
);

-- Idempotent update by event
INSERT INTO read_orders(tenant_id, order_id, status, total, customer, updated_at)
VALUES (:tenant,:id,:status,:total,:customer,:ts)
ON CONFLICT (tenant_id, order_id) DO UPDATE
SET status = EXCLUDED. status,
total = EXCLUDED. total,
customer = COALESCE(EXCLUDED. customer, read_orders. customer),
updated_at = GREATEST(EXCLUDED. updated_at, read_orders. updated_at);
नियम:
  • प्रत्येक संदेश एक संस्करण/समय वहन करता है; केवल "ताजा या समान" (पहचान) स्वीकार करें।
  • समुच्चय (काउंटर, रकम) के लिए - स्टोर स्थिति और कम्यूटेटिव अपडेट (या सीआरडीटी दृष्टिकोण) का उपयोग करें।

5) परिवर्तन का स्रोत: घटनाएँ बनाम सीडीसी

घटनाएँ (घटना सोर्सिंग): समृद्ध शब्दार्थ, विभिन्न अनुमानों का निर्माण करना आसान है; सर्किट का विकास महत्वपूर्ण है।

सीडीसी (तार्किक प्रतिकृति): बस एक मौजूदा डेटाबेस से कनेक्ट करें; DML→sobyty मैपिंग और शोर अपडेट फ़िल्टरिंग की आवश्यकता होगी।

दोनों विकल्पों की आवश्यकता है:
  • "जहरीले" संदेशों के लिए डिलीवरी गारंटी (कम से कम एक बार) और डीएलक्यू।
  • कुंजी के अनुसार अनुक्रम (पार्टीशन कुंजी = 'किरायेदार _ id: entity _ id').

6) आदेश, कारण और "ताजगी"

कुंजी द्वारा आदेश: एक वस्तु की घटनाओं को क्रमिक रूप से आना चाहिए; विभाजन और संस्करणों का उपयोग करें।

सत्र/कारण: लेखक को उनके परिवर्तनों (RYW) को देखने के लिए, प्रश्नों में वॉटरमार्क संस्करण पास करें।

बाध्य गतिशीलता: 'के रूप में '/' एक्स-डेटा-फ्रेशनेस' वापस करें और एसएलओ (उदा। p95 ≤ 60c)।

7) वृद्धिशील समुच्चय और शीर्ष एन

मिनट बिक्री बाल्टी का उदाहरण:
sql
CREATE TABLE read_sales_minute (
tenant_id TEXT,
bucket  TIMESTAMP, -- toStartOfMinute revenue  NUMERIC(14,2),
orders  INT,
PRIMARY KEY (tenant_id, bucket)
);

-- Update by Event
INSERT INTO read_sales_minute(tenant_id, bucket, revenue, orders)
VALUES (:tenant,:bucket,:amount, 1)
ON CONFLICT (tenant_id, bucket) DO UPDATE
SET revenue = read_sales_minute. revenue + EXCLUDED. revenue,
orders = read_sales_minute. orders + 1;
शीर्ष एन के लिए:
  • एक रैंक शोकेस बनाए रखें (उदाहरण के लिए, 'राजस्व DESC' द्वारा) और केवल परिवर्तित पदों (ढेर/स्किपलिस्ट/सीमित तालिका) को अपडेट करें।
  • शीर्ष की "विंडो" स्टोर करें (उदाहरण के लिए, प्रति खंड 100-1000 लाइनें)।

8) खोज और भू-प्रक्षेपण

खोज (ES/Opensearch): विखंडित दस्तावेज़, पाइपलाइन परिवर्तन, दस्तावेज़ संस्करण = स्रोत संस्करण।

जियो: स्टोर 'POINT/LAT, LON', प्री-एग्रीगेट टाइल्स/क्वाड्स।

9) बहु-किरायेदार और क्षेत्र

प्रक्षेपण कुंजी और घटनाओं में 'किरायेदार _ id' की आवश्यकता होती है।

निष्पक्षता: प्रति किरायेदार (WFQ/DRR) अनुमानों के थ्रूपुट को सीमित करें ताकि "शोर" बाकी को धीमा न करे।

रेजीडेंसी: प्रक्षेपण उसी क्षेत्र में रहता है जैसे लेखन कोर; अंतर-क्षेत्रीय शोकेस - समुच्चय/सारांश।

10) अवलोकन और एसएलओ

मेट्रिक्स:
  • 'प्रोजेक्शन _ lag _ ms' (istochnik→vitrina), 'फ्रेशनेस _ age _ ms' (अंतिम डेल्टा के बाद से)।
  • अपडेट, त्रुटि दर, डीएलक्यू-दर, पुनर्विकास-सफलता के थ्रूपुट।
  • विंडो का आकार, p95/p99 रीडिंग लेटेंसी।
ट्रेसिंग/लॉग्स:
  • Теги: 'किरायेदार _ आईडी', 'इकाई _ आईडी', 'इवेंट _ आईडी', 'संस्करण', 'प्रोजेक्शन _ name', 'प्रयास'।
  • एनोटेशन: विलय समाधान, पुराने संस्करणों की चूक।

11) प्लेबुक (रनबुक)

1. लैग ग्रोथ: कनेक्टर/ब्रोकर की जांच करें, पार्टियों को बढ़ाएं, प्रमुख शोकेस की प्राथमिकता शामिल करें।

2. कई स्कीमा त्रुटियां: फ्रीज रिड्राइव, माइग्रेट स्कीमा (बैकफिल), मैपर के एक नए संस्करण के साथ फिर से शुरू करें।

3. दोहराया DLQ: बैच को कम करें, "छाया" हैंडलर को सक्षम करें, पहचान बढ़ाएं।

4. विंडो असंगतता: लॉग/स्रोत प्रति विंडो से विंडो का पुनर्निर्माण करें (किरायेदार/विभाजन चयनात्मक).

5. हॉट कुंजी: कुंजी द्वारा प्रतिस्पर्धा को सीमित करें, स्थानीय कतारें जोड़ें, इकाई को एक अलग शोकेस में रखें।

12) फुल रिकाउंट (पुनर्निर्माण) और बैकफिल

दृष्टिकोण:
  • खपत रोकें (या शोकेस के नए संस्करण पर स्विच करें)।
  • बैचों में पुनर्गणना (बैच/तिथि/किरायेदार द्वारा)।
  • दो-चरण स्विच सक्षम करें: पहले 'पढ़ें __ v2' में भरें, फिर परमाणु रूप से रीड रूटिंग को स्विच करें।

13) सर्किट का विकास (संस्करण)

'schema _ vision' events/दस्तावेज़।

प्रक्षेपण कई संस्करणों को पढ़ सकता है, मक्खी पर प्रवासन।

प्रमुख परिवर्तनों के लिए - एक नया v2 शोकेस और कैनरी ट्रैफिक।

14) सुरक्षा और पहुंच

स्रोत से विरासत आरएलएस/एसीएल; मूल डेटा की तुलना में शोकेस को व्यापक न बनाएं।

UX/एनालिटिक्स के लिए आवश्यक नहीं अनुमानों में मास्क PII।

Redrives/recounts/manual edits का लेखा परीक्षा।

15) कॉन्फ़िगरेशन टेम्पलेट

yaml projections:
read_orders:
source: kafka. orders. events partition_key: "{tenant_id}:{order_id}"
idempotency: version_ts upsert:
table: read_orders conflict_keys: [tenant_id, order_id]
freshness_slo_ms: 60000 dlq:
topic: orders. events. dlq redrive:
batch: 500 rate_limit_per_sec: 50 read_sales_minute:
source: cdc. orders partition_key: "{tenant_id}:{bucket_minute}"
aggregate: increment retention_days: 90 limits:
per_tenant_parallelism: 4 per_key_serial: true observability:
metrics: [projection_lag_ms, dlq_rate, redrive_success, read_p95_ms]

16) विशिष्ट त्रुटियाँ

"सभी मामलों के लिए एक शोकेस" - भारी अपडेट और खराब p99।

समुच्चय में पहचान की कमी → डुप्लिकेट/कूदता है।

दोहरे-सीधे शोकेस और OLTP → विसंगतियों को लिखें।

ताजगी की शून्यता - उत्पाद के साथ परस्पर विरोधी उम्मीदें।

जवाब में दो-चरण स्विच के बिना पुनर्निर्माण → "छेद"।

कोई विभाजन/सूचकांक नहीं - लागत और विलंबता वृद्धि।

17) त्वरित व्यंजनों

कैटलॉग/खोज: दस्तावेज़ शोकेस + वृद्धिशील अपसर्ट, लैग ≤ 5-15 एस, फ़िल्टर के लिए सूचकांक।

डैशबोर्ड: मिनट/घंटे के टैंक, 'SUM/COUNT' इकाइयाँ, p95 ताजगी ≤ 60 s।

व्यक्तिगत टेप: लेखक के लिए उपयोगकर्ता + कारण/RYW द्वारा प्रक्षेपण, कैश पर वापस।

ग्लोबल सास: क्षेत्रीय शोकेस, क्षेत्रीय रूप से क्रॉस-रीजनल; प्रति किरायेदार निष्पक्षता।

18) प्री-सेल चेकलिस्ट

  • शोकेस एक विशिष्ट अनुरोध के लिए डिज़ाइन किया गया है; सूचकांक और पार्टियां हैं।
  • परिवर्तन का स्रोत चयनित (घटनाओं/सीडीसी); डिलीवरी गारंटी और प्रमुख आदेश।
  • संस्करणों/समय के साथ पहचान अपसर्ट; "पुरानी" घटनाओं के खिलाफ सुरक्षा।
  • ताजगी एसएलओ को परिभाषित और उत्तर दिया गया है ('के रूप में _ of/ताजगी')।
  • डीएलक्यू और सुरक्षित रिलीज कॉन्फ़िगर; पुनर्निर्माण/बैकफिल पर प्लेबुक।
  • प्रति-कुंजी धारावाहिक और प्रति किरायेदार निष्पक्षता।
  • Lag/त्रुटि/विलंबता मेट्रिक्स, p95/p99 अलर्ट, और DLQ वृद्धि।
  • सर्किट संस्करण और प्रवासन रणनीति (v2 + स्विच)।
  • पहुंच/पीआईआई नीतियां विरासत में मिली हैं और मान्य हैं।

निष्कर्ष

पढ़ें मॉडल और अनुमान पढ़ ने का एक इंजीनियरिंग त्वरक है: आप "ताजगी" और स्ट्रीमिंग बुनियादी ढांचे के लिए एक छोटी कीमत का भुगतान करते हैं ताकि भविष्यवाणी योग्य मिलीसेकंड प्राप्त किया जा सके और रिकॉर्डिंग का मूल उतार्य। अपने अनुरोध के अनुरूप स्टोरफ्रंट डिजाइन करें, अपडेट पहचान बनाएं, अंतराल को मापें और स्पष्ट रूप से ताजगी का वादा करें - और आपके एपीआई बढ़ ते भार, डेटा और भूगोल के साथ भी तेज रहेंगे।

Contact

हमसे संपर्क करें

किसी भी प्रश्न या सहायता के लिए हमसे संपर्क करें।हम हमेशा मदद के लिए तैयार हैं!

इंटीग्रेशन शुरू करें

Email — अनिवार्य है। Telegram या WhatsApp — वैकल्पिक हैं।

आपका नाम वैकल्पिक
Email वैकल्पिक
विषय वैकल्पिक
संदेश वैकल्पिक
Telegram वैकल्पिक
@
अगर आप Telegram डालते हैं — तो हम Email के साथ-साथ वहीं भी जवाब देंगे।
WhatsApp वैकल्पिक
फॉर्मैट: देश कोड और नंबर (उदा. +91XXXXXXXXXX)।

बटन दबाकर आप अपने डेटा की प्रोसेसिंग के लिए सहमति देते हैं।