Chào bạn,
Trong bài học trước, chúng ta đã khám phá các mô hình kiến trúc vĩ mô khi triển khai Camunda, so sánh giữa cách tiếp cận nhúng (embedded) và từ xa (remote). Dù bạn chọn kiến trúc nào, việc thiết kế các quy trình một cách rõ ràng, có cấu trúc và dễ bảo trì là yếu-tố-sống-còn để dự án thành công.
Hôm nay, chúng ta sẽ đi sâu vào một kỹ thuật mô hình hóa cực kỳ quan trọng giúp đạt được điều đó. Mục tiêu của bài học này là thiết kế quy trình có thể tái sử dụng bằng Sub-processes và Call Activities. Đối với một developer, bạn có thể xem đây là cách chúng ta áp dụng các nguyên tắc như DRY (Don't Repeat Yourself), module hóa và tạo ra các "hàm" hoặc "dịch vụ" có thể tái sử dụng ngay trong tầng mô hình hóa quy trình.
1. Tại sao cần tái sử dụng trong BPMN?
Khi các quy trình nghiệp vụ trở nên phức tạp, sơ đồ BPMN có thể nhanh chóng trở thành một "mớ bòng bong" khó đọc và khó bảo trì. Việc chia nhỏ quy trình thành các phần logic, dễ quản lý mang lại nhiều lợi ích:
- Tăng khả năng đọc: Sơ đồ quy trình chính trở nên gọn gàng hơn, tập trung vào luồng chính thay vì bị sa đà vào các chi tiết vụn vặt.
- Thúc đẩy tái sử dụng: Một chuỗi các bước phổ biến (ví dụ: "Xác minh thông tin khách hàng" hoặc "Tạo và gửi hóa đơn") có thể được đóng gói và tái sử dụng ở nhiều quy trình khác nhau.
- Dễ dàng bảo trì và phiên bản hóa: Bạn có thể cập nhật một quy trình con mà không cần phải triển khai lại tất cả các quy trình lớn đang gọi nó.
Trong BPMN, có hai công cụ chính để đạt được điều này: Embedded Sub-process và Call Activity. Chúng trông khá giống nhau nhưng phục vụ những mục đích rất khác nhau.
2. Embedded Sub-Process: Công cụ để gom nhóm và tạo phạm vi
Hãy bắt đầu với công cụ đơn giản hơn. Một Embedded Sub-process (Quy trình con nhúng) là một tập hợp các phần tử BPMN được chứa bên trong một quy trình cha. Nó không phải là một file .bpmn riêng biệt, mà chỉ là một "chiếc hộp" để gom nhóm các tác vụ lại với nhau.

Mục đích chính của nó là:
- Gom nhóm trực quan: Giúp sơ đồ quy trình cha dễ đọc hơn bằng cách cho phép bạn thu gọn (collapse) một nhóm các bước thành một activity duy nhất.
- Tạo phạm vi (Scoping): Tạo ra một "ranh giới" cho các sự kiện. Ví dụ, bạn có thể đính một Timer Boundary Event vào một sub-process để nói rằng "nếu nhóm công việc này không hoàn thành trong vòng 1 giờ, hãy hủy nó và đi theo một luồng khác". Toàn bộ logic bên trong sub-process sẽ bị ảnh hưởng, nhưng các phần khác của quy trình cha thì không.
Để hiểu rõ hơn về cách hoạt động và khi nào nên sử dụng Embedded Sub-process, hãy xem đoạn video sau từ chính Camunda.
BPMN Subprocesses and How to Use Them in Camunda
Video này sẽ minh họa cách tạo một Embedded Sub-process để che giấu sự phức tạp và cách nó hoạt động như một cơ chế scoping.
Hãy xem từ 00:41 đến 03:44. Tập trung vào cách người trình bày gom một nhóm các task vào một sub-process và sau đó thu gọn (collapse) nó lại để làm cho mô hình dễ đọc hơn.
Tóm lại về Embedded Sub-process:
- Nó là một phần của quy trình cha, không thể tồn tại độc lập.
- Các biến (variables) được chia sẻ một cách tự nhiên giữa quy trình cha và quy trình con nhúng.
- Công dụng chính là để tổ chức và đơn giản hóa sơ đồ, hoặc để giới hạn phạm vi của các sự kiện. Nó không dành cho việc tái sử dụng logic trên nhiều quy trình khác nhau.
3. Call Activity: "Hàm" có thể tái sử dụng
Đây mới chính là công cụ mạnh mẽ để xây dựng các quy trình module hóa. Một Call Activity là một activity trong quy trình cha, có chức năng gọi và thực thi một quy trình khác, vốn được định nghĩa và triển khai hoàn toàn độc lập.
Hãy hình dung Call Activity như một lời gọi hàm hoặc một lệnh gọi API trong code của bạn. Quy trình cha "gọi" một quy trình con, truyền vào một số tham số (input variables), chờ nó thực thi xong và có thể nhận lại kết quả (output variables).

Video bạn đã xem ở phần trước cũng giải thích rất rõ về Call Activity. Hãy xem tiếp phần còn lại.
BPMN Subprocesses and How to Use Them in Camunda
Phần tiếp theo của video sẽ so sánh trực tiếp Call Activity với Embedded Sub-process và chỉ ra lý do tại sao nó là lựa chọn tốt hơn cho việc tái sử dụng.
Hãy xem từ 03:44 đến 09:18. Chú ý đến các điểm sau: Tại sao Call Activity lại cần thiết khi một logic cần được sử dụng ở nhiều nơi. Cách tạo một file .bpmn riêng cho quy trình con và liên kết nó từ quy trình cha. Cách cấu hình truyền biến (variable mapping) đầu vào và đầu ra. Khái niệm về 'Binding' (latest, deployment) để quản lý phiên bản.
Cấu hình kỹ thuật của Call Activity
Là một developer, bạn cần nắm vững các thuộc tính cấu hình của Call Activity trong Properties Panel của Camunda Modeler.
Call activities - Camunda 8 Docs
Tài liệu của Camunda cung cấp mô tả chi tiết về các tùy chọn cấu hình cho Call Activity. Mặc dù tài liệu này dành cho Camunda 8, các khái niệm cốt lõi như 'processId', 'bindingType' và 'variable mapping' gần như tương đồng với Camunda 7 mà chúng ta đang sử dụng.
Hãy đọc lướt qua tài liệu này và tập trung vào các mục sau: Defining the called process: Hiểu cách dùng processId để chỉ định quy trình con và ý nghĩa của các bindingType (latest, deployment, versionTag). Variable mappings: Nắm được cách truyền biến vào và lấy biến ra. Đây chính là 'API contract' giữa hai quy trình. XML representation: Xem qua các đoạn XML mẫu. Điều này giúp bạn hiểu cấu trúc file BPMN được sinh ra, rất hữu ích khi cần debug.
Dựa trên video và tài liệu, đây là những cấu hình quan trọng nhất:
- Called Element (
processId): Đây là thuộc tính quan trọng nhất. Bạn cần điền vào đây Process ID của quy trình con mà bạn muốn gọi. Process ID này được định nghĩa trong Properties Panel của chính file BPMN của quy trình con. - Binding: Thuộc tính này quyết định phiên bản nào của quy trình con sẽ được gọi khi có nhiều phiên bản cùng được triển khai.
latest: Luôn gọi phiên bản mới nhất.deployment: Chỉ gọi phiên bản được triển khai cùng lúc với quy trình cha.versionTag: Gọi một phiên bản cụ thể được đánh dấu bằng một tag (ví dụ: "v1.0").
- Variable Mapping (Input/Output): Đây là cách bạn kiểm soát dòng dữ liệu.
- Input: Chỉ định biến nào từ quy trình cha sẽ được "sao chép" vào quy trình con. Bạn có thể truyền tất cả (
all) hoặc chỉ định từng biến cụ thể. - Output: Chỉ định biến nào từ quy trình con sẽ được "sao chép" trở lại quy trình cha sau khi nó hoàn thành. Việc chỉ định rõ ràng các biến đầu ra là một best practice để tránh vô tình ghi đè các biến trong quy trình cha.
- Input: Chỉ định biến nào từ quy trình cha sẽ được "sao chép" vào quy trình con. Bạn có thể truyền tất cả (
Để xem một ví dụ thực tế về việc deploy và chạy một quy trình có chứa Call Activity, bạn có thể tham khảo video "Tutorial: Advanced BPMN Symbols and More" (LINK). Đoạn từ 20:57 đến 25:01 cho thấy cách quy trình cha tạm dừng ở Call Activity, một instance mới của quy trình con được tạo ra, và sau khi quy trình con hoàn tất, quy trình cha tiếp tục chạy.
4. So sánh trực tiếp: Embedded Sub-Process vs. Call Activity
Để củng cố kiến thức, hãy xem bảng so sánh sau:
| Tiêu chí | Embedded Sub-Process | Call Activity |
|---|---|---|
| Mục đích chính | Gom nhóm trực quan, tạo phạm vi cho sự kiện. | Tái sử dụng logic nghiệp vụ. |
| Định nghĩa | Là một phần của file .bpmn của quy trình cha. |
Là một file .bpmn hoàn toàn riêng biệt và độc lập. |
| Tái sử dụng | Không thể tái sử dụng ở các quy trình khác. | Có thể được gọi từ nhiều quy trình cha khác nhau. |
| Dòng dữ liệu | Chia sẻ chung bối cảnh biến với quy trình cha. | Dữ liệu phải được truyền một cách tường minh qua Input/Output Variable Mapping. |
| Triển khai | Được triển khai cùng với quy trình cha. | Có thể được triển khai và phiên bản hóa độc lập với quy trình cha. |
| Analogy trong Code | Một block code {...} trong một hàm. |
Một hàm/phương thức riêng biệt, có thể được gọi từ nhiều nơi. |
| Khi nào dùng | Khi bạn muốn làm gọn một quy trình phức tạp, hoặc áp dụng một sự kiện (vd: timeout) cho một nhóm tác vụ. | Khi bạn có một chuỗi nghiệp vụ tiêu chuẩn cần được thực hiện trong nhiều quy trình khác nhau. |
Tổng kết
Qua bài học này, bạn đã nắm được hai công cụ thiết kế mạnh mẽ trong BPMN để quản lý sự phức tạp và tăng cường khả năng tái sử dụng.
- Embedded Sub-process là công cụ để tổ chức quy trình. Hãy dùng nó khi bạn muốn gom một nhóm các bước lại với nhau để sơ đồ chính dễ đọc hơn, hoặc để tạo một phạm vi cục bộ cho các sự kiện.
- Call Activity là công cụ để tái sử dụng quy trình. Hãy dùng nó khi bạn xác định được một logic nghiệp vụ có thể được đóng gói và gọi từ nhiều quy trình khác nhau. Đây là nền tảng cho việc xây dựng một thư viện các quy trình nghiệp vụ có thể tái sử dụng.
Việc áp dụng thành thạo hai kỹ thuật này sẽ giúp bạn thiết kế những hệ thống BPMN không chỉ hoạt động đúng mà còn linh hoạt, dễ bảo trì và mở rộng trong tương lai.
Xem trước bài học tiếp theo
Khi các quy trình của bạn trở nên module hóa và phức tạp hơn với các Sub-processes và Call Activities, làm thế nào để đảm bảo chúng hoạt động chính xác? Bài học tiếp theo sẽ giải quyết chính câu hỏi này: "Implement unit testing và integration testing cho các quy trình BPMN". Chúng ta sẽ khám phá cách viết các bài test tự động cho các quy trình Camunda của mình, một kỹ năng không thể thiếu đối với mọi developer chuyên nghiệp.