Stress Test with AWS Worker

1. Mục tiêu của stress test chịu tải trong hệ thống AWS Worker và SQS

Kiến trúc AWS Worker SQS

Khi triển khai ứng dụng theo mô hình serverless (không có máy chủ cố định, AWS tự động tạo hoặc dừng worker tùy theo tải), khái niệm “chịu tải” không còn phụ thuộc vào CPU hay RAM của một máy chủ đơn lẻ.

Thay vào đó, điều quan trọng là khả năng hệ thống hấp thụ (nhận message) và xử lý (xử lý message) với khối lượng lớn dữ liệu trong môi trường phi đồng bộ thông qua hàng đợi (queue).

Mục tiêu của stress test là kiểm tra khả năng hoạt động của hệ thống khi “bơm” một lượng lớn dữ liệu vào Amazon SQS (Simple Queue Service). Cụ thể, hệ thống cần đảm bảo:

  • Xử lý toàn bộ message trong thời gian chấp nhận được.
  • Duy trì tốc độ xử lý ổn định khi tải tăng cao.
  • Tự phục hồi sau khi tải giảm.
  • Không làm quá tải các thành phần phụ trợ như cơ sở dữ liệu hoặc API backend.

2. Cấu trúc hạ tầng dùng để stress test

Dưới đây là mô hình cơ bản của một hệ thống xử lý phi đồng bộ (asynchronous) trên AWS được sử dụng cho bài kiểm thử tải:

Thành phầnVai tròGhi chú khi test
API GatewayNhận request HTTP từ công cụ test (JMeter, k6) và đẩy payload vào SQS.Bật log để theo dõi tốc độ gửi và tỉ lệ lỗi.
Amazon SQSHàng đợi trung gian chứa message cần xử lý.Dùng loại Standard Queue để đạt throughput cao nhất.
Lambda Worker / ECS WorkerĐọc message từ SQS và thực hiện xử lý nghiệp vụ.Giới hạn concurrency để tránh làm nghẽn backend.
CloudWatchThu thập log và metric hiệu năng.Theo dõi các chỉ số như queue depth, message age, invocations, throttles.
DLQ (Dead Letter Queue)Lưu trữ các message bị lỗi sau nhiều lần retry.Bắt buộc bật để không mất dữ liệu.

3. Chuẩn bị dữ liệu test

Trước khi tiến hành stress test, bạn cần chuẩn bị dữ liệu test phản ánh hành vi thực tế của hệ thống. Các tệp Excel thường được dùng để mô tả chi tiết từng kịch bản kiểm thử — ví dụ như “load test”, “spike test”, hoặc “long duration test”. Mỗi sheet trong file Excel tương ứng với một loại bài test.

Một số ví dụ về các kịch bản test cơ bản:

Tên testSố requestRamp-up time (giây)Tốc độ gửi (req/s)Mục tiêu
Load_500_6050060~8Đánh giá năng lực xử lý trung bình
Spike_2000_60200060~33Kiểm tra phản ứng khi tải tăng đột ngột
Stable_10000_30010000300~33Đánh giá độ ổn định trong thời gian dài

Ví dụ: Kết quả thực tế Case 1 (500 threads / 60 giây)

Dưới đây là kết quả kiểm thử được ghi nhận (theo file Excel và log giám sát thực tế):

Trong bài test này (Case 1), hệ thống được giả lập với 500 người dùng đồng thời trong vòng 60 giây.

Kết quả cho thấy throughput trung bình đạt khoảng 8.3 requests/giây với 100% thành công, thời gian phản hồi trung bình là 227ms và cực đại là 307ms.

Điều này cho thấy hệ thống có khả năng xử lý ổn định ở mức tải trung bình.

Jmeter

EC2

Worker

RDS

SQS

Mẫu Jmeter setting

CSV Data Set Config:
  Filename: data_test.csv
  Variable Names: message_id,payload
  Recycle on EOF: True

HTTP Body:
{
  "messageId": "${message_id}",
  "payload": "${payload}",
  "timestamp": "${__time(yyyy-MM-dd'T'HH:mm:ss)}"
}

4. Cấu hình JMeter để gửi dữ liệu lên AWS

Thread Group:
  Number of Threads (users): 500
  Ramp-up Period: 60
  Loop Count: 1

HTTP Request Sampler:
  Method: POST
  URL: https://{api-id}.execute-api.{region}.amazonaws.com/prod/push
  Body Data:
  {
    "messageId": "${__UUID()}",
    "timestamp": "${__time(yyyy-MM-dd'T'HH:mm:ss)}",
    "payload": "${__RandomString(32,ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890)}"
  }

HTTP Header Manager:
  Content-Type: application/json
  x-api-key: ${API_KEY}
jmeter -n -t HTTPRequest_500_60_001.jmx -l results.csv -JAPI_KEY=xxxx

Nếu muốn mô phỏng tải tăng dần theo thời gian, bạn có thể sử dụng plugin Stepping Thread Group trong JMeter để tạo luồng người dùng thực tế hơn.

5. Ví dụ Worker Lambda (Python)

Dưới đây là ví dụ AWS Lambda Worker cơ bản đọc message từ SQS và xử lý payload. Worker nên được thiết kế stateless (không lưu trạng thái) để có thể mở rộng song song mà không gây xung đột.

import json
def lambda_handler(event, context):
    for record in event['Records']:
        body = json.loads(record['body'])
        message_id = body.get('messageId')
        payload = body.get('payload')
        print(f"Processing message {message_id} with payload length {len(payload)}")
        process_message(payload)
def process_message(data):
    # Mô phỏng xử lý nghiệp vụ
    return True
Tham số cấu hìnhGiải thíchKhuyến nghị
BatchSizeSố lượng message Lambda đọc mỗi lần.5–10 message/lần đọc là hợp lý.
Reserved ConcurrencyGiới hạn số lượng Lambda chạy song song để bảo vệ backend.Điều chỉnh theo giới hạn DB/API.
VisibilityTimeoutThời gian message bị ẩn trước khi retry.Gấp 6 lần thời gian xử lý trung bình.
DLQHàng đợi chứa message lỗi sau nhiều lần retry.Bắt buộc bật để không mất dữ liệu.

6. Phân tích và đánh giá kết quả

Sau khi test, hãy kiểm tra log và metric từ CloudWatch hoặc JMeter để đánh giá hệ thống. Các chỉ số quan trọng bao gồm:

MetricNguồnÝ nghĩa
ApproximateNumberOfMessagesVisibleSQSSố lượng message còn trong queue. Nếu tăng liên tục → worker xử lý không kịp.
ApproximateAgeOfOldestMessageSQSTuổi của message lâu nhất trong queue. Nếu cao → hệ thống bị backlog.
Lambda Invocations / ThrottlesLambdaTheo dõi mức scale và giới hạn concurrency.
DLQ Message CountSQSSố lượng message lỗi, thể hiện độ ổn định của hệ thống.

7. Kết luận

Stress test không chỉ giúp bạn biết hệ thống chịu được bao nhiêu tải, mà quan trọng hơn — giúp bạn hiểu hệ thống phản ứng như thế nào khi tải tăng đột biến. Một hệ thống tốt không phải là hệ thống không bao giờ backlog, mà là hệ thống có khả năng backlog, mở rộng (scale up), rồi tự phục hồi (recover) an toàn.

Tài liệu tham khảo

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *