ADR-0001. Ship search dưới dạng thư viện IGNIS component, không phải service độc lập
| Field | Value |
|---|---|
| Status | Accepted |
| Date | 2026-02-15 |
| Deciders | @search-team |
| Supersedes | — |
Bối cảnh
- Search cần cùng dữ liệu nguồn đã nằm trong commerce (products, merchants, categories, devices, sale-channels) cộng pricing và inventory.
- Một service riêng sẽ cần kết nối DB riêng, deploy, port, Snowflake worker id riêng, và một bản sao trùng của CDC consumer + wiring auth.
- Query path nhạy cảm latency và được gọi từ chính các entity controller của commerce.
- Typesense + Debezium connector là các phần biến động bên ngoài thực sự duy nhất; phần còn lại là logic in-process.
Quyết định
Chúng tôi sẽ ship @nx/search dưới dạng package thư viện export bốn lớp con BaseComponent (ApplicationSearchComponent, ApplicationEmbeddingConfigurationComponent, TypesenseSearchEngineComponent, ApplicationCdcComponent) cộng một SearchableControllerMixin. Host service (commerce) đăng ký chúng theo thứ tự dependency; search không có application.ts, port, hay DB schema riêng.
Hệ quả
| Ưu | Nhược |
|---|---|
| Zero deploy/port/Snowflake thừa; tái dùng auth + DB của host | Vòng đời search ghép với host |
Lời gọi SearchService in-process — không network hop trên query path | Không thể scale CDC consumer độc lập với commerce |
| Một CDC consumer trong host, không phải bản trùng | Bootstrap host phải đăng ký component đúng thứ tự |
Mixin để mỗi controller consumer thêm /search với tenant scope riêng | Một consumer thứ hai sẽ re-run cùng pipeline CDC trừ khi phối hợp |
Các phương án đã cân nhắc
| Phương án | Ưu | Nhược | Lý do loại bỏ |
|---|---|---|---|
| Microservice search độc lập | Scale độc lập, ownership rõ | CDC consumer trùng, deploy/port/DB riêng, auth cross-service | Chi phí ops không tương xứng cho quy mô POS |
| Inline code search trực tiếp trong commerce | Wiring đơn giản nhất | Không tái dùng, không test cô lập được, phình commerce | Mất tái dùng + ranh giới sạch |
Tham chiếu
packages/search/AGENTS.md— thứ tự đăng ký component- Architecture