Моделҳо ва пешгӯиҳоро хонед
Модели хондан як ҷадвал/индекс/назари махсус тарҳрезишуда барои хондани зуд барои сенарияи мушаххаси маҳсулот мебошад. Дурнамо равандест, ки рӯйдодҳои манбаъ/тағиротро ба навсозиҳои Модели хондан табдил медиҳад (одатан upsert idempotent). Дар якҷоягӣ бо CQRS, ин ба шумо имкон медиҳад, ки ядрои OLTP-ро бор кунед ва хониши p95/p99-ро бо назорати "тару тоза" ба эътидол оред.
Ғояҳои асосӣ:- Бо дархост муроҷиат кунед, на "нақшаи универсалӣ".
- Тадриҷан ва бемаънӣ навсозӣ кунед.
- Ба таври возеҳ идора ва тартибот.
1) Кай истифода бурдани моделҳои хондан (ва кай не)
Мувофиқат:- Хондани зуд-зуд вазнин (ҳамроҳ/агрегатсия/навъҳо) бо таъхири қобили қабул.
- Панели панелҳо, каталогҳо, саҳифаҳои фуруд, "top-N", каналҳои шахсӣ, рӯйхати ҷустуҷӯ.
- Мубодилаи сарборӣ: навиштан-аслӣ - сахт, хондан-ҳавопаймо - зуд ва миқёспазир.
- Амалиётҳое, ки инвариантҳои қатъии "як вуруд" -ро талаб мекунанд (пул, беҳамто). Роҳи мустаҳкаме ҳаст.
2) Нақшаи меъморӣ (нақшаи шифоҳӣ)
1. Манбаи тағирот: рӯйдодҳои домейн (сарчашмаи ҳодиса) ё CDC аз OLTP.
2. Лӯлаи проексия: таҳлилгар → агрегатсия/denormalization → upsert idempotent.
3. Дӯкони хондан: пойгоҳи додаҳо/индекс барои дархост беҳтар карда шудааст (RDBMS, сутун, ҷустуҷӯ).
4. API/мизоҷ: зуд SELECT/GET, бо хусусиятҳои "as_of/freshness".
3) Тарҳи моделиро хонед
Бо пурсиш оғоз кунед: кадом майдонҳо, филтрҳо, навъбандӣ, пагинатсия, боло N?
Denormalize: Маълумотҳои аллакай якҷояшударо нигоҳ доред (номҳо, миқдор, статусҳо).
- Тақсимот: аз ҷониби 'иҷорагир _ ид', сана, минтақа.
- Калиди асосӣ: калиди бизнес + сатили вақт (масалан, '(tenant_id, entity_id)' ё '(tenant_id, bucket_minute)').
- Индексҳо: бо роҳи зуд-зуд дар куҷо/фармоиш аз ҷониби.
- TTL/нигоҳдорӣ: барои ҳолатҳои намоиши муваққатӣ (масалан, 90 рӯз).
4) Навсозии ҷараён ва номутаносибӣ
Пастравии Idempotent асоси устувории дурнамо мебошад.
Псевдо: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);
Қоидаҳо:
- Ҳар як паём версия/вақт дорад; танҳо "тару тоза ё баробар" -ро қабул кунед (idempotency).
- Барои агрегатҳо (ҳисобкунакҳо, суммаҳо) - ҳолати нигоҳдорӣ ва истифодаи навсозиҳои коммутатсионӣ (ё равишҳои CRDT).
5) Манбаи тағирот: Ҳодисаҳо vs CDC
Ҳодисаҳо (сарчашмаи чорабиниҳо): семантикаи бой, сохтани пешгӯиҳои гуногун осон аст; эволютсияи схемаҳо муҳим аст.
CDC (такрори мантиқӣ): танҳо ба пойгоҳи додаҳои мавҷуда пайваст шавед; DML → харитасозии оқилона ва филтри навсозии садо талаб карда мешавад.
- Кафолати таҳвил (ҳадди аққал як маротиба) ва DLQ барои паёмҳои "заҳролуд".
- Фармоиш аз рӯи калид (калиди қисм = 'иҷорагир _ ид: субъекти _ ид').
6) Тартиб, сабабҳо ва "тару тоза"
Фармоиш аз рӯи калид: рӯйдодҳои як объект бояд пайдарпай ба амал оянд; тақсимот ва версияҳоро истифода баред.
Сессия/сабабҳо: Барои муаллиф дидани тағиротҳои онҳо (RYW), версияҳои нишонаи обро дар дархостҳо гузаред.
Устувории маҳдуд: Бозгашт 'as _ of '/' X-Data-Freshness' ва нигоҳ доштани SLO (масалан. p95 ≤ 60c).
7) Агрегатҳои афзоянда ва боло N
Намунаи сатилҳои фурӯши дақиқаҳо: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;
Барои Top N:
- Намоиши дараҷабандишударо нигоҳ доред (масалан, аз ҷониби 'даромад DESC') ва нав кардани мавқеъҳои танҳо тағирёфта (heap/skiplist/ҷадвали маҳдуд).
- "Равзана" -и болоро нигоҳ доред (масалан, 100-1000 хат дар як сегмент).
8) Ҷустуҷӯ ва гео-проексия
Ҷустуҷӯ (ES/Opensearch): ҳуҷҷати ғайримуқаррарӣ, тағирёбии қубур, нусхаи ҳуҷҷат = нусхаи манбаъ.
Geo: мағозаи 'POINT/LAT, LON', сафолҳои пешакӣ/квадратҳо.
9) Бисёр иҷорагир ва минтақаҳо
'иҷорагир _ ид' дар калидҳо ва рӯйдодҳои лоиҳавӣ талаб карда мешавад.
Адолат: интиқоли пешгӯиҳоро ба як иҷорагир маҳдуд кунед (WFQ/DRR), то ки "ғавғо" боқимондаашро суст накунад.
Истиқомат: дурнамо дар ҳамон минтақае зиндагӣ мекунад, ки аслии навиштан аст; намоишҳои байниминтақавӣ - агрегатҳо/хулосаҳо.
10) Мушоҳида ва SLO
Нишондиҳандаҳо:- 'projection _ lag _ ms' (istochnik → vitrina), 'freshness _ age _ ms' (зеро дельтаи охирин).
- интиқоли навсозиҳо, сатҳи хатогӣ, меъёри DLQ, redrive-муваффақият.
- Андозаи тиреза, таъхири хониши p95/p99.
- Теги: 'иҷорагир _ ид', 'объекти _ ид', 'event _ id', 'версия', 'projection _ name', 'кӯшиш'.
- Эзоҳҳо: ҳалли якҷоя, беамалии версияҳои кӯҳна.
11) Китобҳои бозӣ (китобчаҳо)
1. Афзоиши ақибмонӣ: пайвасткунанда/брокери санҷиш, зиёд кардани тарафҳо, афзалияти намоиши калидҳоро дар бар мегирад.
2. Бисёр хатогиҳои схема: redrive-ро ях кунед, схемаҳоро интиқол диҳед (backfill), бо версияи нави харитасозӣ дубора оғоз кунед.
3. DLQ-и такрорӣ: партияро кам кунед, ба коркарди "соя" имкон диҳед, аблаҳиро зиёд кунед.
4. Номутобиқатии тиреза: барқарор кардани тирезаҳо аз журнал/манбаъ дар як тиреза (интихобкунандаи иҷорагир/қисм).
5. Калидҳои гарм: рақобатро аз рӯи калид маҳдуд кунед, навбатҳои маҳаллиро илова кунед, воҳидро дар намоиши алоҳида гузоред.
12) Ҳисобкунии пурра (барқарорсозӣ) ва бозсозӣ
Равиш:- Истеъмолро қатъ кунед (ё ба версияи нави намоишгоҳ гузаред).
- Ҳисоб кардан дар партияҳо (аз рӯи партия/сана/иҷорагир).
- Тугмаи ду фазаро фаъол созед: аввал 'хонед __ v2' -ро пур кунед, баъд хатсайрҳои хонишро ба таври атомӣ иваз кунед.
13) Эволютсияи схемаҳо (версия)
'schema _ version' ин ҳодисаҳо/ҳуҷҷатҳо.
Дурнамо метавонад якчанд версияро хонад, муҳоҷират дар парвоз.
Барои тағиротҳои асосӣ - намоиши нави v2 ва трафики канарӣ.
14) Амният ва дастрасӣ
RLS/ACL-ро аз манбаъ мерос гиред; намоиши дастрасиро нисбат ба маълумоти аввалия васеътар накунед.
Маска PII дар пешгӯиҳо барои UX/таҳлил лозим нест.
Аудити redrives/recounts/таҳрири дастӣ.
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.
Набудани idempotency → нусхабардорӣ/ҷаҳиш дар агрегатҳо.
Дучанд-навиштан мустақиман ба намоиш ва ихтилофоти OLTP →.
Намоиши сифрии тару тоза → ба интизориҳои мухолиф бо маҳсулот.
Бе гузариши думарҳилавӣ → "сӯрохиҳо" дар ҷавобҳо барқарор кунед.
Не тақсимот/индексатсияҳо § арзиш ва афзоиши ниҳонӣ.
17) Дорухатҳои зуд
Каталог/ҷустуҷӯ: намоиши ҳуҷҷатҳо + афзоиши афзоиш, ақибмонӣ ≤ 5-15 с, индексатсия барои филтрҳо.
Панели панелҳо: зарфҳои дақиқа/соат, агрегатҳои 'SUM/COUNT', p95 тару тоза ≤ 60 с.
Лентаи шахсӣ: дурнамо аз ҷониби корбар + сабабӣ/RYW барои муаллиф, бозгашт ба кэш.
Global SAA: намоишҳои минтақавӣ, агрегатҳо дар минтақа; адолат ба як иҷорагир.
18) Рӯйхати санҷиши пеш аз фурӯш
- Намоишгоҳ барои дархости мушаххас тарҳрезӣ шудааст; индексатсияҳо ва ҳизбҳо мавҷуданд.
- Манбаи тағирёбии интихобшуда (ҳодисаҳо/CDC); кафолати таҳвил ва фармоиши асосӣ.
- Ғазаби Idempotent бо версияҳо/вақт; муҳофизат аз рӯйдодҳои "кӯҳна".
- SLO тару тоза муайян карда мешавад ва ҷавоб дода мешавад ('as _ of/тару тоза').
- DLQ ва Release Secure танзим карда шудааст; китоби бозӣ дар барқарорсозӣ/backfill.
- Силсилаи калидӣ ва адолат барои як иҷорагир.
- Нишондиҳандаҳои ақибмонӣ/хатогӣ/дермонӣ, огоҳиҳои p95/p99 ва афзоиши DLQ.
- Стратегияи гардиш ва муҳоҷират (v2 + гузариш).
- Сиёсати дастрасӣ/PII ба мерос гирифта ва тасдиқ карда мешавад.
Хулоса
Моделҳо ва пешгӯиҳо як суръатбахшандаи муҳандисии хониш мебошанд: шумо барои "тару тоза" ва инфрасохтори ҷараён нархи ночизе пардохт мекунед, то милисекундҳои пешгӯишавандаро ба даст оред ва аслии сабтҳоро бор кунед. Дӯконҳои тарроҳӣ барои мувофиқ кардани дархости шумо, навсозиҳои номувофиқ, ақибмонӣ чен кунед ва тару тозаро дақиқ ваъда диҳед - ва API-ҳои шумо ҳатто бо зиёд шудани сарборӣ, маълумот ва ҷуғрофия босуръат боқӣ хоҳанд монд.