web-dev-qa-db-ja.com

ラムダ関数を遅延で呼び出す

このスキーマを使用して、httpリクエストを受信し、Windows ServerEC2インスタンスの下のファイルでいくつかの処理を実行します。

API Gateway -> Lambda -> EC2 (Node.js + Express)

今のところ、1日にいくつかのリクエストがありますリクエストが来るまでインスタンスは停止されます。リクエストが来ると、Lambda関数はインスタンスを開始しますが、最初のリクエストは失われます。インスタンスが実行されている場合、リクエストは転送されます。

最初のリクエストを失わないソリューションが必要です。私にはいくつかのアプローチがありますが、どれも正しいものではないようです。

1)そのリクエストをElastiCache(Redis/memcached)に保存します。 Expressサーバーの起動時に、保存されている要求があるかどうかを確認します。

2)Amazon SQSを使用してすべてのリクエストを保存します。次に、ワーカーのExpress APIを切り替えて、SQSで新しいメッセージを確認します。ほとんどの場合空になるSQSを常にチェックするので、このソリューションは好きではありません。これは高額になる可能性があると思います。

3)Lambda関数を遅延して再呼び出しします。インスタンスの準備ができたら、1分以内に同じリクエストでLambda関数をもう一度呼び出します(たとえば)。これは私の意見では今のところ最良の解決策であり、シンプルで効果的ですが、それを実装する方法がわかりません。 Lambdaの実行をスケジュールできることは知っていますが、「この関数を終日午後3時に実行する」というようなものがあり、関数を1回だけ遅らせて実行したいと思います。

私はこれに固執しています、誰かが私の考えを明確にすることができることを願っています。

1
fsinisi90

SQSソリューションを使用します。

Lambda関数が実行されたら、リクエストをSQSに保存します。

Auto Scalingを使用して、リクエストがキューに追加されたときにEC2インスタンスを起動および終了します。

EC2インスタンスで、SQSキューをポーリングして作業を確認します。リクエストを最小限に抑えることで、SQSコストを最小限に抑えることができます。

  • 長いポーリングを使用する、および/または
  • チェックの合間にスリープ状態で、1分に1回キューをチェックします。

SQSリクエストはそれほど高価ではありません。 1分に1回ポーリングすると、1か月に43,200件のリクエストが発生します。これは、毎月無料で受け取る100万件のリクエストをはるかに下回っています。無料枠でカバーされていなくても、最初の100万件のリクエストはたったの$ 0.50です。

1
Matt Houser