Giới thiệu về chức năng của AWS Lambda
Ngày nay, được sự thúc đẩy bởi công nghệ, kiến trúc serverless đã trở nên ngày càng phổ biến đối với các công ty mong muốn việc phát triển các hệ thống có khả năng mở rộng và hiệu quả. Các dịch vụ serverless không những giảm bớt gánh nặng quản lý cơ sở hạ tầng cho các nhà phát triển, mà còn cho phép họ tập trung hơn vào việc viết và triển khai mã nguồn. Và nếu bạn đang sử dụng AWS để xây dựng hệ thống serverless, Lambda chắc chắn là một trong những dịch vụ bạn cần xem xét đầu tiên.
AWS Lambda đã trở thành một công cụ mạnh mẽ để xây dựng ứng dụng có khả năng mở rộng và tiết kiệm chi phí. Trong bài viết này, chúng ta sẽ cùng tìm hiểu để có cái nhìn tổng quan về AWS Lambda, khám phá khả năng, lợi ích và các use case có thể sử dụng.
Tổng quan AWS Lambda
Về tổng quan, AWS Lambda là một dịch vụ điện toán đám mây cho phép bạn chạy mã nguồn mà không cần tạo hoặc quản lý máy chủ. Nó cho phép bạn xây dựng ứng dụng sử dụng kiến trúc serverless, trong đó chúng ta chỉ cần tập trung duy nhất vào việc viết mã nguồn trong khi AWS giúp chúng ta quản lý cơ sở hạ tầng. Điều này có nghĩa là Lambda chạy mã nguồn của chúng ta trên một cơ sở hạ tầng tính toán có khả năng hoạt động cao và tự thực hiện tất cả các công việc quản trị tài nguyên tính toán, bao gồm bảo trì máy chủ và hệ điều hành, hiệu năng, tự động scaling và logging.
Là một dịch vụ serverless, Lambda mang lại nhiều lợi ích cho chúng ta có thể dễ dàng thấy được như:
- Khả năng mở rộng: Lambda tự động scaling dựa trên lưu lượng yêu cầu đến. AWS xử lý việc cung cấp và quản lý tài nguyên, đảm bảo rằng các hàm có thể xử lý bất kỳ khối lượng công việc nào mà không cần can thiệp thủ công.
- Hiệu quả chi phí: Với Lambda, chúng ta chỉ trả tiền cho thời gian tính toán được sử dụng bởi các hàm. Không có chi phí khi mã nguồn không chạy. Mô hình thanh toán chi tiết này giúp tối ưu hóa chi phí, đặc biệt là đối với các ứng dụng có mẫu lưu lượng không đều hoặc không thể dự đoán.
- Dễ tích hợp: Lambda tích hợp một cách mượt mà với các dịch vụ AWS khác, cho phép ta xây dựng hệ thống kiến trúc phức tạp. Chúng ta có thể kích hoạt các hàm trên Lambda dựa trên các sự kiện từ các dịch vụ như Amazon S3, Amazon DynamoDB, Amazon Kinesis và nhiều hơn nữa.
- Hỗ trợ ngôn ngữ: Lambda hỗ trợ nhiều ngôn ngữ lập trình phổ biến khác nhau như Node.js, Python, Java, C#, Ruby và Go.
Trong quá trình xây dự hệ thống với Lambda, nắm được các tính năng quan trọng (key features) sau của Lambda sẽ giúp chúng ta thiết kế hệ thống có khả năng mở rộng hơn, bảo mật hơn và hiệu quả hơn:
- Cấu hình tùy chọn: Chúng ta có thể cấu hình hàm Lambda của mình bằng cách sử dụng giao diện điều khiển hoặc AWS CLI.
- Biến môi trường: Sử dụng biến môi trường để điều chỉnh hành vi của hàm mà không cần cập nhật mã nguồn.
- Phiên bản: Quản lý triển khai các hàm một cách hiệu quả bằng cách sử dụng phiên bản. Điều này cho phép chúng ta sử dụng một hàm mới cho kiểm tra beta mà không ảnh hưởng đến người dùng phiên bản ổn định hiện tại.
- Container images: Tạo Container images cho hàm Lambda bằng cách sử dụng các images có sẵn do AWS cung cấp hoặc các nhà phát triển khác. Điều này cho phép bạn tái sử dụng container hiện có.
- Layers: Đóng gói thư viện để giảm kích thước các tệp triển khai và tăng tốc quá trình triển khai mã nguồn.
- Lambda extensions: Nâng cao các hàm Lambda bằng các công cụ giám sát, quan sát, bảo mật và quản lý.
- Function URLs: Thêm một điểm cuối HTTP(S) riêng cho hàm Lambda.
- Response streaming: Cấu hình URL hàm Lambda để truyền phản hồi trực tiếp đến khách hàng từ các hàm Node.js. Điều này cải thiện hiệu suất thời gian phản hồi hoặc cho phép trả về các phản hồi lớn hơn.
- Code signing: Xác minh rằng chỉ những nhà phát triển được phê duyệt mới có thể xuất bản mã nguồn đáng tin cậy, không bị thay đổi trong các hàm Lambda.
- Private networking: Xây dựng mạng nội bộ cho các tài nguyên như cơ sở dữ liệu, các dịch vụ AWS nội bộ.
- File system access: Cấu hình để kết nối Amazon Elastic File System (Amazon EFS) hoặc vào một thư mục nội bộ. Điều này cho phép mã nguồn truy cập và chỉnh sửa các tài nguyên chia sẻ một cách an toàn với độ tương đồng cao.
- Lambda SnapStart cho Java: Nâng cao hiệu suất khởi động Java runtime lên tới 10 lần không tốn thêm bất kỳ chi phí nào mà không cần thay đổi mã nguồn.
Use cases
Có rất nhiều trường hợp cần sử dụng (use case) Lambda tùy thuộc vào yêu cầu của dự án và ứng dụng. Dưới đây là một số ví dụ:
- Xử lý sự kiện bất đồng bộ: Lambda cho phép ta xử lý các sự kiện bất đồng bộ từ các nguồn khác nhau như hệ thống nhắn tin, cơ sở dữ liệu, hàng đợi sự kiện và hơn thế nữa. Chúng ta có thể tận dụng tính năng này để xây dựng các ứng dụng thời gian thực, xử lý dữ liệu trực tuyến và kết hợp các dịch vụ AWS khác.
- Xây dựng các ứng dụng web và di động không máy chủ: Lambda có thể được sử dụng để xây dựng các API không máy chủ, xử lý yêu cầu HTTP và cung cấp dữ liệu cho ứng dụng web và di động. Bằng cách kết hợp với các dịch vụ như Amazon API Gateway, chúng ta có thể tạo ra các ứng dụng không máy chủ hoàn chỉnh mà không cần quản lý cơ sở hạ tầng.
- Xử lý dữ liệu và xử lý batch: Lambda cung cấp khả năng xử lý dữ liệu và xử lý batch mạnh mẽ. Chúng ta có thể sử dụng nó để xử lý dữ liệu đầu vào, trích xuất thông tin, tính toán và ghi kết quả vào cơ sở dữ liệu hoặc hệ thống lưu trữ khác. Điều này rất hữu ích khi ta cần thực hiện các công việc xử lý lớn mà yêu cầu khả năng mở rộng linh hoạt.
- Xây dựng hệ thống xử lý luồng sự kiện: Lambda có thể được sử dụng để xây dựng các hệ thống xử lý luồng sự kiện phức tạp. Bằng cách kết hợp với các dịch vụ như Amazon Kinesis, ta có thể xử lý và phân tích dữ liệu luồng liên tục từ các nguồn như log hệ thống, dữ liệu IoT hoặc dữ liệu từ ứng dụng di động.
Ví dụ, hãy xem xét tình huống chúng ta cần phát triển một mạng xã hội sử dụng các dịch vụ AWS, có Django (Python) làm framework backend và AWS S3 để lưu trữ các file như ảnh của người dùng. Khi người dùng tải lên hình ảnh mới, việc tạo ra thumbnail cho những hình ảnh này đòi hỏi tài nguyên tính toán đáng kể. Vì vậy, làm thế nào chúng ta có thể triển khai tính năng này một cách hiệu quả?
Phương pháp đơn giản nhất là gọi trực tiếp hàm tạo thumbnail trong hàm tải lên hình ảnh. Tuy nhiên, phương pháp này có nhược điểm. Nó không chỉ làm người dùng phải chờ hàm tạo thumbnail hoàn thành trước khi nhận được phản hồi trả về, mà còn ảnh hưởng tiêu cực đến hiệu suất và khả năng của máy chủ web. Để tối ưu quá trình này, chúng ta cần một hệ thống xử lý công việc phân tán (distributed task-processing system), nơi nhiệm vụ tạo thumbnail được đăng ký chạy thay vì được thực thi ngay khi người dùng tải lên. Các nhiệm vụ này sau đó có thể được thực thi trên các máy riêng biệt để tránh các vấn đề rủi ro với máy chủ web.
Nếu bạn quen thuộc với Django, Celery thường được coi là giải pháp tốt nhất. Phương pháp này bao gồm hai thành phần mới: một Celery broker, nơi các task được lưu trữ, và các Celery worker, chúng nhận task từ broker và có thể xử lý chúng trên các máy riêng biệt. Mặc dù Celery tích hợp với Django được sử dụng rộng rãi, nhưng vẫn cần xây dựng và quản lý các cấu hình khác nhau. Ngoài ra, broker và worker đòi hỏi phải hoạt động liên tục (24/7) để đảm bảo rằng các task được đăng ký mới được thực thi, ngay cả khi không có người dùng trực tuyến vào thời điểm đó.
Trong khi đó, nếu thay thế bằng cách sử dụng AWS Lambda sẽ giúp tiết kiệm chi phí một cách đáng kể. Trong hệ thống của chúng ta, khi người dùng tải lên hình ảnh, hình ảnh được lưu trữ trong một bucket AWS S3. Nhiệm vụ duy nhất còn lại là cấu hình kích hoạt Lambda chạy hàm tạo thumbnail mỗi khi có sự kiện rằng bucket S3 nhận một ảnh mới từ người dùng. Để tránh vòng lặp vô hạn, các thumbnail mới được tạo ra cần được tải lên một bucket S3 khác.
Bằng cách tận dụng AWS Lambda, chúng ta có thể đạt được hiệu quả cho chức năng tạo thumbnail với khả năng mở rộng cao và tiết kiệm chi phí. Điều này loại bỏ nhu cầu quản lý các máy riêng biệt và đảm bảo sử dụng tài nguyên tối ưu. Với khả năng tự động mở rộng và mô hình trả theo nhu cầu của Lambda, chúng ta có thể tạo ra các thumbnail một cách hiệu quả mà không cần lo lắng về các hạn chế về mặt khả năng hoặc phải chịu các chi phí không cần thiết.
Lưu ý khi sử dụng Lambda
Mặc dù AWS Lambda mang lại nhiều lợi ích, nhưng cũng có những giới hạn mà chúng ta cần phải lưu ý. Dưới đây là một số giới hạn quan trọng của AWS Lambda:
- Thời gian thực thi: Các hàm AWS Lambda có giới hạn thời gian thực thi tối đa, tùy thuộc vào môi trường thực thi. Ví dụ, thời gian chờ mặc định cho một hàm Lambda là 3 giây, nhưng có thể tăng lên tối đa 900 giây (15 phút). Các quy trình chạy lâu hơn giới hạn này có thể không phù hợp cho các hàm Lambda.
- Bộ nhớ và không gian lưu trữ: Các hàm Lambda có giới hạn bộ nhớ từ 128 MB đến 10.240 MB (10 GB). Số lượng bộ nhớ được cấp phát cũng xác định sức mạnh CPU có sẵn cho hàm. Ngoài ra, các hàm Lambda có không gian lưu trữ tạm thời (/tmp directory) từ 512 MB đến 10.240 MB. Nếu hàm của bạn yêu cầu nhiều bộ nhớ hoặc không gian đĩa hơn, bạn có thể cần xem xét các giải pháp thay thế.
- Kích thước gói tối đa: Gói triển khai (file ZIP hoặc JAR) cho một hàm Lambda có giới hạn kích thước là 250 MB (chưa nén). Nếu hàm và các phụ thuộc của nó vượt quá giới hạn này, bạn có thể cần xem xét các chiến lược triển khai thay thế, chẳng hạn như sử dụng các dịch vụ dựa trên container như AWS Fargate hoặc AWS Elastic Beanstalk.
- Stateful Operations: AWS Lambda được thiết kế stateless, có nghĩa là mỗi lần gọi hàm là độc lập và không giữ lại bất kỳ trạng thái nào giữa các lần gọi. Mặc dù bạn có thể lưu trữ dữ liệu bên ngoài trong các dịch vụ như Amazon S3 hoặc cơ sở dữ liệu, các hàm Lambda không cung cấp cơ chế tích hợp sẵn để duy trì trạng thái trong hàm.
- Cold Start và Request Spikes: Khi một hàm Lambda được gọi, nó có thể gặp phải Cold Start nếu các máy tại không có khả năng xử lý yêu cầu. Cold Start có thể tạo ra độ trễ khi AWS triển khai một máy mới để thực thi hàm. Ngoài ra, sự tăng đột ngột trong lưu lượng truy cập có thể dẫn đến số lượng yêu cầu đồng thời vượt quá giới hạn đồng thời khả dụng, gây ra việc hạn chế một số yêu cầu.
- Số lượng đồng thời tối đa: AWS Lambda áp đặt giới hạn đồng thời về số lượng hàm có thể chạy đồng thời. Giới hạn mặc định là 1.000 lần thực thi đồng thời cho mỗi tài khoản, nhưng có thể tăng lên bằng cách liên hệ với hỗ trợ của AWS. Nếu ứng dụng của bạn yêu cầu đồng thời cao hoặc gặp phải lưu lượng truy cập đột ngột, bạn có thể cần xem xét điều chỉnh giới hạn đồng thời tương ứng.
- Giới hạn tùy chọn triển khai: Mặc dù AWS Lambda cung cấp tích hợp với nhiều dịch vụ AWS, nhưng có thể có các tùy chọn tích hợp bị giới hạn với một số công cụ hoặc dịch vụ bên thứ ba. Trong một số trường hợp, bạn có thể cần phải tự xây dựng cầu nối giữa Lambda và hệ thống bên ngoài.
Việc xem xét các giới hạn này khi thiết kế và triển khai ứng dụng với AWS Lambda là rất quan trọng. Hiểu rõ những ràng buộc này sẽ giúp chúng ta đưa ra quyết định thông minh đưa các lựa chọn thay thế khi cần thiết.
Kết luận
AWS Lambda là một dịch vụ điện toán đám mây serverless mạnh mẽ giúp các nhà phát triển xây dựng ứng dụng có khả năng mở rộng và tiết kiệm chi phí. Bằng cách trừu tượng hóa việc quản lý cơ sở hạ tầng, Lambda cho phép chúng ta tập trung vào việc viết mã nguồn mang lại giá trị cho người dùng. Với sự tích hợp mượt mà với các dịch vụ AWS khác, hỗ trợ ngôn ngữ rộng rãi và khả năng mở rộng linh hoạt, Lambda mở ra các cơ hội để xây dựng kiến trúc dựa trên sự kiện và các ứng dụng thời gian thực. Cho dù bạn là một startup, doanh nghiệp nhỏ hay doanh nghiệp lớn, AWS Lambda có thể là một công cụ quý giá trong bộ công cụ tính toán đám mây. Vậy hãy nắm bắt tư duy serverless và khai thác tiềm năng toàn diện của AWS Lambda!
Tham khảo
https://docs.aws.amazon.com/lambda/latest/dg/welcome.html
https://docs.aws.amazon.com/lambda/latest/dg/with-s3-tutorial.html
https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html
https://www.cloudflare.com/learning/serverless/what-is-serverless/