2015-10-20 20 views
10

Trong trường hợp của tôi, tôi đang cố triển khai máy chủ phụ trợ chạy các phép tính tốn thời gian khá dài. Tính toán này được quản lý bởi Lambda đề cập đến một số API bên ngoài.Thông báo cho khách hàng trình duyệt khi chức năng Lambda được thực hiện bằng cách sử dụng Amazon SQS

Để giải quyết vấn đề này, tôi đang sử dụng API API của Amazon có giới hạn thực thi 10 giây. Tuy nhiên Lambda chạy khoảng 100 giây.

Để tránh giới hạn này, tôi đang sử dụng hàm Lambda thứ 2 để thực hiện phép tính tốn thời gian này & báo cáo rằng tính toán được bắt đầu.

tôi trông rất giống như thế này:

var AWS = require('aws-sdk'); 
var colors = require('colors'); 

var functionName = 'really-long' 

var lambda = new AWS.Lambda({apiVersion: '2015-03-31'}); 

var params = { 
    FunctionName: functionName, 
    InvocationType: 'Event' 
}; 


lambda.invoke(params, function(err, data) { 
    if (err) console.log(err, err.stack); // an error occurred 
    else  console.log(functionName.green + " was successfully executed and returned:\n" + JSON.stringify(data, null, 2).gray);   // successful response 
}); 

console.log("All done!".rainbow); 

Mã này được thực hiện trên AWS API Gateway bởi hàng ngàn khách hàng các trình duyệt một cách độc lập.

Để thông báo cho từng khách hàng cụ thể rằng việc thực hiện hàm Lambda của anh ta đã được thực hiện thành công, tôi đã lên kế hoạch sử dụng AWS SQS (vì bỏ phiếu dài và một số chức năng hữu ích khác trong hộp).

Vì vậy, câu hỏi của tôi là:

Làm thế nào tôi có thể xác định trên máy khách mà thông điệp trong hàng đợi thuộc về khách hàng đặc biệt này? Hoặc tôi có nên lặp qua tất cả các hàng đợi để tìm thông điệp thích hợp bởi một số tham số ID yêu cầu trong mọi trình duyệt của khách hàng không? Tôi đoán rằng phương pháp này sẽ không hiệu quả khi 1000 khách hàng sẽ đồng thời chờ kết quả của họ.


Tôi hiểu rằng tôi có thể viết kết quả cho DynamoDB ví dụ và định kỳ thăm dò ý kiến ​​DB cho kết quả thông qua một số API tự chế. Nhưng có giải pháp thanh lịch nào để thông báo cho khách hàng dựa trên trình duyệt về việc hoàn thành việc thực hiện chức năng Lambda tốn thời gian dựa trên một số giải pháp Amazon PaaS không?

Trả lời

3

Thực sự, tuyến đường DynamoDB có lẽ là đặt cược tốt nhất của bạn. Bạn có thể tạo ra một uuid trong hàm Lambda đầu tiên được API Gateway thực thi. Vượt qua uuid đó cho hàm Lambda chạy dài. Trước khi hàm thứ hai hoàn thành, nó ghi vào bảng DynamoDB với hai cột: uuidresult.

Cổng API phản hồi ứng dụng khách với uuid được tạo. Sau đó khách hàng sẽ thăm dò ý kiến ​​với yêu cầu getItem đối với bảng DynamoDB của bạn (hoặc thông qua aws-sdk trực tiếp hoặc thông qua một yêu cầu API Gateway khác). Khi nó phản hồi thành công, hãy xóa mục đã nói khỏi bảng DynamoDB.

1

Đối tượng bối cảnh của hàm lambda sẽ có ID yêu cầu AWS được trả về cho ứng dụng khách đã gọi hàm Lambda.

Vì vậy, khách hàng sẽ có ID yêu cầu lambda của Lambda 1, Lambda 1 Đối tượng bối cảnh sẽ có cùng một ID yêu cầu (không phân biệt lần thử lambda, ID yêu cầu vẫn giữ nguyên). Vì vậy, chuyển ID yêu cầu này đến Lambda 2 ở đó bằng ID yêu cầu thực tế được kết nối đến cuối.

Bỏ phiếu bằng cách sử dụng id yêu cầu từ ứng dụng khách là khá dễ dàng trên bất kỳ kho dữ liệu nào như dynamodb.

Các vấn đề liên quan