21

Được biết, AWS lambda thể tái sử dụng đầu tạo ra các đối tượng của bộ xử lý, và nó thực sự nó (xem FAQ):AWS lambda và Java đồng thời

Q: Sẽ AWS Lambda trường hợp chức năng tái sử dụng?

Để cải thiện hiệu suất, AWS Lambda có thể chọn giữ lại phiên bản chức năng của bạn và sử dụng lại để phục vụ yêu cầu tiếp theo, thay vì tạo bản sao mới. Mã của bạn không được giả định rằng điều này sẽ luôn xảy ra .


Câu hỏi đặt ra là liên quan đến Java đồng thời. Nếu tôi có lớp học cho xử lý, nói:

public class MyHandler { 
    private Foo foo; 
    public void handler(Map<String,String> request, Context context) { 
     ... 
    } 
} 

như vậy, nó sẽ được thread-an toàn để tiếp cận và làm việc với đối tượng biến foo ở đây hay không?

Nói cách khác: AWS lambda có thể sử dụng cùng một đối tượng đồng thời cho các cuộc gọi khác nhau không?

EDIT Chức năng của tôi được xử lý trên nguồn dựa trên sự kiện, cụ thể nó được gọi bằng phương pháp API Gateway.

EDIT-2 Loại câu hỏi như vậy tăng khi bạn muốn triển khai một số loại kết nối với tài nguyên bên ngoài, vì vậy tôi muốn giữ kết nối với tài nguyên bên ngoài làm biến đối tượng. Nó thực sự hoạt động như mong muốn, nhưng tôi sợ các vấn đề tương tranh.

EDIT-3 Cụ thể hơn, tôi tự hỏi: can trường hợp của bộ xử lý của AWS lambda phần đống chung (bộ nhớ) hay không? Tôi phải chỉ định chi tiết bổ sung này để ngăn chặn câu trả lời với việc liệt kê những thứ rõ ràng và phổ biến về các đối tượng an toàn thread java.

+0

IMO "giữ lại một thể hiện của chức năng của bạn và tái sử dụng nó" là chính xác giống như "sử dụng cùng một đối tượng". Và rất có thể đồng thời. – zapl

+0

@zapl Nó không có nghĩa chính xác đồng thời. Nó có thể được sử dụng như các chủ đề bên trong java 'ExecutorService' - chúng được giữ lại, nhưng không được sử dụng đồng thời – Andremoniy

+0

Chắc chắn, chúng có thể tạo ra các trình xử lý mới cho mỗi luồng hoặc đảm bảo chúng không được sử dụng đồng thời nhưng tôi không thấy nó được đề cập một cách rõ ràng ở bất kỳ đâu. Mặt khác, có những phần như * "Mã phải được viết theo kiểu" không quốc tịch "[...] hiện vật có thể không mở rộng ngoài vòng đời của yêu cầu" * trong Câu hỏi thường gặp. – zapl

Trả lời

38

Có thể AWS lambda sử dụng cùng một đối tượng đồng thời cho các cuộc gọi khác nhau không?

Trường hợp có thể xử lý AWS lambda chia sẻ đống chung (bộ nhớ) hay không?

KHÔNG, chắc chắn KHÔNG. Các cá thể của các trình xử lý AWS Lambda thậm chí không thể chia sẻ các tệp (trong /tmp).

Một thùng chứa AWS Lambda thể không được tái sử dụng cho hai hoặc đồng thời nhiều lời gọi hiện của một hàm Lambda, vì đó sẽ phá vỡ các yêu cầu cách ly:

Q: How does AWS Lambda isolate my code?

Mỗi AWS Lambda chức năng chạy trong môi trường riêng biệt của mình, với chế độ xem tài nguyên và tệp của riêng nó.

Phần "như thế nào AWS Lambda Khởi My Mã Các container mẫu?" trong mô tả chính thức của how lambda functions work trạng thái:

Sau một hàm Lambda được thực thi, AWS Lambda duy trì chứa trong một thời gian để dự đoán chức năng khác của Lambda . Trong thực tế, dịch vụ đóng băng vùng chứa sau khi chức năng Lambda hoàn thành, và làm hỏng vùng chứa để sử dụng lại, nếu AWS Lambda chọn sử dụng lại vùng chứa khi hàm Lambda được gọi lại là . Phương pháp tái sử dụng thùng chứa này có ý nghĩa sau đây:

  • Bất kỳ tờ khai trong mã chức năng Lambda của bạn vẫn khởi tạo, cung cấp thêm tối ưu hóa khi hàm được gọi một lần nữa. Ví dụ: nếu hàm Lambda của bạn thiết lập kết nối cơ sở dữ liệu , thay vì thiết lập lại kết nối, kết nối gốc được sử dụng trong các lần gọi tiếp theo. Bạn có thể thêm logic trong mã của mình để kiểm tra xem kết nối đã tồn tại chưa trước khi tạo một kết nối.

  • Mỗi vùng chứa cung cấp một số không gian đĩa trong thư mục/tmp. Nội dung thư mục vẫn còn khi vùng chứa được đóng băng, cung cấp bộ nhớ cache tạm thời có thể được sử dụng cho nhiều lần gọi. Bạn có thể thêm mã bổ sung để kiểm tra xem bộ nhớ cache có dữ liệu mà bạn đã lưu trữ hay không.

  • Quy trình nền hoặc gọi lại được khởi tạo bởi hàm Lambda không hoàn thành khi chức năng kết thúc tiếp tục nếu AWS Lambda chọn sử dụng lại vùng chứa. Bạn nên đảm bảo rằng bất kỳ nền nào trong quá trình quy trình hoặc gọi lại (trong trường hợp Node.js) trong mã của bạn hoàn tất trước khi mã thoát.

Như bạn có thể thấy, có hoàn toàn không có cảnh báo về điều kiện chủng tộc giữa nhiều lời gọi đồng thời của một hàm Lambda khi cố gắng tận dụng lợi thế của việc tái sử dụng thùng sơn. Lưu ý duy nhất là "không dựa vào nó!".

+0

Đó là câu trả lời hoàn hảo, cảm ơn rất nhiều – Andremoniy

+0

tiền thưởng sẽ được trao tặng càng sớm càng tốt SO (22 giờ còn lại) – Andremoniy