01 Hai phong cách monolith
Cả hai đều là một đơn vị triển khai (một "lượng tử"), chia điểm mạnh/yếu giống Layered: mạnh chi phí & đơn giản, yếu mở rộng, đàn hồi, chịu lỗi. Điểm phân biệt nằm ở cách tổ chức xử lý.
Pipeline
Dữ liệu chảy một chiều qua chuỗi bộ lọc, mỗi bộ làm đúng một việc. Nền của ETL, EDI, shell |.
Microkernel
Một lõi tối thiểu + các plug-in độc lập cắm vào. Nền của Eclipse, trình duyệt, phần mềm thuế/bảo hiểm.
02 Pipeline: pipes & filters
Topology gồm pipe (ống) & filter (bộ lọc). Pipe là kênh giao tiếp — thường điểm-điểm & một chiều, payload nhỏ để chạy nhanh. Filter tự đóng gói, độc lập, thường stateless, mỗi cái chỉ làm một nhiệm vụ.
|.Bốn loại filter
Producer
Điểm bắt đầu, chỉ có đầu ra. Vd: subscribe một topic Kafka để nhận dữ liệu.
Transformer
Nhận vào, biến đổi dữ liệu, đẩy ra pipe sau. Như map trong lập trình hàm.
Tester
Kiểm tra tiêu chí rồi tùy chọn tạo đầu ra/định tuyến. Như filter/reduce.
Consumer
Điểm kết thúc: lưu DB hoặc hiển thị lên màn hình.
Dùng ở đâu: công cụ ETL, EDI, điều phối như Apache Camel, hay pipeline xử lý telemetry stream từ Kafka → MongoDB. Tác vụ phức hợp thì nối nhiều filter, đừng nhồi vào một filter.
Đánh giá đặc tính — Pipeline
03 Microkernel: core & plug-in
Còn gọi là plug-in architecture. Hai phần: core system (chức năng tối thiểu để chạy / "happy path") + các plug-in độc lập chứa xử lý chuyên biệt, hay thay đổi.
Core system
Đường đi thông thường, ít/không logic tùy biến. Đẩy độ phức tạp (cyclomatic) ra plug-in → dễ mở rộng, bảo trì, test hơn.
Plug-in
Cô lập code hay biến động. Nối qua gọi hàm (shared lib: JAR/DLL/Gem), hoặc REST/messaging để decoupling & scale tốt hơn. Compile-based hoặc runtime (OSGi, Jigsaw…).
Registry & Contract
Registry: tên + hợp đồng dữ liệu + giao thức. Contract (XML/JSON/object) chuẩn hoá hành vi vào–ra giữa lõi & plug-in.
Phong cách "lưỡng cư" duy nhất: microkernel có thể vừa technical vừa domain partitioned — phần domain đến từ tương quan mạnh giữa cấu trúc plug-in & nghiệp vụ (vd cấu hình riêng mỗi khách/khu vực, hay sản phẩm nặng tùy biến như Jira, Eclipse). Ví dụ: xử lý bồi thường bảo hiểm (mỗi bang một plug-in luật), phần mềm thuế (mỗi biểu mẫu một plug-in).
Đánh giá đặc tính — Microkernel
04 Dựng RAG theo hai kiểu
Hệ "Hỏi–đáp tài liệu" soi rất rõ qua hai phong cách này — và may mắn là cả hai cùng xuất hiện tự nhiên trong một RAG.
Ingest = một Pipeline kinh điển
RAG Luồng nạp tài liệu chính là pipes & filters: producer → các transformer/tester → consumer.
flowchart LR
P["Load tài liệu"]:::prod --> T1["Chunk"]:::tr --> T2["Lọc rác / quá ngắn"]:::test --> T3["Embed"]:::tr --> C[("Lưu Vector Store")]:::cons
classDef prod fill:#e7ddf2,stroke:#6a4ca8,color:#1c1a14;
classDef tr fill:#ddd2ef,stroke:#6a4ca8,color:#1c1a14;
classDef test fill:#f3e6c8,stroke:#9a6712,color:#1c1a14;
classDef cons fill:#14233b,stroke:#14233b,color:#f3ede0;
# mỗi filter là một hàm thuần, stateless — ghép kiểu compositional
for doc in load(path): # Producer (source)
for ch in chunk(doc): # Transformer (map)
if is_meaningful(ch): # Tester (filter)
store.add(embed(ch)) # Transformer → Consumer (sink)
Vendor LLM/Embedder = Plug-in của Microkernel
RAG Để "tháng sau đổi sang model khác" (đặc tính extensibility/adaptability ở topic 03), đặt mỗi nhà cung cấp thành một plug-in sau hợp đồng chung; lõi RAG không cần biết bên trong:
class EmbedderPlugin(Protocol): # CONTRACT chung
def embed(self, text: str) -> list[float]: ...
REGISTRY = { # REGISTRY: tên → plug-in
"openai": OpenAIEmbedder(),
"local": LocalBGEEmbedder(), # cắm/gỡ không đụng lõi
}
def get_embedder(name): return REGISTRY[name] # core chỉ tra registry
05 Ghi nhớ nhanh
Pipeline = pipes & filters một chiều — 4 loại filter: Producer, Transformer (map), Tester (filter/reduce), Consumer. Filter stateless, làm một việc.
Microkernel = lõi tối thiểu + plug-in — đẩy phần hay-đổi ra plug-in độc lập; lõi tra registry, giao tiếp qua contract.
Đều mạnh chi phí & đơn giản, yếu mở rộng/đàn hồi/chịu lỗi — vì là monolith một lượng tử (giống Layered).
Microkernel là phong cách "lưỡng cư" — duy nhất vừa technical vừa domain partitioned; hợp sản phẩm nặng tùy biến (IDE, thuế, bảo hiểm).
RAG dùng cả hai: ingest là Pipeline; vendor LLM/Embedder là Plug-in sau một contract chung.