Hợp nhất (Join)
Bước đồng bộ hóa — chờ mọi nhánh song song của một bước Phân nhánh hoàn thành rồi mới đi tiếp, đúng một lần; và cách nối các nhánh vào nó cho đúng.
Mục đích
Bước Hợp nhất (Join) đóng vai trò một rào chắn đồng bộ. Khi một bước Phân nhánh (Fork) tách quy trình thành nhiều nhánh chạy song song, bước Hợp nhất giữ luồng lại cho đến khi tất cả các nhánh đã tới, rồi mới cho đi tiếp — và chỉ một lần duy nhất.
Chỉ bước Phân nhánh mới tạo ra các nhánh chạy song song. Một bước Quyết định (Decision) hay Công việc người dùng (Human task) có nhiều cạnh đi ra vẫn chỉ đi theo một nhánh mỗi lần — đó là các nhánh loại trừ nhau, và chúng không bao giờ cần Hợp nhất.
Bước Hợp nhất không tự động xuất hiện. Bạn thêm nó vào canvas sau các nhánh của một bước Phân nhánh. Hệ thống tự ghép mỗi Phân nhánh với bước Hợp nhất gần nhất hội tụ mọi nhánh của nó — bạn không phải khai báo cặp này.
Khi nào dùng
- Sau một bước Phân nhánh, khi bước tiếp theo cần kết quả của mọi nhánh. Ví dụ trong quy trình Đề xuất mua sắm: Trợ lý AI kiểm tra ngân sách và một người xác nhận thông số kỹ thuật chạy cùng lúc; bước Hợp nhất chờ cả hai rồi mới chuyển sang Tạo tài liệu.
- Không dùng Hợp nhất để gom các nhánh của một bước Quyết định. Các nhánh ấy loại trừ nhau, nên luôn có nhánh không bao giờ tới — và bước Hợp nhất sẽ chờ nó mãi. Muốn đưa các nhánh loại trừ nhau về một chỗ, hãy nối tất cả vào một bước thường (ví dụ Đặt biến (Set variable)): bước thường có nhiều cạnh đi vào sẽ chạy ngay khi nhánh đầu tiên tới. Một Hợp nhất không có Phân nhánh phía trước bị báo lỗi và chặn xuất bản.
Không chắc có cần Hợp nhất không? Hãy tự hỏi: "Phía trước có bước Phân nhánh không?" Có — dùng Hợp nhất. Không — dùng một bước thường để gom các nhánh.
Cài đặt chính
| Cài đặt | Bắt buộc? | Mô tả |
|---|---|---|
| Tên bước | Có | Nhãn hiển thị trên canvas. Không ảnh hưởng đến hành vi. |
Bước Hợp nhất không có cấu hình định tuyến hay điều kiện. Điều nó cần ở bạn là cách nối dây các nhánh vào nó — xem mục dưới đây.
Nối các nhánh vào Hợp nhất
Bước Hợp nhất chờ từng cạnh đi vào nó — không có thời hạn chờ, và không có chuyện "đủ rồi thì đi". Vì thế, chỉ cần một cạnh có thể không chạy trong một lượt nào đó là lượt ấy không bao giờ qua được bước Hợp nhất. Các quy tắc dưới đây tồn tại để điều đó không thể xảy ra. Trình thiết kế kiểm tra chúng ngay trong lúc bạn vẽ và báo ở dải kiểm tra cuối canvas: thông báo Loop structure not supported, gắn vào bước Phân nhánh hoặc Hợp nhất, kèm một dòng chi tiết bằng tiếng Anh nêu cạnh hay bước gây ra vấn đề.
Không nối thẳng từ Quyết định hay Công việc người dùng vào Hợp nhất. Cách vẽ tự nhiên nhất — mỗi nhánh có một bước phê duyệt, cả cạnh Phê duyệt lẫn Từ chối đều nối thẳng vào Hợp nhất — bị từ chối: người duyệt chỉ chọn một hành động, nên mỗi nhánh chỉ đi qua một trong hai cạnh, và bước Hợp nhất chờ cạnh còn lại mãi. Dòng chi tiết lúc này là … is fed directly by a conditional edge … Exclusive branches must reconverge at a plain step before the Join.
Cách vẽ đúng: một bước thường cho mỗi nhánh. Nối mọi hành động của bước phê duyệt vào cùng một bước thường — Đặt biến (Set variable) là lựa chọn tự nhiên, và có thể để trống danh sách gán — rồi chỉ nối bước đó vào Hợp nhất. Bước ấy nằm trên mọi đường đi của nhánh, nên chạy đúng một lần mỗi lượt, dù người duyệt chọn gì.
Một bước cho mỗi nhánh, không phải một bước cho mỗi hành động. Có một cách sửa trông đúng nhưng vẫn sai: đặt một bước gửi thông báo trên mỗi cạnh hành động — Phê duyệt → Báo đã duyệt → Hợp nhất, Từ chối → Báo từ chối → Hợp nhất. Hai bước này không phải là lựa chọn, nhưng mỗi lượt chỉ một trong hai chạy, nên bước Hợp nhất lại chờ bước kia. Dòng chi tiết lúc này là … may not run exactly once per region activation …. Nếu cần hai thông báo khác nhau, hãy cho cả hai cùng nối tiếp vào một bước thường, rồi mới vào Hợp nhất.
Mỗi nhánh vào Hợp nhất bằng đúng một cạnh, và các nhánh không được gặp nhau trước Hợp nhất. Nếu hai nhánh cùng dẫn tới một bước chung trước khi tới Hợp nhất, hệ thống không biết bước ấy thuộc nhánh nào (… have arms that both reach … before the Join). Các nhánh chỉ được gặp nhau bên trong một cặp Phân nhánh/Hợp nhất lồng, nằm trọn trong một nhánh.
Các lỗi còn lại cùng loại mang đúng nghĩa như tên gọi: bước Phân nhánh không có đúng một Hợp nhất hội tụ mọi nhánh của nó, hai bước Phân nhánh cùng đổ vào một Hợp nhất, hoặc một nhánh nằm trong vòng lặp nhưng đi ra ngoài vòng lặp.
Ví dụ
Trong quy trình Đề xuất mua sắm:
- Bắt đầu (Start) — người dùng điền biểu mẫu yêu cầu mua hàng.
- Phân nhánh (Fork) — tách thành hai nhánh chạy đồng thời:
- Nhánh 1: Trợ lý AI (Agent) kiểm tra ngân sách, rồi nối thẳng vào Hợp nhất.
- Nhánh 2: Công việc người dùng (Human task) xác nhận thông số kỹ thuật; cả hai hành động Xác nhận và Yêu cầu sửa đều nối vào một bước Đặt biến (Set variable), và chỉ bước đó nối vào Hợp nhất.
- Hợp nhất (Join) — đợi cả hai nhánh hoàn thành.
- Tạo tài liệu (Generate document) — xuất phiếu đề nghị mua sắm.
- Ký số (Signature) → Email → Kết thúc (End).
Bước Hợp nhất bảo đảm Tạo tài liệu chỉ bắt đầu khi cả hai nhánh đã xong, nên phiếu không bao giờ thiếu thông tin. Nhánh 1 không cần bước Đặt biến: Trợ lý AI là bước thường, luôn đi tiếp đúng một lần.
Xem thêm
- Phân nhánh (Fork) — tạo các nhánh chạy song song mà bước Hợp nhất gom lại.
- Đặt biến (Set variable) — bước thường để gom các hành động của một nhánh trước Hợp nhất.
- Quyết định (Decision) — rẽ nhánh loại trừ nhau, không dùng với Hợp nhất.
- Bảng kiểm tra — nơi các lỗi nối dây hiện ra trong lúc bạn vẽ.