Kiểm tra Stress trong Node.js

0 0 0

Người đăng: Vũ Tuấn

Theo Viblo Asia

Kiểm tra stress là một hình thức kiểm thử hiệu năng, trong đó ứng dụng được đẩy vượt quá khả năng vận hành bình thường.

Mục tiêu là xác định độ bền vững của ứng dụng, tìm ra điểm gãy, và đảm bảo rằng hệ thống có thể xử lý hoặc phục hồi một cách trơn tru dưới tải nặng.

Các lập trình viên thiết kế những bài kiểm tra này để mô phỏng các tình huống thực tế — đôi khi tập trung vào điều kiện sử dụng cực đoan (thường trong môi trường staging) để đảm bảo độ tin cậy khi triển khai thực tế.

Cấu trúc thư mục cho kiểm tra stress

Mặc dù cấu trúc thư mục có thể khác nhau giữa các nhóm phát triển, các lập trình viên thường tuân theo một số quy ước để giữ cho dự án tổ chức hợp lý:

1. Tách biệt thư mục kiểm thử

Thông thường, các bài kiểm tra stress được tách riêng khỏi kiểm thử đơn vị (unit test) và kiểm thử tích hợp (integration test). Một cách tổ chức phổ biến là tạo một thư mục chuyên biệt:

├── test/
│ ├── unit/
│ ├── integration/
│ └── stress/
│ ├── scenarios/
│ │ ├── highConcurrency.js
│ │ └── longDuration.js
│ ├── config/
│ │ └── artillery-config.yml
│ └── helpers/
│ └── loadGenerator.js

2. Thư mục Scenarios

Trong thư mục stress, thường sẽ có một thư mục con như scenarios hoặc cases, trong đó mỗi tệp đại diện cho một kịch bản tải riêng biệt — như kiểm tra đồng thời cao, tải kéo dài, hoặc bùng nổ lưu lượng.

3. Thư mục Config

Một thư mục chứa các tệp cấu hình (ví dụ: YAML hoặc JSON) để định nghĩa tham số kiểm thử (như số lượng người dùng ảo, thời lượng kiểm thử, các endpoint...).

4. Thư mục Helpers

Chứa các script hoặc thư viện hỗ trợ việc chạy kiểm thử hoặc xử lý dữ liệu đầu ra.

Các best practice và lưu ý

1. Xác định mục tiêu rõ ràng

  • Xác định rõ “stress” có nghĩa là gì đối với ứng dụng của bạn.
  • Xác định các chỉ số hiệu suất chính (KPI) như thời gian phản hồi, thông lượng, tỷ lệ lỗi, mức sử dụng tài nguyên.
  • Hiểu các chỉ số hiệu suất bình thường để dễ dàng phát hiện bất thường khi bị stress (thiết lập baseline).

2. Thiết lập môi trường kiểm thử

  • Luôn thực hiện kiểm thử stress trong môi trường tương tự production nhưng tách biệt, để không ảnh hưởng đến người dùng thực.
  • Sử dụng dữ liệu và cấu hình giống với môi trường thực tế nhất có thể.

3. Kiểm thử tăng dần

  • Bắt đầu với tải thấp và tăng dần để xác định chính xác ngưỡng mà ứng dụng bắt đầu suy giảm.
  • Sử dụng công cụ giám sát và ghi log (ví dụ: New Relic, Datadog) để quan sát hành vi hệ thống.

4. Xem xét các yếu tố bên ngoài

  • Tính đến độ trễ mạng, đặc biệt nếu ứng dụng Node.js giao tiếp với dịch vụ bên ngoài.
  • Đánh giá bộ cân bằng tải, chiến lược caching, và hiệu suất cơ sở dữ liệu.

Các kịch bản kiểm tra stress

Dưới đây là danh sách các kịch bản kiểm thử stress phổ biến, mỗi kịch bản tập trung vào một khía cạnh khác nhau của hành vi ứng dụng dưới tải nặng.

1. Kiểm tra đồng thời cao (High Concurrency Test)

  • Mô phỏng: Số lượng lớn người dùng hoặc kết nối đồng thời.
  • Mục tiêu: Đánh giá khả năng xử lý nhiều yêu cầu song song và phát hiện nút thắt cổ chai.
config: target: "http://localhost:3000" phases: - duration: 60 # Duration in seconds arrivalRate: 100 # 100 new virtual users per second
scenarios: - flow: - get: url: "/api/endpoint"

2. Kiểm tra tải kéo dài (Sustained Load Test)

  • Mô phỏng: Tải ổn định trong thời gian dài (vài phút tới vài giờ).
  • Mục tiêu: Phát hiện rò rỉ bộ nhớ, suy giảm hiệu suất theo thời gian.
config: target: "http://localhost:3000" phases: - duration: 600 # 10 minutes duration arrivalRate: 20 # Steady rate of 20 users per second
scenarios: - flow: - get: url: "/api/endpoint"

3. Kiểm tra bùng nổ lưu lượng (Burst Traffic Test)

  • Mô phỏng: Tăng đột ngột lưu lượng trong thời gian ngắn.
  • Mục tiêu: Đánh giá khả năng ứng dụng chịu tải đột ngột và phục hồi.
config: target: "http://localhost:3000" phases: - duration: 10 # Normal load phase arrivalRate: 50 - duration: 5 # Burst phase arrivalRate: 200 - duration: 10 # Post-burst cooldown arrivalRate: 50
scenarios: - flow: - get: url: "/api/endpoint"

4. Kiểm tra cạn kiệt tài nguyên (Resource Exhaustion Test)

  • Mô phỏng: Đẩy tài nguyên hệ thống như CPU, RAM, I/O lên tối đa.
  • Mục tiêu: Xác định điểm bão hòa tài nguyên và kiểm tra cơ chế bảo vệ như giới hạn tốc độ, backpressure.
config: target: "http://localhost:3000" phases: - duration: 60 arrivalRate: 10 - duration: 60 arrivalRate: 50 - duration: 60 arrivalRate: 100
scenarios: - flow: - get: url: "/api/endpoint"

5. Kiểm tra ngập lụt kết nối (Connection Flood Test)

  • Mô phỏng: Mở nhanh số lượng lớn kết nối để stress server và mạng.
  • Mục tiêu: Đánh giá cách ứng dụng xử lý nhiều socket mở, timeout hoặc lỗi.
config: target: "http://localhost:3000" phases: - duration: 30 arrivalRate: 500 # Very high arrival rate to flood with connections
scenarios: - flow: - get: url: "/api/endpoint"

6. Kiểm tra yêu cầu chậm (Slow Request - Slowloris Test)

  • Mô phỏng: Gửi yêu cầu chậm để giữ kết nối mở mà không hoàn thành.
  • Mục tiêu: Xem cách server xử lý kết nối không hoạt động và timeout.
config: target: "http://localhost:3000" phases: - duration: 60 arrivalRate: 10
scenarios: - flow: - function: "sendSlowRequest"
functions: sendSlowRequest: | function(userContext, events, done) { const http = require('http'); const options = { hostname: 'localhost', port: 3000, path: '/api/slow-endpoint', method: 'GET' }; const req = http.request(options, (res) => { res.on('data', () => {}); res.on('end', () => { done(); }); }); req.on('error', (e) => { done(e); }); // Simulate slow sending of request: write partial data then wait before finishing the request req.write('partialData'); setTimeout(() => { req.end(); }, 10000); // Delay of 10 seconds before completing the request }

7. Kiểm tra xử lý lỗi và phục hồi (Error Handling and Recovery Test)

  • Mô phỏng: Cố ý gây lỗi hoặc sự cố dịch vụ.
  • Mục tiêu: Kiểm tra khả năng ghi log lỗi, phục hồi qua cơ chế như retry, circuit breaker.
config: target: "http://localhost:3000" phases: - duration: 60 arrivalRate: 20
scenarios: - flow: - get: url: "/api/error" # This endpoint should simulate errors

8. Kiểm tra phụ thuộc dưới tải (Dependency Under Load Test)

  • Mô phỏng: Tải cao lên dịch vụ bên ngoài như database, cache, API bên thứ ba.
  • Mục tiêu: Xác định ảnh hưởng đến Node.js khi dịch vụ nền chậm hoặc không khả dụng.
config: target: "http://localhost:3000" phases: - duration: 60 arrivalRate: 50
scenarios: - flow: - get: url: "/api/dependency-endpoint"

9. Mô phỏng tấn công từ chối dịch vụ phân tán (DDoS Scenario)

  • Mô phỏng: Tràn ngập hệ thống với lượng yêu cầu cực lớn từ nhiều nguồn.
  • Mục tiêu: Đánh giá hiệu quả các biện pháp bảo vệ như giới hạn tốc độ và lọc lưu lượng.
config: target: "http://localhost:3000" phases: - duration: 30 arrivalRate: 1000 # Extreme load
scenarios: - flow: - get: url: "/api/endpoint"

Các công cụ phổ biến để kiểm tra stress Node.js

  • Artillery: Phổ biến nhờ cấu hình YAML đơn giản và dễ tích hợp với Node.js.
  • k6: Kịch bản viết bằng JavaScript, thân thiện với Node.js developers, dễ tích hợp vào CI/CD.
  • autocannon: Dùng cho benchmark nhanh, stress test endpoint đơn giản.
  • Loadtest: Có thể chạy như một phần của bộ kiểm thử, nhưng không mạnh mẽ bằng Artillery hoặc k6 cho bài test quy mô lớn.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

1 1 555

- vừa được xem lúc

Hướng dẫn làm bot Facebook messenger cho tài khoản cá nhân

Giới thiệu. Trong bài viết trước thì mình có hướng dẫn các bạn làm chatbot facebook messenger cho fanpage. Hôm nay mình sẽ hướng dẫn các bạn tạo chatbot cho một tài khoản facebook cá nhân. Chuẩn bị.

0 0 314

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 2

trong phần 1 mình đã giới thiệu về puppeteer và tạo được 1 project cùng một số file đầu tiên để các bạn có thể crawl dữ liệu từ một trang web bất kỳ. Bài này mình sẽ tiếp nối bài viết trước để hoàn thiện seri này.

0 0 77

- vừa được xem lúc

Điều React luôn giữ kín trong tim

■ Mở đầu. Ngồi viết bài khi đang nghĩ vu vơ chuyện con gà hay quả trứng có trước, mình phân vân chưa biết sẽ chọn chủ đề gì để chúng ta có thể cùng nhau bàn luận.

0 0 62

- vừa được xem lúc

Gửi Mail với Nodejs và AWS SES

AWS SES. AWS SES là gì.

0 0 87

- vừa được xem lúc

Crawl website sử dụng Node.js và Puppeteer - phần 1

Bài viết này mình sẽ giới thiệu cho các bạn craw dữ liệu của web site sử dụng nodejs và Puppeteer. .

0 0 166