0
0
Lập trình
Admin Team
Admin Teamtechmely

Mở Rộng Carmen Cloud: Từ Containers Đến Lambda SnapStart

Đăng vào 3 tuần trước

• 4 phút đọc

Mở Rộng Carmen Cloud: Từ Containers Đến Lambda SnapStart

Tại Adaptive Recognition, chúng tôi vận hành Carmen Cloud để nhận diện biển số xe (ANPR) và nhận diện nhiều loại mã (MMR). Các hệ thống mạng nơ-ron của chúng tôi đã phát triển trong hơn 30 năm – đối với chúng tôi, "AI" là điều bình thường trong kinh doanh.

Thách Thức Thực Sự: Mở Rộng Quy Mô

Thách thức thực sự mà chúng tôi phải đối mặt là mở rộng quy mô. Trên ECS Fargate và EC2, thời gian khởi động và khởi tạo động cơ mất khoảng 60 giây. Điều này là không thể chấp nhận được trong môi trường yêu cầu hiệu suất cao.


Cách Tiếp Cận Fargate/ECS

Triển khai đầu tiên của chúng tôi hoạt động trên ECS Fargate. Đối với những khối lượng công việc có thể dự đoán, điều này thường đủ tốt. Bạn có thể định nghĩa các quy tắc mở rộng hoặc thậm chí lên lịch các tác vụ để dung lượng phù hợp với lưu lượng truy cập (ví dụ: cao hơn trong giờ làm việc, thấp hơn vào ban đêm).

Nhưng khối lượng công việc của chúng tôi lại hoàn toàn ngược lại với dự đoán. Các yêu cầu nhận diện đến từ nhiều khách hàng, ở nhiều khu vực khác nhau, vào những thời điểm gần như ngẫu nhiên. Những đợt tăng đột biến có thể xảy ra vào lúc 2 giờ sáng từ một châu lục và lại tăng cao một giờ sau từ một châu lục khác.

Với mô hình lưu lượng này, những nhược điểm của Fargate trở nên rõ ràng:

  • Thời gian trễ khi mở rộng: Khởi động EC2 + khởi tạo động cơ mất ~60 giây.
  • Chi phí không hoạt động: Giữ các container luôn trong trạng thái sẵn sàng.
  • Gánh nặng vận hành: Xây dựng/đẩy hình ảnh, vá lỗi, quản lý ECR.

Đó là khi chúng tôi bắt đầu tìm kiếm một cách tiếp cận mới.


Sự Chấp Nhận Sớm Về SnapStart

Khi AWS Lambda SnapStart (Java 21) được phát hành, chúng tôi đã di chuyển ngay lập tức. Điều này đã giúp chúng tôi trở thành một trong những đơn vị đầu tiên nhận thấy khả năng mở rộng tuyệt vời của nó – và tiết kiệm chi phí đáng kể.

Nhiều năm sau, những lợi ích đó vẫn giữ nguyên giá trị.


Sự Chuyển Đổi: API Gateway + Lambda SnapStart + CRaC

Chiêu thức chính: CRaC (Coordinated Restore at Checkpoint) khởi tạo trước động cơ của chúng tôi vào thời điểm checkpoint. Tuy nhiên, SnapStart có một giới hạn nghiêm trọng: nó không hỗ trợ >512 MB dung lượng lưu trữ tạm thời, cũng như EFS. Các động cơ nhận diện của chúng tôi cho một khu vực đơn lẻ (EUR, NAM) lớn hơn nhiều so với giới hạn đó.

Vì vậy, chúng tôi đã xây dựng một cơ chế tải động cơ theo giai đoạn:

  • Trong quá trình khởi tạo handler, chúng tôi tải một lô dữ liệu động cơ từ S3.
  • Các động cơ được khởi tạo vào bộ nhớ (thông qua lớp VehicleHandler của chúng tôi).
  • Các tệp tạm thời .dat được xóa để giải phóng không gian.
  • Lô tiếp theo được tải và khởi tạo.

Điều này giúp chúng tôi giữ dưới giới hạn 512 MB trong khi vẫn đảm bảo toàn bộ khả năng nhận diện. Việc khởi tạo trở nên phức tạp hơn, nhưng lợi ích về khả năng mở rộng và chi phí hoàn toàn xứng đáng.

java Copy
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;

public class VehicleHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent>, org.crac.Resource {

    static {
        // Tải động cơ theo lô tại thời điểm checkpoint từ S3
    }

    @Override
    public void beforeCheckpoint(org.crac.Context<? extends org.crac.Resource> ctx) throws Exception {
        // Đóng các kết nối mạng – CRaC không thể lưu trữ chúng
    }

    @Override
    public void afterRestore(org.crac.Context<? extends org.crac.Resource> ctx) throws Exception {
        // Mở lại các kết nối khi khôi phục
    }

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent input, Context context) {
        // Xử lý hình ảnh với động cơ đã chọn
        return new APIGatewayProxyResponseEvent();
    }
}

Hệ Sinh Thái Hỗ Trợ AWS

  • API Gateway – điểm truy cập
  • Lambda (SnapStart) – động cơ nhận diện
  • Cognito – xác thực người dùng
  • DynamoDB – khóa API, hồ sơ thanh toán
  • SNS/EventBridge – thanh toán không đồng bộ + sự kiện đăng ký
  • S3, SSM, CloudFront, WAF, Route53 – lưu trữ, cấu hình, phân phối, bảo mật

Những Điều Rút Ra

  1. Ngay cả các động cơ nơ-ron nặng nề cũng có thể mở rộng theo mô hình không máy chủ.
  2. CRaC làm cho SnapStart khả thi bằng cách khôi phục trạng thái đã khởi tạo trước.
  3. Đóng và mở lại các kết nối mạng là điều cần thiết.
  4. Tải theo giai đoạn giải quyết các giới hạn về lưu trữ tạm thời/EFS.
  5. Là một người chấp nhận sớm SnapStart đã giúp chúng tôi tiết kiệm cả thời gian và chi phí ngay từ ngày đầu.

👉 Tìm hiểu thêm về Carmen Cloud: carmencloud.com
👉 Trang chủ công ty: adaptiverecognition.com
👉 Dự án bên của tôi cho WordPress + đăng nhập Cognito: Gatey

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào