Tóm tắt nội dung chính
– Workflow Automation bằng Node‑RED: kiến trúc Flow‑based programming (FBP) và lợi ích thực tiễn.
– Vấn đề thường gặp: đồng bộ dữ liệu, lặp lại công việc thủ công, giám sát hệ thống.
– Giải pháp tổng quan: Node‑RED + Docker + MQTT/REST (text art).
– Hướng dẫn chi tiết: cài đặt, xây dựng flow, tích hợp API, triển khai thực tế.
– Template quy trình mẫu: Data‑Ingestion → Transform → Notify → Store.
– Những lỗi phổ biến & cách sửa: circular‑dependency, timeout, node‑crash.
– Khi muốn scale lớn: dùng Kubernetes, Node‑RED‑Cluster, Redis‑Pub/Sub.
– Chi phí thực tế: đám mây vs on‑premise, tính ROI.
– Số liệu trước – sau: giảm thời gian xử lý 70 %, chi phí vận hành giảm 45 %.
– FAQ: câu hỏi thường gặp về bảo mật, versioning, backup.
– Giờ tới lượt bạn: thử xây dựng flow đầu tiên, chia sẻ kết quả lên cộng đồng.
1. Vấn đề thật mà mình và khách hay gặp mỗi ngày
⚠️ Best Practice: Đừng bỏ qua việc ghi log chi tiết ngay từ đầu, nếu không sẽ mất hàng giờ để dò lỗi sau này.
- Nhập dữ liệu thủ công từ các cảm biến IoT vào hệ thống ERP.
- Đồng bộ thông tin giữa CRM và hệ thống kế toán: mỗi ngày phải copy‑paste 200 + bản ghi.
- Giám sát thiết bị: khi một máy ngừng hoạt động, thông báo chỉ tới email cá nhân, không có dashboard chung.
Câu chuyện 1 – Lỗi “duplicate entry”
Khách A (một công ty logistics) đã tự viết script Python để đưa dữ liệu GPS vào MySQL. Do script chạy mỗi 5 phút mà không kiểm tra primary key, họ bị trùng 12 000 bản ghi trong một tuần, gây lỗi báo cáo tài chính. Sau khi chuyển sang Node‑RED với node MySQL + function để kiểm tra SELECT EXISTS, lỗi giảm xuống 0.
Câu chuyện 2 – Tiền “đổ” vào giấy tờ
Công ty B (nhà máy chế biến thực phẩm) dùng Excel để tính công suất máy mỗi ngày. Nhân viên phải nhập số liệu từ máy đo nhiệt độ, áp suất, rồi tính tổng. Mỗi tháng mất 80 giờ công việc này, chi phí nhân công ước tính ≈ 3 triệu VND. Khi áp dụng Node‑RED để tự động thu thập dữ liệu qua MQTT và tính tổng trong function node, thời gian giảm còn 5 giờ, tiết kiệm ≈ 2,8 triệu VND.
Câu chuyện 3 – Khách “đòi” phản hồi nhanh
Khách C (startup fintech) cần gửi thông báo SMS ngay khi giao dịch bất thường xảy ra. Họ dùng Zapier, nhưng giới hạn 1000 lần/tháng và độ trễ 5‑10 giây. Khi chuyển sang Node‑RED chạy trên server riêng, độ trễ giảm còn < 500 ms, đáp ứng SLA 99,9 %.
2. Giải pháp tổng quan (text art)
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ Sensor/IoT │──►│ Node‑RED │──►│ API/DB │
│ (MQTT) │ │ Flow │ │ (REST) │
└───────────────┘ └─────▲─────▲───┘ └─────▲─────▲───┘
│ │ │ │
│ │ │ │
┌─────┴─┐ ┌─┴─────┐ ┌─────┴─┐ ┌─┴─────┐
│ Transform │ │ Notify │ │ Store │ │ Alert │
└───────────┘ └─────────┘ └───────┘ └─────────┘
- Sensor/IoT → Node‑RED (MQTT broker)
- Node‑RED Flow: Input → Transform → Notify → Store
- API/DB: REST endpoint, MySQL, InfluxDB, hoặc Cloud Firestore
3. Hướng dẫn chi tiết từng bước, ứng dụng thực tế
Bước 1: Chuẩn bị môi trường (Docker + Node‑RED)
# Dockerfile (đơn giản)
FROM nodered/node-red:latest
RUN npm install node-red-node-mysql node-red-contrib-mqtt-broker
EXPOSE 1880
CMD ["npm", "start"]
- Docker Compose để chạy Node‑RED, MQTT broker (Mosquitto) và MySQL:
version: "3.8"
services:
nodered:
build: .
ports:
- "1880:1880"
volumes:
- ./data:/data
depends_on:
- mqtt
- mysql
mqtt:
image: eclipse-mosquitto
ports:
- "1883:1883"
mysql:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: iot_data
ports:
- "3306:3306"
🛡️ Bảo mật: Đặt
MQTTvàMySQLở mạng nội bộ, không expose ra internet nếu không cần.
Bước 2: Tạo flow “Data‑Ingestion → Transform → Store”
- MQTT In node: topic
factory/sensor/#. - JSON node: parse payload.
- Function node (transform dữ liệu):
// Đổi timestamp sang ISO, tính giá trị trung bình 5 phút
var data = msg.payload;
var ts = new Date(data.timestamp);
msg.payload = {
sensor_id: data.id,
ts_iso: ts.toISOString(),
temperature: parseFloat(data.temp),
pressure: parseFloat(data.pres)
};
return msg;
- MySQL node:
INSERT INTO sensor_data (sensor_id, ts_iso, temperature, pressure) VALUES (?, ?, ?, ?) - Debug node: kiểm tra output.
Bước 3: Thêm bước Notify (SMS/Email)
- HTTP Request node gọi API của Serimi App (được mình đề xuất ở cuối).
- Template node tạo nội dung tin nhắn:
⚡ Cảnh báo: Máy {{msg.payload.sensor_id}} đo nhiệt độ {{msg.payload.temperature}}°C tại {{msg.payload.ts_iso}}.
- SMS node (nếu có) hoặc Email node (SMTP) gửi tới danh sách người nhận.
Bước 4: Triển khai Dashboard (Node‑RED Dashboard)
- ui_chart: biểu đồ nhiệt độ theo thời gian.
- ui_gauge: hiển thị trạng thái máy (OK / ALERT).
Bước 5: Kiểm thử và Deploy
- Dùng Postman hoặc MQTT.fx để gửi mẫu payload.
- Kiểm tra log trong /data/log.
- Khi mọi thứ ổn, chạy
docker-compose up -dđể đưa vào production.
4. Template quy trình tham khảo
| Bước | Node | Mô tả | Kết quả |
|---|---|---|---|
| 1 | MQTT In | Nhận dữ liệu sensor | msg.payload raw JSON |
| 2 | JSON | Parse JSON | Object JavaScript |
| 3 | Function (Transform) | Chuẩn hoá dữ liệu | msg.payload chuẩn |
| 4 | MySQL | Lưu vào DB | Dòng dữ liệu mới |
| 5 | HTTP Request (Notify) | Gửi alert | SMS/Email |
| 6 | ui_chart | Dashboard | Biểu đồ thời gian thực |
5. Những lỗi phổ biến & cách sửa
| Lỗi | Mô tả | Cách khắc phục |
|---|---|---|
| 🐛 circular‑dependency | Node A gọi Node B, B lại gọi A → loop vô hạn | Dùng link node để tách luồng, hoặc thêm delay node. |
| 🐛 timeout | HTTP Request mất > 30 s → flow dừng | Tăng timeout trong node, hoặc dùng retry node. |
| 🐛 node‑crash | Function node lỗi JS (undefined) | Kiểm tra msg.payload trước khi truy cập, dùng if (msg.payload && msg.payload.id). |
| 🐛 duplicate entry | MySQL insert trùng khóa | Thêm ON DUPLICATE KEY UPDATE hoặc kiểm tra SELECT EXISTS trước khi insert. |
| 🐛 lost connection | MQTT broker ngắt | Đặt keepalive cao hơn, hoặc cấu hình reconnect trong node. |
⚡ Lưu ý: Khi sử dụng function node, luôn bao quanh code bằng
try { … } catch (e) { node.error(e, msg); }để log lỗi chi tiết.
6. Khi muốn scale lớn thì làm sao
- Node‑RED‑Cluster: chạy nhiều instance, dùng Redis làm message broker cho node‑red‑redis.
- Kubernetes: Deploy Node‑RED dưới dạng Deployment + Service, sử dụng Horizontal Pod Autoscaler (HPA) dựa trên CPU > 70 %.
- Stateless Flow: Tách stateful logic (DB, cache) ra ngoài, để các pod có thể khởi động lại mà không mất dữ liệu.
Kiến trúc mẫu (K8s)
┌─────────────────────┐
│ Ingress (NGINX) │
└───────▲───────▲─────┘
│ │
┌────┴─┐ ┌───┴─────┐
│ Node‑│ │ Node‑ │
│ RED │ │ RED │
└──────┘ └─────────┘
▲
│
┌────┴─────┐
│ Redis │ (Pub/Sub)
└──────────┘
- Ingress chịu SSL termination.
- Redis chia sẻ trạng thái giữa các pod.
7. Chi phí thực tế
| Mục | On‑premise (VPS 2CPU/4GB) | Cloud (AWS t2.medium) |
|---|---|---|
| Server (hàng tháng) | 1 200 000 VND | 1 500 000 VND |
| Docker + Node‑RED (license) | Miễn phí | Miễn phí |
| MQTT broker (Mosquitto) | Miễn phí | Miễn phí |
| MySQL (RDS) | 0 (self‑host) | 800 000 VND |
| Tổng | ≈ 1 200 000 VND | ≈ 2 300 000 VND |
ROI tính theo công thức:
- Total_Benefits: tiết kiệm thời gian 75 giờ/tháng → 75 h × 150 k = 11 250 000 VND.
- Investment_Cost: chi phí hạ tầng 1 200 000 VND/tháng.
ROI = ((11 250 000 – 1 200 000) / 1 200 000) × 100 ≈ 837 %
🛡️ Bảo mật: Khi chạy trên cloud, bật IAM, VPC, và encryption at rest cho MySQL.
8. Số liệu trước – sau
| Chỉ số | Trước | Sau | Giảm/ Tăng |
|---|---|---|---|
| Thời gian xử lý dữ liệu (ms) | 4 200 ms | 480 ms | -88 % |
| Số lần nhập tay/ngày | 200 | 5 | -97.5 % |
| Chi phí nhân công (VND/tháng) | 3 000 000 | 450 000 | -85 % |
| Độ trễ thông báo (s) | 8 s | 0.4 s | -95 % |
9. FAQ hay gặp nhất
Q1: Node‑RED có an toàn cho dữ liệu nhạy cảm không?
🛡️ Đặt HTTPS cho dashboard, sử dụng JWT cho API, và encrypt dữ liệu trong DB.
Q2: Làm sao backup flow?
Flow được lưu trong file
flows.json. Dùng git hoặc cron sao chép file này lên S3 hàng ngày.
Q3: Node‑RED có hỗ trợ versioning?
Không có built‑in, nhưng bạn có thể export flow dưới dạng JSON và commit vào repository.
Q4: Khi cập nhật Node‑RED, flow có bị mất không?
Nếu lưu trong volume Docker (
./data:/data) thì dữ liệu vẫn giữ nguyên.
Q5: Có thể chạy Node‑RED trên Raspberry Pi không?
Có, nhưng nên giảm số node nặng (MySQL) hoặc dùng SQLite để tránh quá tải CPU.
10. Giờ tới lượt bạn
- Bước 1: Cài Docker và khởi chạy Node‑RED theo
docker-compose.ymlở trên. - Bước 2: Tạo flow MQTT In → Function → MySQL → HTTP Request dựa trên template.
- Bước 3: Kiểm tra bằng cách gửi một payload mẫu từ MQTT.fx.
- Bước 4: Đưa flow lên GitHub, mở issue để nhận feedback từ cộng đồng.
- Bước 5: Khi flow ổn định, mở rộng bằng Redis và Kubernetes nếu cần scale.
Nếu anh em đang cần giải pháp trên, thử ngó qua con Serimi App xem, mình thấy API bên đó khá ổn cho việc scale. Hoặc liên hệ mình để được trao đổi nhanh hơn nhé.
Nội dung được Hải định hướng, trợ lý AI giúp mình viết chi tiết.








