01 Phong cách vs Mẫu kiến trúc
Hai khái niệm hay bị lẫn — phân biệt rõ giúp giao tiếp chuẩn:
Phong cách (architecture style)
- Cấu trúc bao quát: UI & backend tổ chức ra sao, tương tác datastore thế nào.
- Tên phong cách = "tốc ký" giữa các KTS (nói "layered monolith" là hiểu ngay cấu trúc, đặc tính, chiến lược dữ liệu).
Mẫu (architecture pattern)
- Cấu trúc thiết kế cấp thấp hơn, giải bài toán cụ thể bên trong một phong cách.
- Vd: cách đạt scalability/performance cao giữa một tập thao tác hay dịch vụ.
02 Hai nhóm lớn: Monolithic vs Distributed
Mọi phong cách chia về hai loại — đây là lằn ranh phân loại tốt nhất vì các kiến trúc phân tán chia chung một bộ thách thức mà monolith không có.
Monolithic
Toàn bộ mã trong một deployment unit.
Layered (ch 10) · Pipeline (ch 11) · Microkernel (ch 12)Distributed
Nhiều đơn vị nối nhau bằng giao thức truy cập từ xa.
Service-Based (13) · Event-Driven (14) · Space-Based (15) · SOA (16) · Microservices (17)Kiến trúc phân tán mạnh hơn hẳn về performance, scalability, availability — nhưng trả giá lớn. Nhóm rắc rối đầu tiên: 8 nguỵ biện của tính toán phân tán (Deutsch & đồng nghiệp ở Sun Microsystems, 1994). Nguỵ biện = điều ta tưởng đúng nhưng thực ra không.
03 Tám nguỵ biện của hệ phân tán
Tám giả định sai mà KTS hay mắc — mỗi cái lại kéo theo cái khác thành "vòng lặp bất tận":
1 · Mạng đáng tin cậy
Mạng vẫn không đáng tin. Service B khỏe mạnh nhưng A không gọi tới được. → Vì vậy mới cần timeout & circuit breaker.
2 · Độ trễ bằng 0
Gọi nội bộ ~nano/micro giây; gọi từ xa ~mili giây. Xâu chuỗi 10 lời gọi @100ms → cộng 1.000ms. Phải biết cả p95–p99 ("long tail").
3 · Băng thông vô hạn
Stamp coupling: lấy 500kb hồ sơ chỉ để đọc cái tên 200 byte; ×2.000 req/s = 1 Gb/s cho một lời gọi. Truyền tối thiểu dữ liệu.
4 · Mạng an toàn
Bề mặt tấn công tăng theo cấp số. Mọi endpoint đều phải bảo mật → một lý do hệ đồng bộ, phân tán mạnh thường chậm hơn.
5 · Cấu trúc mạng bất biến
Router/firewall/switch đổi liên tục. Một "nâng cấp nhỏ" lúc 2h sáng làm sai mọi giả định độ trễ → timeout & circuit breaker nổ hàng loạt.
6 · Chỉ một quản trị viên
Công ty lớn có hàng chục admin mạng. Biết hỏi ai về độ trễ hay thay đổi topology? Lộ rõ độ phức tạp & nhu cầu điều phối.
7 · Chi phí vận chuyển bằng 0
Đây là tiền, không phải độ trễ. Phân tán tốn hơn nhiều: thêm phần cứng, gateway, firewall, subnet, proxy…
8 · Mạng đồng nhất
Thực tế nhiều hãng phần cứng (Cisco, Juniper…) không phải lúc nào cũng ăn khớp → thỉnh thoảng mất gói, kéo theo nguỵ biện #1, #2, #3.
04 Cân nhắc phân tán khác
Ngoài 8 nguỵ biện, hệ phân tán còn ba thách thức lớn mà monolith không có:
Logging phân tán
Truy nguyên nhân gốc rất khó: log nằm ở hàng trăm nơi, mỗi nơi một định dạng. Công cụ như Splunk chỉ chạm bề mặt.
Giao dịch phân tán
Khó giữ ACID; thường hi sinh nhất quán để lấy mở rộng → nhất quán cuối cùng, dùng saga / BASE.
Hợp đồng & phiên bản
Tạo–bảo trì–khai tử hợp đồng dữ liệu giữa các service tách rời (do team/phòng khác sở hữu) cực khó, nhất là khi deprecate phiên bản.
| Khía cạnh | ACID (monolith) | BASE (distributed) |
|---|---|---|
| Tinh thần | Atomicity · Consistency · Isolation · Durability | Basic availability · Soft state · Eventual consistency |
| Nhất quán | Cao & tức thì; commit/rollback đơn giản. | Nhất quán tại một thời điểm sau; trung gian có thể lệch. |
| Đổi lấy | Khó mở rộng ngang. | Mở rộng, hiệu năng, sẵn sàng cao. |
BASE không phải phần mềm mà là một kỹ thuật: "soft state" chỉ dữ liệu đang trên đường từ nguồn tới đích, các nguồn tạm lệch nhau rồi sẽ hội tụ qua messaging & mẫu kiến trúc.
05 Soi nguỵ biện qua hệ RAG
Hệ "Hỏi–đáp tài liệu" của ta vốn đã là một hệ phân tán: PHP (web) gọi Python (pipeline) qua HTTP, Python gọi tiếp Vector Store & LLM. Mỗi mũi tên là một lần dính nguỵ biện.
flowchart LR
U["Người dùng"] --> PHP["PHP · Web"]:::php
PHP -->|"HTTP ~?ms"| RET["Python · Retrieve"]:::py
RET -->|"query"| VS[("Vector Store")]:::db
RET -->|"prompt"| LLM["LLM (vendor)"]:::ext
classDef php fill:#e7ddf2,stroke:#6a4ca8,color:#1c1a14;
classDef py fill:#ddd2ef,stroke:#6a4ca8,color:#1c1a14;
classDef db fill:#e2edf3,stroke:#2f6d93,color:#1c1a14;
classDef ext fill:#14233b,stroke:#14233b,color:#f3ede0;
RAG Đối phó nguỵ biện #1 & #2 ngay ở ranh giới PHP — timeout + circuit breaker, đừng tin mạng:
try {
$res = $http->timeout(2) // #2 độ trễ ≠ 0 → đặt trần
->retry(2, 200) // #1 mạng ≠ tin cậy
->post('/query', ['question' => $q, 'top_k' => 5]);
} catch (ConnectionException $e) {
return response()->json(['degraded' => true], 503); // circuit breaker
}
RAG Nhất quán cuối cùng trong RAG: nếu nạp tài liệu bất đồng bộ (worker nền), thì vừa upload xong tài liệu chưa tìm được ngay — phải đợi index hội tụ. Đó chính là BASE: chấp nhận "soft state" để đổi lấy chịu tải khi ingest.
RAG Tránh stamp coupling (#3): khi truy hồi, Python chỉ trả đoạn văn cần + id nguồn, đừng trả nguyên tài liệu gốc về cho PHP — tiết kiệm băng thông y như ví dụ wish-list 500kb của sách.
06 Ghi nhớ nhanh
Phong cách = cấu trúc bao quát; Mẫu = giải pháp cấp thấp bên trong nó.
Phân tán mạnh nhưng đắt & khó — đổi performance/scalability/availability lấy cả một rổ rắc rối mạng & dữ liệu.
Thuộc lòng 8 nguỵ biện — mạng không tin cậy/an toàn/đồng nhất; độ trễ, băng thông, chi phí không bằng 0/vô hạn; topology đổi; nhiều admin.
Quên ACID, làm quen BASE — phân tán sống bằng nhất quán cuối cùng, saga, messaging.
Mỗi endpoint là một mặt trận — bảo mật, hợp đồng, versioning đều khó hơn bội phần so với monolith.