Skip to content

Architecture

@nx/search là một thư viện; nó không có runtime độc lập. Mọi sơ đồ thể hiện nó được nhúng trong process host (commerce).

1. System Context (C4 L1)

2. Container View (C4 L2)

3. Component View (C4 L3) — Phân lớp nội bộ

LayerTrách nhiệm
Mixin / SearchControllerBề mặt HTTP, cổng auth + permission, merge scope
SearchServiceFilter Ignis → tham số Typesense, resolve include, định hình response
TypesenseConverterwhere/order/fieldsfilter_by/sort_by/include_fields
CDC servicesConsume, batch, route, cascade, enrich, index
MappersDB row (snake/camel) → Typesense doc; null cho soft-deleted
CollectionRegistryRegistry singleton của 8 config (+ nối embed.from)
HelpersTypesense client, so sánh schema-drift, parse include

4. Chỉ mục State Machine

Phần tử runtime có state duy nhất là CDC circuit breaker (opt-in).

ElementTrạng tháiSơ đồ
CDC circuit breakerCLOSED, OPEN→ jump

CDC Circuit Breaker

TừSự kiệnĐếnGuards
CLOSEDhealth probe failOPENAPP_ENV_CDC_CIRCUIT_BREAKER_ENABLED=true
OPENprobe phục hồiCLOSEDquiet window trôi qua (Typesense 30s / Google 90s)
OPENOPENgiới hạn ở maxOpenMs (30 phút)

Khi OPEN, consumer pause (auto-commit off, nên offset không tiến) — message được đọc lại sau khi phục hồi.

5. Kịch bản Runtime

5.1 Query path (consumer → Typesense)

BướcChi tiết
2resolveSearchScope() inject where tenant/merchant; mặc định null (mở) trừ khi host override
5Nếu set disableSemanticSearch, trường embedding bị bỏ khỏi query_by (keyword nghiêm ngặt)
7Quan hệ include resolve qua Typesense native join (reference) hoặc lookup hydration

5.2 CDC sync (Debezium → Typesense)

BướcChi tiết
3Batch tinh chỉnh bởi CDCBatchingConfig (200 max, 2000ms flush) + maxBytes 5MB
5Mapper trả về null cho soft-deleted → trigger Typesense delete
6Cascade source: ProductCategory, MetaLink, FareSet/Fare, ProductBundler, hầu hết bảng inventory
8Auto-commit off — offset tiến chỉ sau khi batch thành công (at-least-once)

5.3 Schema-drift check khi bootstrap

Phân kỳ được log, không bao giờ auto-apply — auto-rebuild sẽ drop document. Dùng các script backfill cho thay đổi additive.

6. Mối quan tâm xuyên suốt

Mối quan tâmCách thư viện này xử lý
AuthNKế thừa từ host — SearchController + mixin nhận JWT hoặc Basic (AuthenticateStrategy.JWT, .BASIC)
AuthZPermission search:search / search:search-count; mixin yêu cầu config authorize từ consumer
Multi-tenancyresolveSearchScope() inject một scope where, and-merge với filter của caller (host override theo từng entity)
i18n{ en, vi } flatten thành trường Typesense name.en / name.vi; locale tương lai bắt bởi wildcard field
LoggingKey-value có cấu trúc (key: %s) qua IGNIS logger
IdempotencyGuard LSN/version (source_lsn, deleted_at) loại bỏ event CDC sai thứ tự
Soft-deleteMapper trả về null cho deletedAt != null → document bị xóa khỏi Typesense
ResilienceCircuit breaker (opt-in) + DLQ cho message độc + utility retry
IDsDocument id = id dòng nguồn; thư viện không cấp Snowflake ID nào

7. Trang liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.