Sổ tay Kiến trúc Phần mềm
05 Phần II · Phong cách Chương 9

Nền tảng phong cách & nguỵ biện phân tán

Foundations & Fallacies of Distributed Computing

Mỗi phong cách kiến trúc là một bộ đánh đổi đã được đặt tên. Trước khi đi sâu từng phong cách, phải nắm lằn ranh lớn nhất — monolithic vs distributed — và 8 nguỵ biện luôn rình rập mọi hệ phân tán.

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

một đơn vị triển khai

Toàn bộ mã trong một deployment unit.

Layered (ch 10) · Pipeline (ch 11) · Microkernel (ch 12)

Distributed

nhiều đơn vị qua mạng

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

the network is reliable

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

latency is zero

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

bandwidth is infinite

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

the network is secure

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

the topology never changes

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

there is only one administrator

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

transport cost is zero

Đâ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

the network is homogeneous

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

distributed logging

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

eventual consistency

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

contract & versioning

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ạnhACID (monolith)BASE (distributed)
Tinh thầnAtomicity · Consistency · Isolation · DurabilityBasic availability · Soft state · Eventual consistency
Nhất quánCao & 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ấyKhó 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;
            
Chuỗi 4 chặng: độ trễ cộng dồn (#2), băng thông tốn khi trả nguyên doc (#3), endpoint nào cũng phải bảo mật (#4), và LLM vendor có thể chậm/sập (#1).

RAG  Đối phó nguỵ biện #1 & #2 ngay ở ranh giới PHP — timeout + circuit breaker, đừng tin mạng:

PHP · gọi pipeline Python phòng thủ
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
}
Đừng để PHP "treo vô hạn" chờ Python — long-tail p99 mới là thứ giết hiệu năng.

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.

NguồnChương 9 (Foundations — Architecture Styles), Fundamentals of Software Architecture — Mark Richards & Neal Ford, O'Reilly 2020. Fallacies of Distributed Computing: L. Peter Deutsch & al., Sun Microsystems, 1994.