Giữa bước kích hoạt và bước hành động, công cụ kéo thả có một nhóm khối không làm việc ở ứng dụng nào mà chỉ xử lý dữ liệu đang chạy trong luồng: lọc để quyết có đi tiếp không, rẽ nhánh để chọn đường, định dạng để đổi dạng dữ liệu, chờ để hoãn, lặp để làm từng phần tử, và gom để gộp nhiều phần tử thành một. Sáu khối này có mặt dưới tên gọi này hay tên gọi khác ở gần như mọi nền tảng.
Dùng đúng, chúng biến một luồng hai bước đơn giản thành quy trình xử lý được các trường hợp thật. Dùng sai, chúng là nguồn gốc của phần lớn lỗi khó dò: đơn bị lọc nhầm, nhánh không bao giờ chạy, ngày lệch, vòng lặp tiêu hết lượt. Bài này đi qua từng khối theo cách nhìn của người dựng luồng, kèm những lỗi hay gặp ở mỗi khối.
Khối lọc: cửa chặn đầu tiên
Làm gì. Kiểm một hoặc vài điều kiện trên dữ liệu đang chạy; thoả thì đi tiếp, không thoả thì dừng lặng lẽ ở đó. Ví dụ: chỉ đi tiếp khi đơn có trạng thái đã thanh toán, hoặc khi email đến từ tên miền của khách hàng doanh nghiệp.
Đặt ở đâu. Càng sớm càng tốt, thường ngay sau kích hoạt. Lọc sớm vừa tiết kiệm lượt chạy ở nhiều nền tảng, vừa giúp các bước sau không phải xử lý dữ liệu không liên quan.
Lỗi hay gặp. So sánh chữ có phân biệt hoa thường hay không: "Đã thanh toán" khác "đã thanh toán". So sánh số mà dữ liệu lại là chữ: "1.000.000" dạng chữ không lớn hơn "500000" theo cách bạn nghĩ. Điều kiện "và" với "hoặc" bị đặt lẫn, khiến bộ lọc chặn gần hết hoặc cho qua gần hết.
Cách kiểm. Chạy thử với ít nhất một bản ghi phải qua và một bản ghi phải bị chặn. Chỉ thử bằng bản ghi phải qua là chưa kiểm được bộ lọc.
Khi nào không nên dùng. Khi ứng dụng nguồn đã có sự kiện kích hoạt hẹp hơn đúng ý bạn. Chọn kích hoạt "đơn đã thanh toán" thay vì kích hoạt "đơn mới" kèm bộ lọc, vừa gọn vừa ít chỗ sai.
Khối rẽ nhánh: một sự kiện, nhiều con đường
Rẽ nhánh chia luồng thành nhiều đường, mỗi đường có điều kiện riêng. Ví dụ giả định ở một cửa hàng phụ kiện điện thoại tại Hải Phòng: đơn giao nội thành đi nhánh báo cho người giao tại chỗ, đơn tỉnh khác đi nhánh tạo vận đơn, đơn có ghi chú xuất hoá đơn công ty đi thêm nhánh báo kế toán. Ở nền tảng dạng sơ đồ, nhánh hiện rõ thành các đường tách ra; ở nền tảng dạng từng bước, nó thường là một khối có nhiều đường bên trong.
Câu hỏi quan trọng nhất khi dựng rẽ nhánh là: các nhánh loại trừ nhau hay có thể chạy cùng lúc. Có nền tảng chạy mọi nhánh thoả điều kiện, có nền tảng chỉ chạy nhánh đầu tiên thoả. Đơn tỉnh khác có ghi chú xuất hoá đơn, nếu chỉ chạy nhánh đầu, sẽ không bao giờ tới tay kế toán. Đọc cách nền tảng của bạn xử lý, rồi thử bằng bản ghi thoả hai điều kiện cùng lúc.
Luôn có một nhánh dự phòng cho trường hợp không khớp điều kiện nào. Nhánh này có thể chỉ gửi một tin báo cho người phụ trách: có một đơn không thuộc nhánh nào, xem tay. Không có nhánh dự phòng, đơn kiểu mới (ví dụ khách nhận tại cửa hàng) sẽ rơi khỏi luồng mà không ai biết. Và nếu luồng có từ năm nhánh trở lên, dừng lại tự hỏi: có nên tách thành nhiều luồng nhỏ, mỗi luồng một việc, cho dễ đọc và dễ sửa không.
Khối định dạng: sửa dữ liệu cho vừa ô
Dữ liệu từ ứng dụng nguồn hiếm khi có đúng dạng mà ứng dụng đích cần. Khối định dạng (có nơi gọi là biến đổi, chuyển đổi) làm phần sửa này. Các việc hay gặp nhất:
| Việc | Ví dụ giả định | Chỗ dễ sai |
|---|---|---|
| Đổi định dạng ngày | Ngày kiểu quốc tế kèm giờ thành ngày/tháng/năm | Lệch múi giờ làm ngày nhảy sang hôm sau |
| Đổi dạng số và tiền | Chữ "1.250.000 đ" thành số 1250000 | Dấu chấm và phẩy ngăn nghìn khác nhau theo vùng |
| Tách và ghép chữ | Tách họ tên thành họ và tên; ghép mã tỉnh với mã đơn | Tên tiếng Việt có tên đệm, tách theo khoảng trắng đầu tiên là sai |
| Viết hoa, viết thường, bỏ khoảng trắng thừa | Chuẩn hoá email trước khi so khớp | Bỏ dấu tiếng Việt khi không cần |
| Tra bảng giá trị | Mã tỉnh thành tên tỉnh, mã sản phẩm thành nhóm hàng | Bảng tra cũ, thiếu giá trị mới |
| Giá trị mặc định khi ô trống | Ghi "chưa có" khi khách không điền ghi chú | Bỏ trống khiến bước sau báo lỗi |
Nguyên tắc: định dạng ngay trước bước cần dữ liệu đó, và đặt tên rõ cho kết quả của khối định dạng. Khi luồng có ba khối định dạng liên tiếp không tên, sau vài tháng không ai còn nhớ khối nào đổi cái gì. Với bước AI trích thông tin, phần định dạng kết quả trả về thuộc danh mục bước AI trong luồng.
Khối chờ: hoãn cho đúng lúc
Khối chờ dừng luồng một khoảng rồi chạy tiếp, hoặc chờ tới một thời điểm cụ thể. Nó dùng cho các việc như nhắc khách đánh giá ba ngày sau khi giao, gửi thư chào mừng thứ hai một tuần sau khi đăng ký, hoặc chờ tới tám giờ sáng mới báo đơn đặt lúc nửa đêm. Không có khối chờ, những việc này phải làm bằng luồng định kỳ quét bảng, phức tạp hơn nhiều.
Điểm cần biết là mỗi nền tảng có giới hạn thời gian chờ tối đa, và một số gói không cho chờ lâu. Luồng đang chờ cũng là luồng dễ tổn thương: nếu bạn sửa hoặc tắt luồng trong lúc có hàng trăm lượt đang chờ, tuỳ nền tảng, các lượt đó có thể chạy theo phiên bản cũ, chạy theo phiên bản mới, hoặc bị huỷ. Kiểm cách xử lý trước khi sửa luồng có khối chờ dài.
Một lỗi tinh tế: khối chờ không biết tình hình đã thay đổi. Khách huỷ đơn trong ba ngày chờ vẫn nhận tin xin đánh giá. Vì vậy sau khối chờ dài nên có một bước kiểm lại trạng thái hiện tại (đơn còn hiệu lực không, khách đã đánh giá chưa) rồi mới hành động.
Khối lặp và khối gom: xử lý danh sách
Khối lặp tách danh sách thành từng phần tử. Một đơn có năm sản phẩm, khối lặp cho các bước sau chạy năm lần, mỗi lần một sản phẩm, để ghi năm dòng vào bảng kho. Một thư có ba tệp đính kèm, khối lặp cho bước lưu tệp chạy ba lần.
Khối gom làm ngược lại. Gộp nhiều phần tử thành một: gom các dòng đơn trong ngày thành một bảng tóm tắt, gom tên sản phẩm thành một chuỗi cách nhau bằng dấu phẩy để gửi một tin nhắn thay vì năm.
Lặp nhân số lượt. Ở nhiều nền tảng, mỗi vòng lặp tính lượt riêng. Lặp qua hai trăm dòng mà mỗi dòng ba bước là sáu trăm lượt cho một lần chạy. Lọc danh sách trước khi lặp, và tự hỏi một khối gom có thay được vòng lặp không.
Lỗi giữa vòng lặp. Phần tử thứ bảy lỗi thì sao: dừng cả luồng, bỏ qua phần tử đó, hay thử lại? Mặc định của nền tảng có thể khác điều bạn muốn. Với danh sách quan trọng, chọn bỏ qua và ghi phần tử lỗi ra một chỗ để xử lý tay.
Lặp lồng trong lặp. Lặp qua đơn, trong mỗi đơn lặp qua sản phẩm, là chỗ luồng chậm và tốn lượt nhanh nhất. Gặp nhu cầu này nhiều, đó là dấu hiệu việc nên được làm bởi phần mềm nghiệp vụ hơn là luồng kéo thả.
Bảng tra và bảng trạng thái: khi khối xử lý cần trí nhớ
Các khối xử lý chỉ thấy dữ liệu của lần chạy hiện tại. Chúng không nhớ lần trước đã gửi tin cho khách này chưa, không biết mã sản phẩm này thuộc nhóm hàng nào nếu bạn không cho biết. Cách phổ biến để cho luồng một trí nhớ là dùng một bảng tính làm bảng trung gian, đọc và ghi vào nó như một bước trong luồng.
Bảng tra giữ những giá trị ít đổi: mã tỉnh và tên tỉnh, mã sản phẩm và nhóm hàng, nhân viên phụ trách từng khu vực. Thay vì viết hai mươi điều kiện trong khối rẽ nhánh, luồng tìm dòng tương ứng trong bảng tra rồi lấy kết quả. Khi có nhân viên mới hay khu vực mới, bạn sửa một dòng trong bảng, không phải mở luồng ra sửa.
Bảng trạng thái ghi những gì luồng đã làm: đơn nào đã báo, khách nào đã nhận tin nhắc, lần cuối gửi là khi nào. Trước khi hành động, luồng tra bảng này để tránh làm lại; sau khi hành động, ghi thêm một dòng. Đây cũng là cách đơn giản để chống chạy trùng, một lỗi có bài riêng trong danh mục vận hành. Chỉ cần nhớ: bảng trung gian chứa dữ liệu khách thì phải giới hạn người được xem như mọi bảng dữ liệu khách khác.
Ghép sáu khối thành một luồng dễ đọc
Khi luồng cần nhiều khối xử lý, thứ tự đặt chúng quyết định luồng dễ sửa hay không. Thứ tự gợi ý:
- Kích hoạt hẹp nhất có thể.
- Lọc các trường hợp không cần xử lý.
- Định dạng những trường mà mọi nhánh phía sau đều dùng.
- Rẽ nhánh theo loại việc, có nhánh dự phòng.
- Trong từng nhánh: lặp nếu cần, rồi hành động, rồi gom kết quả nếu cần báo cáo.
- Chờ ở cuối nhánh nếu có việc theo sau, kèm bước kiểm lại trạng thái.
- Đặt tên rõ cho từng khối theo việc nó làm, không để tên mặc định.
Đặt tên khối là thói quen nhỏ nhất mà đem lại nhiều nhất. Một luồng có khối tên "Lọc: chỉ đơn đã thanh toán", "Nhánh: đơn tỉnh khác" đọc được như một đoạn văn; luồng toàn tên mặc định thì chỉ người dựng hiểu, và sau ba tháng cả người dựng cũng không.
Câu hỏi thường gặp
Khối lọc và khối rẽ nhánh khác nhau thế nào?
Khối lọc chỉ có hai kết cục: đi tiếp hoặc dừng. Khối rẽ nhánh chọn giữa nhiều đường, mỗi đường làm việc khác nhau. Khi chỉ cần bỏ qua trường hợp không liên quan, dùng lọc; khi các trường hợp đều cần xử lý nhưng theo cách khác nhau, dùng rẽ nhánh.
Gói miễn phí có dùng được rẽ nhánh và lặp không?
Tuỳ nền tảng. Một số giới hạn các khối nâng cao như rẽ nhánh, lặp hoặc số bước trong luồng ở gói miễn phí. Đọc bảng so sánh gói hiện hành trước khi thiết kế luồng dựa vào những khối này.
Làm sao biết khối nào trong luồng đã chặn dữ liệu?
Mở lịch sử chạy của lần đó, xem từng bước đã nhận dữ liệu gì và dừng ở đâu. Hầu hết nền tảng ghi rõ luồng dừng ở khối lọc nào và giá trị dữ liệu lúc đó, giúp bạn thấy điều kiện sai ở đâu.
Có nên dùng bước AI để định dạng dữ liệu thay khối định dạng không?
Với việc có quy tắc rõ như đổi ngày, đổi số, tách chuỗi, khối định dạng chính xác hơn, nhanh hơn và rẻ hơn. Bước AI chỉ nên dùng cho dữ liệu lộn xộn không có quy tắc, như trích địa chỉ từ một đoạn tin nhắn tự do.
Luồng có quá nhiều khối thì làm sao cho gọn?
Tách thành nhiều luồng nhỏ, mỗi luồng một việc, nối với nhau qua một bảng tính hoặc trạng thái chung. Bỏ khối định dạng trùng lặp, đổi kích hoạt hẹp hơn để bớt bộ lọc, và đặt tên rõ cho từng khối.
Khối chờ có làm luồng tốn lượt trong lúc chờ không?
Thường thời gian chờ không tính thêm lượt, chỉ các bước chạy trước và sau mới tính. Tuy vậy mỗi nền tảng có giới hạn thời gian chờ tối đa và số lượt đang chờ, cần kiểm trong tài liệu của nền tảng bạn dùng.