Chào bạn,
Ở bài học cuối cùng của module trước, chúng ta đã hoàn thành việc thiết lập một hệ thống Camunda production-ready với cơ sở dữ liệu ngoài và cơ chế bảo mật. Tất cả các bài thực hành từ đầu khóa học đến giờ đều dựa trên một mô hình kiến trúc duy nhất: nhúng (embedded) Camunda Engine trực tiếp vào ứng dụng Spring Boot của chúng ta.
Đây là một cách tiếp cận rất hiệu quả cho nhiều trường hợp, nhưng liệu nó có phải là lựa chọn duy nhất hay tốt nhất? Trong bài học đầu tiên của module "Kiến trúc Nâng cao và Best Practices" này, chúng ta sẽ lùi lại một bước để nhìn vào bức tranh toàn cảnh.
Mục tiêu của bài học hôm nay là phân tích các mô hình kiến trúc cho workflow engine, cụ thể là embedded (nhúng) và remote (từ xa). Là một developer quan tâm đến thiết kế kiến trúc, việc hiểu rõ ưu và nhược điểm của mỗi mô hình sẽ giúp bạn đưa ra những quyết định thiết kế quan trọng, ảnh hưởng đến khả năng mở rộng, bảo trì và tính linh hoạt của hệ thống.
1. Định nghĩa các Mô hình Kiến trúc
Trước tiên, hãy làm rõ hai khái niệm chính của bài học.
-
Embedded Engine (Engine Nhúng): Đây là mô hình chúng ta đã sử dụng xuyên suốt khóa học. Workflow engine được đóng gói như một thư viện (ví dụ: một file
.jar) và chạy bên trong cùng một tiến trình (process) và máy ảo Java (JVM) với ứng dụng nghiệp vụ của bạn (ứng dụng Spring Boot). Engine và code nghiệp vụ của bạn chia sẻ cùng một bộ nhớ và tài nguyên. -
Remote Engine (Engine Từ xa): Trong mô hình này, workflow engine chạy như một tiến trình độc lập, một server riêng biệt. Ứng dụng nghiệp vụ của bạn giao tiếp với engine này qua mạng, thường là thông qua REST API hoặc gRPC. Engine và ứng dụng nghiệp vụ là hai hệ thống riêng biệt, có thể được triển khai và vận hành độc lập. Một ví dụ điển hình là Camunda Run hoặc Camunda Platform 8 (sử dụng Zeebe engine).
2. So sánh Ưu và Nhược điểm
Việc lựa chọn giữa embedded và remote là một sự đánh đổi. Không có mô hình nào "tốt hơn" tuyệt đối, mà chỉ có mô hình "phù hợp hơn" với bối cảnh cụ thể của bạn.
Để hiểu sâu hơn về sự đánh đổi này, hãy đọc bài viết sau từ blog của Camunda. Bài viết này giải thích lịch sử phát triển các khuyến nghị về kiến trúc của Camunda và phân tích rất rõ các điểm mạnh, yếu của từng cách tiếp cận.
Moving from Embedded to Remote Workflow Engines - Camunda
Bài viết "Moving from Embedded to Remote Workflow Engines" sẽ cung cấp cho bạn cái nhìn sâu sắc về lý do tại sao Camunda đang dần chuyển khuyến nghị của mình sang mô hình remote.
Hãy đọc kỹ các phần sau: 'Weaknesses of the embedded engine': Để hiểu những hạn chế của mô hình chúng ta đang dùng. 'Benefits of a remote engine': Để thấy các lợi ích của việc tách riêng engine. 'Challenges of a remote engine': Để nhận thức được những thách thức đi kèm với mô hình remote.
Dưới đây là tóm tắt các điểm chính từ bài viết và một vài phân tích bổ sung:
Mô hình Embedded Engine
| Ưu điểm (Pros) | Nhược điểm (Cons) |
|---|---|
Dễ dàng khởi tạo: Chỉ cần thêm một dependency vào pom.xml, bạn đã có ngay một workflow engine. |
Khớp nối chặt (Tight Coupling): Vòng đời của ứng dụng và engine bị buộc vào nhau. Nâng cấp engine đòi hỏi phải triển khai lại toàn bộ ứng dụng. |
| Giao dịch (Transactions) nhất quán: Logic nghiệp vụ trong Java Delegate có thể tham gia vào cùng một giao dịch với engine, đảm bảo tính nguyên tử (all-or-nothing). | Phức tạp khi vận hành: Cấu hình, nâng cấp, và giám sát engine đều nằm trong ứng dụng, gây khó khăn cho đội vận hành (Ops). |
| Độ trễ thấp: Giao tiếp giữa code ứng dụng và engine diễn ra trong bộ nhớ (in-memory), rất nhanh chóng. | Cạnh tranh tài nguyên: Engine và ứng dụng chia sẻ chung CPU, RAM. Một quy trình nặng có thể làm chậm toàn bộ ứng dụng. |
| Phụ thuộc công nghệ: Việc sử dụng Java Delegate buộc logic nghiệp vụ của bạn phải được viết bằng Java (hoặc ngôn ngữ trên JVM). |
Mô hình Remote Engine
| Ưu điểm (Pros) | Nhược điểm (Cons) |
|---|---|
| Vận hành độc lập: Engine là một thành phần hạ tầng riêng biệt. Việc nâng cấp, vá lỗi, hay scale engine không ảnh hưởng đến các ứng dụng nghiệp vụ. | Độ trễ mạng: Mọi tương tác với engine đều phải thông qua mạng, làm tăng độ trễ so với gọi in-memory. |
| Đa ngôn ngữ (Polyglot): Các worker có thể được viết bằng bất kỳ ngôn ngữ nào (Java, Python, C#, Node.js,...) miễn là có thể giao tiếp qua API (ví dụ: External Task Pattern). | Giao dịch phân tán (Distributed Transactions): Không thể có giao dịch nhất quán giữa worker và engine. Phải sử dụng các pattern phức tạp hơn như Saga để đảm bảo tính nhất quán dữ liệu. |
| Phân tách rõ ràng: Tách biệt logic quy trình (do engine quản lý) và logic nghiệp vụ (do các worker thực thi). Phù hợp với kiến trúc microservices. | Phức tạp khi phát triển cục bộ: Developer cần chạy engine như một dịch vụ riêng (ví dụ: qua Docker) trong môi trường phát triển của mình. |
| Khả năng mở rộng độc lập: Bạn có thể scale engine và các worker một cách riêng biệt tùy theo tải. |
Để hình dung rõ hơn, hãy xem sơ đồ kiến trúc sau. Nó minh họa cách một ứng dụng Spring Boot có thể được cấu trúc trong cả hai mô hình.

3. Central (Tập trung) vs. Decentralized (Phi tập trung)
Câu chuyện "embedded vs. remote" còn liên quan mật thiết đến một quyết định kiến trúc lớn hơn trong bối cảnh microservices: bạn nên chạy một engine tập trung cho toàn bộ hệ thống, hay mỗi microservice nên có một engine phi tập trung của riêng nó?
Bernd Rücker, đồng sáng lập Camunda, đã phân tích rất rõ các lựa chọn này.
The Microservices Workflow Automation Cheat Sheet - berndruecker
Bài viết "The Microservices Workflow Automation Cheat Sheet" sẽ mở rộng góc nhìn của bạn ra ngoài hai mô hình cơ bản, đặt chúng vào bối cảnh kiến trúc microservices.
Hãy đọc phần "Central or decentralized workflow engine?". Tập trung vào việc hiểu 3 lựa chọn kiến trúc được đề xuất và ưu/nhược điểm của chúng.
Dưới đây là tóm tắt các mô hình đó:
-
Decentralized Engines (Engine phi tập trung):
- Mô tả: Mỗi microservice cần điều phối luồng nghiệp vụ sẽ nhúng (embed) một workflow engine của riêng nó. Đây là hiện thân của mô hình embedded trong thế giới microservices.
- Ưu điểm: Tự chủ (autonomy) và cô lập (isolation) tối đa cho các đội phát triển.
- Nhược điểm: Tăng gánh nặng vận hành (mỗi đội phải tự quản lý engine của mình), khó khăn trong việc giám sát tổng thể các luồng end-to-end.
-
One Central Engine (Một Engine tập trung):
- Mô tả: Cả hệ thống chỉ sử dụng một workflow engine duy nhất, chạy như một dịch vụ độc lập. Các microservices kết nối đến engine này để thực thi quy trình. Đây chính là mô hình remote.
- Ưu điểm: Dễ vận hành, có công cụ giám sát tập trung (như Cockpit), phù hợp khi engine đóng vai trò phân phối công việc (work distribution).
- Nhược điểm: Giảm sự cô lập giữa các microservice, engine trở thành một điểm lỗi trung tâm (single point of failure) và có thể là một nút thắt cổ chai về hiệu năng.
-
Central Engine, used like Decentralized ones (Engine tập trung, dùng như phi tập trung):
- Mô tả: Đây là một mô hình lai thú vị của Camunda 7. Nhiều microservice cùng nhúng (embed) engine, nhưng tất cả chúng đều kết nối vào cùng một cơ sở dữ liệu trung tâm.
- Ưu điểm: Có được công cụ giám sát tập trung (vì tất cả dữ liệu đều ở một nơi) mà không cần một server engine riêng.
- Nhược điểm: Vẫn có sự khớp nối ở tầng dữ liệu. Các microservice phải thống nhất phiên bản engine và cấu trúc database.
Khuyến nghị: Bernd Rücker có xu hướng ủng hộ mô hình phi tập trung vì nó phù hợp với triết lý của microservices. Tuy nhiên, mô hình tập trung lại rất hợp lý cho các công ty nhỏ hơn, nơi gánh nặng vận hành là một yếu tố quan trọng.
4. Hướng tới Tương lai: Kiến trúc của Camunda 8
Sự dịch chuyển sang mô hình remote không chỉ là một lựa chọn, mà còn là một xu hướng tất yếu, đặc biệt khi nói đến các hệ thống quy mô lớn, hiệu năng cao. Camunda Platform 8 và engine Zeebe của nó được thiết kế hoàn toàn dựa trên triết lý này.
Zeebe không sử dụng cơ sở dữ liệu quan hệ truyền thống để lưu trạng thái. Thay vào đó, nó sử dụng một kiến trúc event log phân tán, được tối ưu hóa cho thông lượng cao và khả năng chịu lỗi.
Để hiểu tại sao kiến trúc này lại có khả năng mở rộng vượt trội so với kiến trúc truyền thống, hãy xem video sau từ một hội thảo của Camunda.
Scaling a distributed workflow engine (CamundaCon 2019)
Video "Scaling a distributed workflow engine" giải thích các nguyên tắc thiết kế đằng sau Zeebe (engine của Camunda 8), giúp bạn hiểu rõ sự khác biệt kiến trúc cốt lõi so với Camunda 7.
Hãy xem các đoạn sau: 01:00 - 01:36: Vấn đề của kiến trúc engine truyền thống (chính là mô hình của Camunda 7). 01:36 - 02:57: Giới thiệu về kiến trúc của Zeebe. 07:10 - 09:47: Giải thích cách Zeebe mở rộng theo chiều ngang (horizontal scaling) thông qua các partition. 09:47 - 12:41: Giải thích cách Zeebe đảm bảo khả năng chịu lỗi (fault tolerance) thông qua replication.
Video này cho thấy rõ mô hình remote của Camunda 8 không chỉ đơn giản là "chạy engine trên một server khác", mà là một cuộc cách mạng về kiến trúc, được xây dựng từ đầu cho các ứng dụng đám mây (cloud-native) và microservices.

Tổng kết
Bài học hôm nay đã trang bị cho bạn một cái nhìn tổng quan và sâu sắc về các lựa chọn kiến trúc khi triển khai một workflow engine. Các điểm chính cần ghi nhớ:
- Mô hình Embedded: Đơn giản để bắt đầu, giao dịch nhất quán, nhưng khớp nối chặt và khó vận hành/mở rộng độc lập. Phù hợp cho các ứng dụng đơn khối (monolith) hoặc khi bắt đầu một dự án nhỏ.
- Mô hình Remote: Linh hoạt, đa ngôn ngữ, dễ vận hành và scale, nhưng đi kèm với độ trễ mạng và sự phức tạp của giao dịch phân tán. Đây là lựa chọn mặc định cho kiến trúc microservices.
- Việc lựa chọn giữa Centralized và Decentralized engine phụ thuộc vào quy mô tổ chức, văn hóa DevOps và yêu cầu về sự tự chủ của các đội nhóm.
- Camunda 8 (Zeebe) đại diện cho thế hệ engine remote hiện đại, được thiết kế cho khả năng mở rộng và chịu lỗi ở quy mô lớn, là một minh chứng cho xu hướng của ngành.
Xem trước bài học tiếp theo
Sau khi đã khám phá các kiến trúc ở tầm vĩ mô, trong bài học tiếp theo, chúng ta sẽ quay trở lại với việc thiết kế quy trình. Cụ thể, bạn sẽ học cách "Thiết kế quy trình có thể tái sử dụng bằng Sub-processes và Call Activities". Đây là một kỹ thuật mô hình hóa cực kỳ quan trọng để quản lý sự phức tạp, chia nhỏ các quy trình lớn và thúc đẩy việc tái sử dụng logic nghiệp vụ, dù bạn đang làm việc trên kiến trúc nào đi nữa.